web-dev-qa-db-fra.com

Python - Comment envoyer du courrier électronique utf-8?

comment envoyer un e-mail utf8 s'il vous plait? 

import sys
import smtplib
import email
import re

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

def sendmail(firm, fromEmail, to, template, subject, date):
    with open(template, encoding="utf-8") as template_file:
        message = template_file.read()

    message = re.sub(r"{{\s*firm\s*}}", firm, message)
    message = re.sub(r"{{\s*date\s*}}", date, message)
    message = re.sub(r"{{\s*from\s*}}", fromEmail, message)
    message = re.sub(r"{{\s*to\s*}}", to, message)
    message = re.sub(r"{{\s*subject\s*}}", subject, message)

    msg = MIMEMultipart("alternative")
    msg.set_charset("utf-8")

    msg["Subject"] = subject
    msg["From"] = fromEmail
    msg["To"] = to

    #Read from template
    html = message[message.find("html:") + len("html:"):message.find("text:")].strip()
    text = message[message.find("text:") + len("text:"):].strip()

    part1 = MIMEText(html, "html")
    part2 = MIMEText(text, "plain")

    msg.attach(part1)    
    msg.attach(part2)

    try:
        server = smtplib.SMTP("10.0.0.5")
        server.sendmail(fromEmail, [to], msg.as_string())
        return 0
    except Exception as ex:
        #log error
        #return -1
        #debug
        raise ex
    finally:
        server.quit()

if __== "__main__":
    #debug
    sys.argv.append("Moje")
    sys.argv.append("[email protected]")
    sys.argv.append("[email protected]")
    sys.argv.append("may2011.template")
    sys.argv.append("This is subject")
    sys.argv.append("This is date")


    if len(sys.argv) != 7:
        exit(-2)

    firm = sys.argv[1]
    fromEmail = sys.argv[2]
    to = sys.argv[3]
    template = sys.argv[4]
    subject = sys.argv[5]
    date = sys.argv[6]

    exit(sendmail(firm, fromEmail, to, template, subject, date))

Sortie

> Traceback (most recent call last):   
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py",
> line 69, in <module>
>     exit(sendmail(firm, fromEmail, to, template, subject, date))   
>
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py",
> line 45, in sendmail
>     raise ex
>
>   File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py",
> line 39, in sendmail
>     server.sendmail(fromEmail, [to], msg.as_string())
>
> File "C:\Python32\lib\smtplib.py",
> line 716, in sendmail
>     msg = _fix_eols(msg).encode('ascii') UnicodeEncodeError: 'ascii' codec
>
> can't encode character '\u011b' in
> position 385: ordinal not in
> range(128)
34
Martin Drlík

Vous devriez juste ajouter un argument 'utf-8' à vos appels MIMEText (il suppose que 'us-ascii' par défaut). 

Par exemple:

# -*- encoding: utf-8 -*-

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

msg = MIMEMultipart("alternative")
msg["Subject"] = u'テストメール'
part1 = MIMEText(u'\u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c\uff01\n',
                 "plain", "utf-8")
msg.attach(part1)

print msg.as_string().encode('ascii')
68
abbot

La question posée par Martin Drlík a 7 ans et 8 mois ... Et maintenant, grâce aux développeurs de Python, les problèmes d'encodage sont résolus avec la version 3 de Python.

Par conséquent, il n'est plus nécessaire de spécifier qu'il faut utiliser le codage utf-8:

#!/usr/bin/python2
# -*- encoding: utf-8 -*-
...
    part2 = MIMEText(text, "plain", "utf-8")

Nous écrirons simplement:

#!/usr/bin/python3
...
    part2 = MIMEText(text, "plain")

Conséquence ultime: le script de Martin Drlík fonctionne parfaitement bien!

Cependant, il serait préférable d’utiliser le module email.parser, comme suggéré dans email: Exemples .

0
MaxiReglisse