Flask-mail 批量发送 HTML 电子邮件,在 html 中使用波斯语字体
Posted
技术标签:
【中文标题】Flask-mail 批量发送 HTML 电子邮件,在 html 中使用波斯语字体【英文标题】:Flask-mail bulk HTML email sending with farsi font in html 【发布时间】:2013-11-26 06:31:52 【问题描述】:with mail.connect() as conn:
for user in selectemail:
message1 = request.form['htmltext']
sender='garni.kh@gmail.com'
subject = "hello, %s " %user[1]
msg = Message(recipients=[user[0]],
html=message1,
subject=subject,
sender=sender
)
conn.send(msg)
当我在我的 html 中使用时,此代码运行良好
普通英文字体
但是当我使用波斯语字体时它不起作用。 <h1>فونت فارسی</h1>
我有这个错误表单 Flask :
builtins.UnicodeEncodeError
UnicodeEncodeError: 'ascii' codec can't encode character '\u0633' in position 659: ordinal not in range(128)
这是烧瓶中的完整错误:
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\_compat.py", line 33, in reraise
raise value
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\_compat.py", line 33, in reraise
raise value
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "d:\Python33\lib\site-packages\flask-0.10-py3.3.egg\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "D:\contact\contactweb\flaskapp.py", line 160, in gotomailing
conn.send(msg)
File "d:\Python33\lib\site-packages\flask_mail.py", line 168, in send
message.as_string())
File "d:\Python33\lib\smtplib.py", line 745, in sendmail
msg = _fix_eols(msg).encode('ascii')
【问题讨论】:
你在message1
的HTML代码中使用波斯语吗? (如果是,type(message1)
会返回什么(str
、unicode
或 bytes
)?(如果str
你运行的是什么版本的 Python?)
是的,我使用波斯语,message1='فونت فارسی
',type(message1) 我认为是 str,python=3.3,tank for help :) 完整的堆栈跟踪是什么? 我添加了我认为@SeanVieira 的 Trace 【参考方案1】:根本问题是,当您将str
(Python 2 上的unicode
)传递给smtplib.sendmail
时,字符串被编码为bytes
作为ASCII。当你只传入 ASCII 字符时,一切正常,但是一旦你传入一组非 ASCII 字符(如فونت فارسی),就会出现编码错误。
解决方法是自己将消息编码为字节,提供正确的编码:
msg = Message(recipients=[user[0]],
html=message1.encode("utf-8"),
subject=subject,
sender=sender
)
message1.encode("utf-8")
会将 unicode str
转换为 bytes
流,以 UTF-8 编码表示这些字符。当smtplib.sendmail
检查消息的内容时,它会发现它已经是一个字节流,并且不会尝试再次对其进行编码(从而解决您的问题)。
【讨论】:
很多tankds为你的答案,我会测试它现在我的smtp服务器有问题, 不工作,AttributeError: 'bytes' object has no attribute 'encode' ,我有这个错误 可能是针对 windows 的,因为我在 linuxe 服务器上的代码几乎可以正常工作,!!以上是关于Flask-mail 批量发送 HTML 电子邮件,在 html 中使用波斯语字体的主要内容,如果未能解决你的问题,请参考以下文章