Отправка электронной почты Python TypeError: Ожидаемая строка или буфер - PullRequest
6 голосов
/ 30 января 2012

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

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

и вот мое определение def для отправки электронного письма:

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 = 'x@gmail.com'
toaddrs = 'xx@gmail.com'
username = 'x@gmail.com'
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

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

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

Ответы [ 2 ]

7 голосов
/ 30 января 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' не имеет атрибута" lstrip "") и изменения msg на msg.as_string(), ваш код работает для меня.

3 голосов
/ 30 января 2012

Полагаю, виновником является эта строка:

subject = 'Email from',mcusername

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

subject = 'Email from %s' % mcusername

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

...