Python发送带有"quoted-printable"的电子邮件传输编码和"utf-8"内容编码 [英] Python send email with "quoted-printable" transfer-encoding and "utf-8" content-encoding

查看:187
本文介绍了Python发送带有"quoted-printable"的电子邮件传输编码和"utf-8"内容编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

python的 email.mime 倾向于使用编码 base64 7bit us-ascii .我想使用 quoted-printable utf-8 ,因为这对于人类来说更容易阅读和调试.

python's email.mime tends to use encoding base64 or 7bit and us-ascii. I would like to use quoted-printable and utf-8 as this is easier for humans to read and debug.

当前,我的电子邮件看起来像

Currently, my emails look like

--===============6135350048414329636==
MIME-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: base64

IyEvYmluL2Jhc2gKCmZvciBpIGluIHs4Mjg4Li44N

--===============0756888342500148236==
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

happy face =E2=98=BA

我希望原始电子邮件对于人类来说更容易阅读和使用unicode.

I would like the raw email to be easier for humans to read and using unicode.

--===============5610730199728027971==
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

happy face ☺

推荐答案

简短答案

设置 content-transfer-encoding

在创建将附加到 MIMEMultipart 对象的 MIMEText 对象时,将 content-transfer-encoding 设置为值 quoted-printable ,然后执行 set_payload .操作顺序很重要.

short answer

set content-transfer-encoding

When creating the MIMEText object, which will be attached to the MIMEMultipart object, set the content-transfer-encoding to value quoted-printable first, then do set_payload. The order of operations matters.

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

# first create MIMEText, then set content-transfer-encoding, then set payload
mt = MIMEText(None, _subtype='plain')
mt.replace_header('content-transfer-encoding', 'quoted-printable')
mt.set_payload(u'happy face ☺', 'utf-8')

# create the parent email object and the MIMEMultipart extension to it
email = MIMEMultipart('mixed')
inline = MIMEMultipart('alternative')

# assemble the objects
inline.attach(mt)
email.attach(inline)

设置电子邮件字符集和各种编码

cs = charset.Charset('utf-8')
cs.header_encoding = charset.QP
cs.body_encoding = charset.QP
email.set_charset(cs)

结果

这将创建易于阅读的原始电子邮件(base64编码的文件附件除外)

Result

This creates a raw email that is human readable (except the base64 encoded file attachment)

>>> print(email)
--===============5610730199728027971==
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

happy face ☺

--===============5610730199728027971==--

--===============0985725891393820576==
Content-Type: text/x-sh
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.sh"

Zm9vYmFyc2RmYXNkZmtqaGFzZGZrbGhhc2ZrbGpoYXNma2xqaGFzZmtsaGZkYXNmCg==

--===============0985725891393820576==--


长答案

以下是更长的脚本,用于为先前的代码片段提供更多上下文.


long answer

The following is a longer script to provide more context for the prior code snippets.

此脚本将发送以UTF-8编码的 text/plain 部分.为了好玩,它还会附加一个文件.这样产生的原始电子邮件将是人类可读的(文件附件除外).

This script will send a text/plain section encoded in UTF-8. For fun, it will also attach a file. The raw email this produces will be human readable (except for the file attachment).

from __future__ import print_function

from email import charset    
from email.encoders import encode_base64
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import mimetypes

# create the parent email object
email = MIMEMultipart('mixed')
# set email charset and email encodings
cs_ = charset.Charset('utf-8')
cs_.header_encoding = charset.QP
cs_.body_encoding = charset.QP
email.set_charset(cs_)

# create the 'text/plain' MIMEText
# first create MIMEText, then set content-transfer-encoding, then set payload
mt = MIMEText(None, _subtype='plain')
mt.replace_header('content-transfer-encoding', 'quoted-printable')
mt.set_payload(u'happy face ☺', 'utf-8')

# assemble the parts
inline = MIMEMultipart('alternative')
inline.attach(mt)
email.attach(inline)

# for fun, attach a file to the email
my_file = '/tmp/test.sh'
mimetype, encoding = mimetypes.guess_type(my_file)
mimetype = mimetype or 'application/octet-stream'
mimetype = mimetype.split('/', 1)
attachment = MIMEBase(mimetype[0], mimetype[1])
attachment.set_payload(open(my_file, 'rb').read())
encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(my_file))
email.attach(attachment)

结果

这将创建易于阅读的原始电子邮件(base64编码的文件附件除外)

Result

This creates a raw email that is human readable (except the base64 encoded file attachment)

>>> print(email)
--===============5610730199728027971==
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

happy face ☺

--===============5610730199728027971==--

--===============0985725891393820576==
Content-Type: text/x-sh
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.sh"

Zm9vYmFyc2RmYXNkZmtqaGFzZGZrbGhhc2ZrbGpoYXNma2xqaGFzZmtsaGZkYXNmCg==

--===============0985725891393820576==--


(奖励)发送电子邮件

使用 smtplib ,可以通过电子邮件发送电子邮件.


(bonus) send the email

Using smtplib, the email can be emailed.

import smtplib

# set email address headers
email['From'] = 'me@email.com'
email['To'] = 'you@email.com'
email['Subject'] = 'hello'

# send the email
smtp_srv = smtplib.SMTP('localhost')
smtp_srv.set_debuglevel(True)
print(mesg_html, end='\n\n')
print(email.as_string(), end='\n\n')
smtp_srv.sendmail('me@email.com', 'you@email.com', email.as_string())
smtp_srv.quit()

这篇关于Python发送带有"quoted-printable"的电子邮件传输编码和"utf-8"内容编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆