Как настроить кодировку в электронной почте с помощью smtplib в Python 2.7?

Я пишу простой smtp-отправитель с аутентификацией. Вот мой код

    SMTPserver, sender, destination = 'smtp.googlemail.com', 'user@gmail.com', ['reciever@gmail.com']
    USERNAME, PASSWORD = "user", "password"

    # typical values for text_subtype are plain, html, xml
    text_subtype = 'plain'


    content="""
    Hello, world!
    """

    subject="Message Subject"

    from smtplib import SMTP_SSL as SMTP       # this invokes the secure SMTP protocol (port 465, uses SSL)
    # from smtplib import SMTP                  # use this for standard SMTP protocol   (port 25, no encryption)
    from email.MIMEText import MIMEText

    try:
        msg = MIMEText(content, text_subtype)
        msg['Subject']=       subject
        msg['From']   = sender # some SMTP servers will do this automatically, not all

        conn = SMTP(SMTPserver)
        conn.set_debuglevel(False)
        conn.login(USERNAME, PASSWORD)
        try:
            conn.sendmail(sender, destination, msg.as_string())
        finally:
            conn.close()

    except Exception, exc:
        sys.exit( "mail failed; %s" % str(exc) ) # give a error message

он работает отлично, пока я не попытаюсь отправить символы, отличные от ascii (русская кириллица). Как определить кодировку в сообщении, чтобы она отображалась надлежащим образом? Заранее спасибо!

UPD. Я изменил код:

text_subtype = 'text'
content="<p>Текст письма</p>"
msg = MIMEText(content, text_subtype)
msg['From']=sender # some SMTP servers will do this automatically, not all
msg['MIME-Version']="1.0"
msg['Subject']="=?UTF-8?Q?Тема письма?="
msg['Content-Type'] = "text/html; charset=utf-8"
msg['Content-Transfer-Encoding'] = "quoted-printable"
…
conn.sendmail(sender, destination, str(msg))

Итак, первый раз я spectify text_subtype = 'text', а затем в заголовке я помещаю msg ['Content-Type'] = "text/html; charset=utf-8" строка. Это правильно?

обновление наконец, я решил проблему с сообщением Вы должны написать smth как msg = MIMEText (content.кодировать ('utf-8'),' plain','UTF-8')

3 ответов


from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def contains_non_ascii_characters(str):
    return not all(ord(c) < 128 for c in str)   

def add_header(message, header_name, header_value):
    if contains_non_ascii_characters(header_value):
        h = Header(header_value, 'utf-8')
        message[header_name] = h
    else:
        message[header_name] = header_value    
    return message

............
msg = MIMEMultipart('alternative')
msg = add_header(msg, 'Subject', subject)

if contains_non_ascii_characters(html):
    html_text = MIMEText(html.encode('utf-8'), 'html','utf-8')
else:
    html_text = MIMEText(html, 'html')    

if(contains_non_ascii_characters(plain)):
    plain_text = MIMEText(plain.encode('utf-8'),'plain','utf-8') 
else:
    plain_text = MIMEText(plain,'plain')

msg.attach(plain_text)
msg.attach(html_text)

Это должно дать вам правильную кодировку для текста и заголовков независимо от того, содержит ли ваш текст символы, отличные от ASCII, или нет. Это также означает, что вы не будете автоматически использовать кодировку base64 без необходимости.


вы должны закодировать свой текст сообщения с помощью UTF-8

msg = MIMEText(content.encode('utf-8'), text_subtype).

подробнее здесь: http://radix.twistedmatrix.com/2010/07/how-to-send-good-unicode-email-with.html


возможно, вам придется использовать заголовок SMTP для отправки разных наборов символов, попробуйте добавить это -

msg['Content-Type'] = "text/html; charset=us-ascii"

( изменить кодировку в соответствии с вашими потребностями )