¿Cómo enviar un correo electrónico utf8, por favor?
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 __name__ == "__main__":
#debug
sys.argv.append("Moje")
sys.argv.append("newsletter@example.cz")
sys.argv.append("subscriber@example.com")
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))
Producción
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)
Solución del problema
La pregunta de Martin Drlík tiene 7 años y 8 meses... Y hoy en día, gracias a los desarrolladores de Python, los problemas de codificación se solucionan con la versión 3 de Python.
En consecuencia, ya no es necesario especificar que se debe usar la codificación utf-8:
#!/usr/bin/python2
# -*- encoding: utf-8 -*-
...
part2 = MIMEText(text, "plain", "utf-8")
Simplemente escribiremos:
#!/usr/bin/python3
...
part2 = MIMEText(text, "plain")
Consecuencia final: ¡el guión de Martin Drlík funciona perfectamente bien!
Sin embargo, sería mejor usar el módulo email.parser, como se sugiere en email: Examples.
No hay comentarios:
Publicar un comentario