Solution de contournement pour Flask-Mail n'envoyant pas de courrier japonais UTF-8 (Python3)

Si vous écrivez d'abord la conclusion

Flask-Mail altère les paramètres globaux lors de l'envoi de courrier avec utf-8 sans autorisation, donc après son importation, cela fonctionnera si vous le restaurez. Plus précisément, écrivez ceci quelque part avant de l'envoyer.

test.py


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

Ou, s'il est limité au Japon, si vous spécifiez explicitement charset dans shift_jis, vous pouvez l'envoyer sans aucun problème sans faire ce qui précède.

test.py


msg = Message(sender=(u"expéditeur", "[email protected]"),
                  subject = u"Titre",
                  recipients = ["[email protected]"],
                  reply_to = u"Répondre<[email protected]>",
                  charset = 'shift_jis')  #← C'est
msg.body = u"C'est une fiole d'examen_sjis"
mail.send(msg)

c'est tout. Ce qui suit est une capture.

Qu'est-ce que Flask-Mail

Flask a une extension très utile appelée Flask-Mail. C'est assez simple avec smtplib et e-mail, mais il est exceptionnellement facile d'envoyer des e-mails que vous utilisez souvent pour créer des services Web.

Je me demande si vous pouvez comprendre en regardant cela.

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

En particulier, comme exigence récente, j'envoie souvent des newsletters électroniques en plusieurs parties / alternatives (celles qui prennent en charge à la fois le courrier HTML et le courrier texte), ce qui est également inhabituellement facile à envoyer.

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='Hourra'
msg.html='<h1>Hourra</h1>'
mail.send(msg)

Dangereux.

Le problème que vous rencontrez

En fait, en Python2, cela fonctionne de bonne humeur en raison d'un arrêt cérébral, mais quand il est exécuté en Python3, cela devient généralement comme ça. Je ne comprends pas ce que cela signifie et je perds complètement ma motivation.

Flask semble être bon, alors je vais le toucher! -> J'aime! Mettez-le en affaires! -> Envoyer un mail? Flask-Mail semble être pratique! -> Gee! !! !! !! !! Encrassé! !! !! Je me demande s'il y a des gens comme ça. C'est moi. salut! !! !!

Cliquez ici pour le code expérimental

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"expéditeur", "[email protected]"),
                  subject=u"Titre",
                  recipients=["[email protected]"],
                  reply_to=u"Répondre<[email protected]>")
    msg.body = u"Un flacon_utf8"
    mail.send(msg)

résultat

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)

Pourquoi?

Donc, je lisais le code Flask-Mail, mais je me demandais ce que c'était.

flask_mail.py


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

Il y a cette description. Le paramètre de code de caractère global (!) Utilisé pour le courrier est écrasé (!) Sans autorisation.

Donc, comme je l'ai vérifié auparavant, Python3 ne fonctionne pas avec ce paramètre jusqu'à présent. http://qiita.com/yasunori/items/265d8db746742bb967c4#2-10

Donc, après avoir importé Flask-Mail, je l'ai écrasé et restauré.

Baka! !! !!.py


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

Je veux dire, combien de paramètres modifiez-vous?

Après avoir lu le numéro Flask-Mail, "Si vous utilisez BASE64 pour BODY, il est facile de se faire prendre dans le filtre anti-spam, donc je pense qu'il vaut mieux le régler sur Aucun. C'est ce que fait Django aussi." "Sérieusement!? Merci!" C'était en.

Au fait, Django en question a été modifié pour qu'il ne soit pas écrasé maintenant car "je me demandais pourquoi j'ai écrasé le global". Il semble que Flask-Mail ait capturé une lacune momentanée.

finalement

Veuillez me faire savoir s'il existe une solution plus fondamentale.

C'est tout.

Recommended Posts

Solution de contournement pour Flask-Mail n'envoyant pas de courrier japonais UTF-8 (Python3)
Correction d'un bug où node.surface ne pouvait pas être obtenu avec python3 + mecab
Le problème que la commande ifconfig ne peut pas être utilisée
Solution lorsque l'image ne peut pas être affichée avec tkinter [python]
Comment résoudre le problème que le contenu vidéo ne peut pas être lu sur Firefox pour Linux
Solution de contournement pour sys.argv non transmise lors de l'exécution d'un script Python avec uniquement le nom de fichier sur Python2.7 sous Windows
Faites attention à LANG pour UnicodeEncodeError lors de l'impression du japonais avec Python 3
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
L'histoire de la création d'un module qui ignore le courrier avec python
Solution au problème que Ctrl + z ne peut pas être utilisé dans Powershell dans l'environnement Docker pour Windows (provisoire)
Optimisation mathématique pour un travail gratuit avec Python + PuLP
Le module Python avec "- (trait d'union)" ne peut pas être supprimé
Matières qui ne peuvent pas être importées avec sklearn
Explication intuitive qui ne repose pas sur la formule du problème de Monty Hall et simulation avec Python
À propos de localhost: 4040 n'est pas accessible après l'exécution de Spark avec Docker
Script Python qui crée tous les fichiers UTF-8 sous le dossier avec BOM sans BOM
Je ne peux pas créer de projet avec Python3.5 (Windows) + django1.7.1.
Utilisez Logger avec Python pour le moment
Enquête lorsque l'importation ne peut pas être effectuée avec python
Résolvez le problème du sac à dos Python avec l'algorithme glouton
Remarque Python: lorsque la commande pip ne peut pas être utilisée
Pour pouvoir utiliser le japonais avec Python dans l'environnement Docker
Exécutez avec CentOS7 + Apache2.4 + Python3.6 pour le moment
Importer des bibliothèques qui ne peuvent pas être installées par pip avec PyCharm
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Notes sur les connaissances Python utilisables avec AtCoder
[Mémorandum] Les clés japonaises ne peuvent pas être utilisées dans la chaîne de python.
Informations pour contrôler les moteurs avec Python sur RaspberryPi
Programme Python qui recherche le même nom de fichier
Le 14ème problème de référence d'écriture en temps réel hors ligne avec Python
Un mémo que j'ai touché au magasin de données avec python
J'ai essayé de résoudre le problème avec Python Vol.1
L'histoire de la confusion entre la production japonaise et Django
4 boîtes qui pourraient être utiles pour les hackers de Pepper
Problème que l'installation de pip ne peut pas être effectuée avec pyenv + Yosemite (erreur: la commande'clang 'a échoué avec l'état de sortie 1)
Traiter l'erreur selon laquelle une erreur de récupération HTTP se produit dans gpg et la clé ne peut pas être obtenue