Python如何发送包含中文字符的邮件?

0 投票
1 回答
1093 浏览
提问于 2025-04-18 04:37

我的环境是python3.3.4和django1.6.2。当我在做一个django项目时,我需要通过一个邮件代理服务给我的用户发送邮件,但在使用django的send_mail时遇到了问题。所以我用python的stmplib和email库写了一个函数。代码如下:

def email_user(context):


fromEmail = 'admin@***.cn'
toEmail = ['***@qq.com']
msg = MIMEMultipart('alternative')
msg.set_charset('utf8')
msg['Subject'] = '欢迎注册心优雅社区,请激活您的账号'
msg['From'] = fromEmail
msg['To'] = ','.join(toEmail)
html = """
亲爱的%(username)s:

您好!

您在心优雅社区注册账号时使用了这个邮箱,现在您需要点击下面的链接激活该账号:

%(protocol)s://%(domain)s 

如果链接无法点击,请将它完整复制到浏览器的地址栏进行访问.

链接有效期为%(expiration_days)s天,失效后需重新注册.

如果您并未进行过此操作,那么可能是有人误用了您的邮箱,请忽略此邮件."""%context
part = MIMEText(html,'html',_charset='UTF-8')
msg.attach(part)

username = 'postmaster@***org'
password = '****'
s = smtplib.SMTP('****.com:25')
s.login(username,password)
s.sendmail(fromEmail,toEmail,msg.as_string())
s.quit()

我在python的IDLE中测试时,一切都运行得很好。但是,当我在我的django项目中调用这个函数发送邮件时,却遇到了UnicodeEncodeError的问题,让我很头疼。

'ascii' codec can't encode characters in position 439-441: ordinal not in range(128)
Unicode error hint

The string that could not be encoded/decoded was: 亲爱的

有人能帮忙吗?

1 个回答

0

这真是初学者的悲哀。当我尝试了很多来自StackOverflow或其他网站的解决方案时,这个错误还是一次又一次地出现。于是我觉得这肯定是个傻问题,就去检查有没有拼写错误。结果发现,没错,我错误地设置了MIMEText的参数。所以我把代码改成了:

MIMEText(html,'html','utf8')

现在它可以正常工作了。

撰写回答