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) 会返回什么(strunicodebytes)?(如果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 中使用波斯语字体的主要内容,如果未能解决你的问题,请参考以下文章

使用内嵌图像Flask-Mail发送电子邮件?

用Flask-mail发送电子邮件

使用flask-mail扩展发送邮件

Flask-Mail 队列消息被发送到不同的电子邮件

Flask 学习-61.Flask-Mail 发送邮件

使用flask-mail通过gmail发送电子邮件