how to send utf8 e-mail please?
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("[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))
Output
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)
Usually this is implemented by converting the Unicode string into some encoding that varies depending on the system. Today Python is converging on using UTF-8: Python on MacOS has used UTF-8 for several versions, and Python 3.6 switched to using UTF-8 on Windows as well.
You should just add 'utf-8'
argument to your MIMEText
calls (it assumes 'us-ascii'
by default).
For example:
# -*- 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')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With