2
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)

this code is work well when i use in my html

normal-english-font

but when i use farsi font it didn't work.
     <h1>فونت فارسی</h1>

i have this error form Flask :

     builtins.UnicodeEncodeError
     UnicodeEncodeError: 'ascii' codec can't encode character '\u0633' in position 659:     ordinal not in range(128)

and this is full error in flask:

    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')
garni
  • 45
  • 1
  • 8

1 Answers1

-1

The underlying issue is that when you pass a str (unicode on Python 2) to smtplib.sendmail the string is encoded to bytes as ASCII. When you pass in nothing but ASCII characters everything works, but once you pass in a set of non-ASCII characters (like فونت فارسی) then you get the encoding error.

The fix is simply to encode the message to bytes yourself, providing the correct encoding:

msg = Message(recipients=[user[0]],
              html=message1.encode("utf-8"),
              subject=subject,
              sender=sender
              )

The message1.encode("utf-8") will transform the unicode str into a stream of bytes representing those characters in the UTF-8 encoding. When smtplib.sendmail checks the content of the message it will see that it is already a stream of bytes and will not attempt to encode it again (thus fixing your issue).

Sean Vieira
  • 155,703
  • 32
  • 311
  • 293