19 Stimmen

Wie man einen Zeichensatz in E-Mail mit smtplib in Python 2.7 festlegen?

Ich schreibe einen einfachen smtp-Sender mit Authentifizierung. Hier ist mein Code

    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

Es funktioniert perfekt, bis ich versuche, Nicht-Ascii-Symbole (russisches Kyrillisch) zu senden. Wie sollte ich einen Zeichensatz in einer Nachricht definieren, damit er richtig angezeigt wird? Vielen Dank im Voraus!

UPD. Ich habe meinen Code geändert:

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

Also, das erste Mal, wenn ich spectify text_subtype = 'text', und dann in der Kopfzeile platziere ich eine msg['Content-Type'] = "text/html; charset=utf-8" String. Ist das richtig?

UPDATE Endlich habe ich mein Nachrichtenproblem gelöst Sie sollten etwas schreiben wie msg = MIMEText(content.encode('utf-8'), 'plain', 'UTF-8')

26voto

Lorcan O'Neill Punkte 3215
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)

Damit sollten Sie die richtige Kodierung für Text und Kopfzeilen erhalten, unabhängig davon, ob Ihr Text Nicht-ASCII-Zeichen enthält oder nicht. Es bedeutet auch, dass Sie nicht unnötigerweise automatisch die base64-Kodierung verwenden werden.

5voto

yablokoff Punkte 165

Sie sollten Ihren Nachrichtentext mit UTF-8 kodieren

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

Mehr dazu hier: http://radix.twistedmatrix.com/2010/07/how-to-send-good-unicode-email-with.html

2voto

Karthik Ananth Punkte 211

Möglicherweise müssen Sie einen SMTP-Header verwenden, um das Senden verschiedener Zeichensätze zu erreichen, fügen Sie Folgendes hinzu -

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

( Ändern Sie den Zeichensatz nach Ihrem Bedarf )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X