Отправка электронной почты Python TypeError: ожидаемая строка или буфер

Хорошо, ребята, я целую вечность искал в Интернете и просто не мог найти ответ на этот вопрос. Я пробовал много предложений, но я не могу заставить его работать. Я пытаюсь отправить электронное письмо с помощью python (модули smtplib и электронной почты) и службы gmail. Вот мои импортированные пакеты:

import time, math, urllib2, urllib, os, shutil, zipfile, smtplib, sys
from email.mime.text import MIMEText

и вот мое заявление о защите для отправки электронной почты:

def sendmessage():
print('== You are now sending an email to Hoxie. Please write your username below. ==')
mcusername = str(raw_input('>> Username: '))
print('>> Now your message.')
message = str(raw_input('>> Message: '))
print('>> Attempting connection to email host...')
fromaddr = '[email protected]'
toaddrs = '[email protected]'
username = '[email protected]'
password = '1013513403'
server = smtplib.SMTP('smtp.gmail.com:587')
subject = 'Email from',mcusername
content = message
msg = MIMEText(content)
msg['From'] = fromaddr
msg['To'] = toaddrs
msg['Subject'] = subject
try:
    server.ehlo()
    server.starttls()
    server.ehlo()
except:
    print('!! Could not connect to email host! Check internet connection! !!')
    os.system('pause')
    main()
else:
    print('>> Connected to email host! Attempting secure login via SMTP...')
    try:
        server.login(username,password)
    except:
        print('!! Could not secure connection! Stopping! !!')
        os.system('pause')
        main()
    else:
        print('>> Login succeeded! Attempting to send message...')
        try:
            server.sendmail(fromaddr, toaddrs, msg)
        except TypeError as e:
            print e
            print('Error!:', sys.exc_info()[0])
            print('!! Could not send message! Check internet connection! !!')
            os.system('pause')
            main()
        else:
            server.quit()
            print('>> Message successfully sent! I will respond as soon as possible!')
            os.system('pause')
            main()

Я отлаживал так широко, как я осмелился, и получил это:

>> Login succeeded! Attempting to send message...
TypeError: expected string or buffer

Это означает, что ему удалось войти в систему, но он остановился при попытке отправить сообщение. Меня смущает то, что не указано где. Кроме того, мой код может быть не таким уж хорошим, поэтому никаких киберзапугиваний.

Любая помощь будет принята с благодарностью! Спасибо.


person CR0SS0V3R    schedule 30.01.2012    source источник


Ответы (2)


Я предполагаю, что виновником является эта строка:

subject = 'Email from',mcusername

Если вы ожидаете создать тему в виде строки, на самом деле она превращается в кортеж, потому что вы передаете два значения. То, что вы, вероятно, хотели сделать, это:

subject = 'Email from %s' % mcusername

Кроме того, для аспекта отладки... То, как вы упаковываете все свои исключения и просто печатаете сообщение об исключении, отбрасывает полезную трассировку (если она есть). Пробовали ли вы не упаковывать все, пока не узнаете конкретное исключение, которое пытаетесь обработать? Подобная всеобъемлющая обработка исключений усложняет отладку, если у вас есть синтаксические ошибки.

person jdi    schedule 30.01.2012

Линия, которая рушится,

server.sendmail(fromaddr, toaddrs, msg)

Вы даете ему две строки и экземпляр MIMEText; он хочет сообщение в виде строки. [Я думаю, что ему также нужны адреса в виде списка, но в особых случаях используется одна строка.] Например, вы можете посмотреть на пример в документации:

s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

Вы должны преобразовать MIMEText в строку, чтобы sendmail был счастлив. После исправления ошибки темы, на которую указал @jdi (которая генерирует сообщение «AttributeError: 'tuple' object has no attribute 'lstrip'») и изменения msg на msg.as_string(), ваш код работает для меня.

person DSM    schedule 30.01.2012