Problemumgehung für Flask-Mail, die keine japanische UTF-8-Mail sendet (Python3)

Wenn Sie zuerst die Schlussfolgerung schreiben

Flask-Mail manipuliert die globalen Einstellungen, wenn E-Mails mit utf-8 ohne Erlaubnis gesendet werden. Nach dem Import funktioniert es also, wenn Sie es wiederherstellen. Schreiben Sie dies vor dem Senden irgendwo hin.

test.py


from email import charset
charset.add_charset('utf-8', charset.SHORTEST, charset.BASE64, 'utf-8')

Wenn es auf Japan beschränkt ist und Sie explizit einen Zeichensatz in shift_jis angeben, können Sie ihn problemlos senden, ohne die oben genannten Schritte auszuführen.

test.py


msg = Message(sender=(u"Absender", "[email protected]"),
                  subject = u"Titel",
                  recipients = ["[email protected]"],
                  reply_to = u"Antworten<[email protected]>",
                  charset = 'shift_jis')  #← Das ist
msg.body = u"Es ist eine Prüfungsflasche_sjis"
mail.send(msg)

das ist alles. Das Folgende ist eine Aufnahme.

Was ist Flask-Mail?

Flask hat eine super nützliche Erweiterung namens Flask-Mail. Mit smtplib und E-Mail ist es einfach genug, aber es ist ungewöhnlich einfach, E-Mails zu senden, die Sie häufig zum Erstellen von Webdiensten verwenden.

Ich frage mich, ob Sie das verstehen können, wenn Sie sich das ansehen.

http://pythonhosted.org/flask-mail/

Insbesondere sende ich als aktuelle Anforderung häufig mehrteilige / alternative E-Mail-Newsletter (solche, die sowohl HTML-Mail als auch Textmail unterstützen), was auch ungewöhnlich einfach zu versenden ist.

test.py


from flask import Flask
from flaskext.mail import Mail, Message

app = Flask(__name__)
mail = Mail(app)
msg = Message(subject, sender=sender, recipients=reciepients)
msg.body='Hurra'
msg.html='<h1>Hurra</h1>'
mail.send(msg)

Gefährlich.

Das Problem, das Sie haben

Eigentlich funktioniert es in Python2 aufgrund von Brain Stop gut gelaunt, aber wenn es in Python3 ausgeführt wird, wird es normalerweise so. Ich verstehe nicht was es bedeutet und ich verliere meine Motivation völlig.

Flasche scheint gut zu sein, also werde ich es anfassen! -> Gefällt mir! Setzen Sie es in das eigentliche Geschäft! -> Mail senden? Flask-Mail scheint praktisch zu sein! -> Gee! !! !! !! !! Verstopft! !! !! Ich frage mich, ob es solche Leute gibt. Da ich bin. Hallo! !! !!

Klicken Sie hier für den experimentellen Code

flask_urf8.py


# -*- coding: utf-8 -*-
from flask import Flask
from flask_mail import Message, Mail

app = Flask(__name__)

with app.app_context():
    mail = Mail(app)
    msg = Message(sender=(u"Absender", "[email protected]"),
                  subject=u"Titel",
                  recipients=["[email protected]"],
                  reply_to=u"Antworten<[email protected]>")
    msg.body = u"Eine Flasche_utf8"
    mail.send(msg)

Ergebnis

Traceback (most recent call last):
  File "flask_utf8.py", line 14, in <module>
    mail.send(msg)
  File "/Users/yasunori/venvs/sai/lib/python3.3/site-packages/flask_mail.py", line 416, in send
    message.send(connection)
  File "/Users/yasunori/venvs/sai/lib/python3.3/site-packages/flask_mail.py", line 351, in send
    connection.send(self)
  File "/Users/yasunori/venvs/sai/lib/python3.3/site-packages/flask_mail.py", line 168, in send
    message.as_string())
  File "/usr/local/Cellar/python3/3.3.3/Frameworks/Python.framework/Versions/3.3/lib/python3.3/smtplib.py", line 746, in sendmail
    msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\u3042' in position 364: ordinal not in range(128)

Warum?

Also las ich den Flask-Mail-Code und fragte mich, was es war.

flask_mail.py


charset.add_charset('utf-8', charset.SHORTEST, None, 'utf-8')

Es gibt diese Beschreibung. Die für Mail verwendete globale (!) Zeichencodeeinstellung wird (!) Ohne Erlaubnis überschrieben.

Wie ich bereits überprüft habe, funktioniert Python3 mit dieser Einstellung bisher nicht. http://qiita.com/yasunori/items/265d8db746742bb967c4#2-10

Nachdem ich Flask-Mail importiert hatte, habe ich es überschrieben und wiederhergestellt.

Baka! !! !!.py


from email import charset
charset.add_charset('utf-8', charset.SHORTEST, charset.BASE64, 'utf-8')

Ich meine, wie viele Einstellungen ändern Sie?

Nach dem Lesen der Flask-Mail-Ausgabe „Wenn Sie BASE64 für BODY verwenden, ist es leicht, sich im Spamfilter zu verfangen. Ich denke, es ist besser, ihn auf None zu setzen. Das macht auch Django." „Im Ernst !? Danke!" Es war in.

Übrigens wurde Django in Frage gestellt, so dass es jetzt nicht überschrieben wird, weil "ich mich gefragt habe, warum ich das Globale überschrieben habe". Es scheint, dass Flask-Mail eine momentane Lücke geschlossen hat.

Schließlich

Bitte lassen Sie mich wissen, ob es eine grundlegendere Lösung gibt.

Das ist es.

Recommended Posts

Problemumgehung für Flask-Mail, die keine japanische UTF-8-Mail sendet (Python3)
Es wurde ein Fehler behoben, bei dem node.surface mit python3 + mecab nicht abgerufen werden konnte
Das Problem, dass der Befehl ifconfig nicht verwendet werden kann
Lösung, wenn das Bild mit tkinter [python] nicht angezeigt werden kann
So lösen Sie das Problem, dass Videoinhalte unter Firefox für Linux nicht abgespielt werden können
Problemumgehung für sys.argv wird nicht übergeben, wenn ein Python-Skript mit nur dem Dateinamen unter Python2.7 unter Windows ausgeführt wird
Achten Sie beim Drucken von Japanisch mit Python 3 auf LANG für UnicodeEncodeError
Verstehen Sie die Wahrscheinlichkeiten und Statistiken, die für das Fortschrittsmanagement mit einem Python-Programm verwendet werden können
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Lösung für das Problem, dass Strg + z in Powershell in Docker für Windows nicht verwendet werden kann (vorläufig)
Python-Modul mit "- (Bindestrich)" kann nicht gelöscht werden
Angelegenheiten, die mit sklearn nicht importiert werden können
Intuitive Erklärung, die nicht auf der Formel des Monty Hall-Problems und der Simulation mit Python beruht
Über localhost: Auf 4040 kann nicht zugegriffen werden, nachdem Spark mit Docker ausgeführt wurde
Python-Skript, das alle UTF-8-Dateien unter dem Ordner mit Stückliste ohne Stückliste erstellt
Ich kann mit Python3.5 (Windows) + django1.7.1 kein Projekt erstellen.
Verwenden Sie vorerst Logger mit Python
Untersuchung beim Import kann nicht mit Python durchgeführt werden
Lösen Sie das Python-Rucksackproblem mit dem Greedy-Algorithmus
Python Hinweis: Wenn der Befehl pip nicht verwendet werden kann
Um Japanisch mit Python in der Docker-Umgebung verwenden zu können
Führen Sie es vorerst mit CentOS7 + Apache2.4 + Python3.6 aus
Importieren Sie Bibliotheken, die mit PyCharm nicht per Pip installiert werden können
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Hinweise zu Python-Kenntnissen, die mit AtCoder verwendet werden können
[Memorandum] Japanische Schlüssel können nicht in Pythons string.Template.substitute verwendet werden
Informationen zur Steuerung von Motoren mit Python auf RaspberryPi
Python-Programm, das nach demselben Dateinamen sucht
Das 14. Referenzproblem beim Offline-Schreiben in Echtzeit mit Python
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Die Geschichte, die Japan ausgab, wurde mit Django verwechselt
4 Boxen, die für Pepper-Hacker nützlich sein könnten
Problem, dass die Pip-Installation mit pyenv + Yosemite nicht durchgeführt werden kann (Fehler: Befehl 'clang' mit Exit-Status 1 fehlgeschlagen)
Behandlung des Fehlers, dass ein HTTP-Abruffehler in gpg auftritt und der Schlüssel nicht abgerufen werden kann