19

認証付きの単純なsmtp-senderを書いています。これが私のコードです

    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記号(ロシアのキリル文字)を送信しようとするまで、それは完璧に機能します。適切な方法で表示するには、メッセージで文字セットをどのように定義すればよいですか? 前もって感謝します!

アップデート。コードを変更しました:

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))

したがって、最初に text_subtype = 'text' を指定してから、ヘッダーに msg['Content-Type'] = "text/html; charset=utf-8" 文字列を配置します。それが正しいか?

更新最後に、メッセージの問題を解決しました msg = MIMEText(content.encode('utf-8'), 'plain', 'UTF-8') のように書く必要があります

4

3 に答える 3

26
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 エンコーディングを自動的に使用しないことも意味します。

于 2013-01-24T17:06:03.890 に答える
5

メッセージテキストをUTF-8でエンコードする必要があります

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

詳細はこちら: http: //radix.twistedmatrix.com/2010/07/how-to-send-good-unicode-email-with.html

于 2012-04-24T11:42:49.433 に答える
2

異なる文字セットを送信するには、SMTP ヘッダーを使用する必要がある場合があります。これを追加してみてください -

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

(必要に応じて文字セットを変更します)

于 2012-04-24T10:15:17.840 に答える