--- author: email: mail@petermolnar.net image: https://petermolnar.net/favicon.jpg name: Peter Molnar url: https://petermolnar.net copies: - http://web.archive.org/web/20170212090023/https://petermolnar.net/not-mime-email-python-3/ lang: en published: '2016-09-22T18:00:25+00:00' redirect: - how-to-send-utf-8-text-html-email-in-python-3-4 summary: Apparently, sending email in Python is painful. This is what I did to ease it. tags: - programming title: How to send simple UTF-8 email in Python 3.x --- **Note: some arcane and/or ancient email clients will have trouble understanding these mails due to the completely ignored encoding rules. Please take that in account when using these solutions.** ## Summary: dead simple text Just assemble the text by hand, and force send it via smtplib. `python_email.py` ``` {.python} import smtplib import os import datetime import conf """ config file; place it as conf.py host = "mail.domain.com" port = 587 tls = true username = "" password = "" sender = "XYZ <xyz@domain.com>" to = "ABC <abc@domain.com>" """ def send_email( subject, content ): """ Send a simple, stupid, text, UTF-8 mail in Python """ for ill in [ "\n", "\r" ]: subject = subject.replace(ill, ' ') headers = { 'Content-Type': 'text/html; charset=utf-8', 'Content-Disposition': 'inline', 'Content-Transfer-Encoding': '8bit' 'From': conf.sender, 'To': conf.to, 'Date': datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S %Z'), 'X-Mailer': 'python', 'Subject': subject } # create the message msg = '' for key, value in headers.items(): msg += "%s: %s\n" % (key, value) # add contents msg += "\n%s\n" % (content) s = smtplib.SMTP(conf.host, conf.port) if conf.tls: s.ehlo() s.starttls() s.ehlo() if conf.username and conf.password: s.login(conf.username, conf.password) print ("sending %s to %s" % (subject, headers['To'])) s.sendmail(headers['From'], headers['To'], msg.encode("utf8")) s.quit() ```