Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - How to send utf-8 e-mail?

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) 
like image 365
Martin Drlík Avatar asked May 06 '11 10:05

Martin Drlík


People also ask

Is Python a UTF-8?

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.


Video Answer


1 Answers

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') 
like image 106
abbot Avatar answered Oct 05 '22 01:10

abbot