J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python

J'ai essayé diverses choses. Pour conclure d'abord, en gros, vous n'avez pas à trop y penser car vous pouvez éviter qu'il ne soit brouillé. De plus, je ne comprends pas vraiment le comportement lors de la lecture du jeu de caractères avec add_charset en Python3.

C'est le sujet principal.

Code de base

sendmail.py


# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import charset

con = smtplib.SMTP('localhost')
con.set_debuglevel(True)

cset = 'utf-8'  # <---------------(C'est un paramètre de jeu de caractères)

message = MIMEText(u'C'est un email japonais ★', 'plain', cset)
message['Subject'] = Header(u'Test d'envoi d'e-mails', cset)
message['From'] = '[email protected]'
message['To'] = '[email protected]'

con.sendmail('[email protected]', ['[email protected]'], 
message.as_string()) 

con.close()

Essayons.

Python2.7.2 + None C'est un changement soudain, mais je vais essayer si je n'ai pas défini le jeu de caractères. Dans le code de base, j'ai essayé cset = None```.

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

Je suis vraiment en colère. Si vous n'enregistrez aucun jeu de caractères, il sera traité comme us-ascii, donc ce sera de la mousse quelque part.

Python2.7.2 + utf-8 (with BASE64) Essayez `` cset = utf-8 '' dans le code de base. J'ai pu le recevoir en toute sécurité. Les données brutes ressemblent à ceci.

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Subject: =?utf-8?b?44Oh44O844Or6YCB5L+h44OG44K544OI?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

5pel5pys6Kqe44Gu44Oh44O844Or44Gg44KI4piF

Le codage du corps est Base64. En effet, le standard Python est le suivant.

/email/charset.py


CHARSETS = {
...
'utf-8':       (SHORTEST,  BASE64, 'utf-8'),
#Taple est l'encodage de l'en-tête,Il montre l'encodage du corps et le jeu de caractères d'encodage de sortie.Il a été écrit en py
…
}

Probablement, il n'y a presque aucun problème avec cela, mais dans le passé, c'était NG avec les terminaux au. Mais je pense que tout va bien. C'est tout.

Python2.7.2 + utf-8 with QP

Je déteste Base64! Si tel est le cas, écrasez CHARSET. Insérez-le près du début du code de base.

sendmain.Ecrire quelque part dans py.py


charset.add_charset('utf-8', charset.SHORTEST, charset.QP, 'utf-8')
# uft-Avec une valeur de 8, l'en-tête est SHORTEST et le corps est QP (entre guillemets).-printable)Je vais l'utiliser, l'encodage de sortie est utf-8
cset = utf-8

Lorsque vous faites cela, cela ressemble à ceci:

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Subject: =?utf-8?b?44Oh44O844Or6YCB5L+h44OG44K544OI?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB=E3=81=A0=E3=
=82=88=E2=98=85

C'est autre chose que BASE64. Il n'y a aucun problème de réception.

Python2.7.2 + utf-8 with 8bit Et si je ne spécifie rien pour l'encodage corporel?

sendmain.Ecrire quelque part dans py.py


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

La sortie est comme ça. Il sort tel quel.

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: =?utf-8?b?44Oh44O844Or6YCB5L+h44OG44K544OI?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

C'est un email japonais ★

Content-Transfer-Encoding peut être 7 bits ou 8 bits. C'est dans /email/encoders.py Il a été décidé que la fonction encode_7or8bit () est bonne. Si vous voulez en faire 8 bits, c'est ça. Peut-être que c'est beaucoup ces jours-ci.

Python2.7.2 + shift_jis

IME-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
Subject: =?iso-2022-jp?b?GyRCJWEhPCVrQXc/LiVGJTklSBsoQg==?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

F|K\8l$N%a!<%k$@$h!z

Lorsque le jeu de caractères est «shift_jis», la sortie est iso-2022-jp, ce que tout le monde aime. Ceci est le paramètre standard de Python

'shift_jis':   (BASE64,    None,    'iso-2022-jp'),

Le codage Body est None. Content-Transfer-Encoding est 7 bits sans autorisation.

Python3.3.0 + None Ensuite, essayez avec Python3. Premièrement, si vous ne spécifiez pas de jeu de caractères. Celui qui a obtenu UnicodeEncodeError dans Python2.

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Subject: =?utf-8?b?44Oh44O844Or6YCB5L+h44OG44K544OI?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

5pel5pys6Kqe44Gu44Oh44O844Or44Gg44KI4piF

Comment puis-je l'envoyer? Il n'y a aucun problème de réception. J'ai l'impression d'avoir lu un peu le contenu, essayez-le avec us-ascii, et si j'obtiens un UnicodeEncodeError, essayez-le avec utf-8. Ainsi, avec Python3.3, vous pouvez ignorer les e-mails sans être du tout conscient du jeu de caractères.

Python3.3.0 + utf-8 (with BASE64)

Donc, même si vous faites `` cset = utf-8 '', cela devrait être le même que ci-dessus.

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Subject: =?utf-8?b?44Oh44O844Or6YCB5L+h44OG44K544OI?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

5pel5pys6Kqe44Gu44Oh44O844Or44Gg44KI4piF

le même! Suivant!

Python3.3.0 + utf-8 with QP Je veux utiliser QP pour BODY!

Donc, comme avec Python 2, écrivez quelque part ci-dessous.

sendmain.Ecrire quelque part dans py.py


charset.add_charset('utf-8', charset.SHORTEST, charset.QP, 'utf-8')
cset = utf-8

envoyer un e-mail!

   self.set_payload(_text, _charset)
  File "/Users/yasunori/.pythonbrew/pythons/Python-3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/email/message.py", line 280, in set_payload
    self.set_charset(charset)
  File "/Users/yasunori/.pythonbrew/pythons/Python-3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/email/message.py", line 317, in set_charset
    self._payload = charset.body_encode(self._payload)
  File "/Users/yasunori/.pythonbrew/pythons/Python-3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/email/charset.py", line 395, in body_encode
    return email.quoprimime.body_encode(string)
  File "/Users/yasunori/.pythonbrew/pythons/Python-3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/email/quoprimime.py", line 240, in body_encode
    if body_check(ord(c)):
  File "/Users/yasunori/.pythonbrew/pythons/Python-3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/email/quoprimime.py", line 81, in body_check
    return chr(octet) != _QUOPRI_BODY_MAP[octet]
KeyError: 26085

J'étais faché! Effrayant effrayant effrayant effrayant! !! !! !! On dit qu'il n'y a pas de telle clé dans le tableau. Comme vous pouvez le voir, _QUOPRI_BODY_MAP devrait être alphanumérique, mais j'essaie de faire référence au 26085e caractère. Je me demande pourquoi ... Je ne suis pas sûr à première vue, alors je l'ai mis en attente.

Python3.3.0 + utf-8 with 8bit Je veux l'envoyer tel quel en 8 bits.

sendmain.Ecrire quelque part dans py.py


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

Ajoutez ceci et envoyez.

File "/Users/yasunori/.pythonbrew/pythons/Python-3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/smtplib.py", line 744, in sendmail
    msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 231-240: ordinal not in range(128)

J'étais faché! Effrayant effrayant effrayant effrayant! !! !! !! Pourquoi est-ce en colère? En fait, contrairement à l'erreur QP, message.as_string () '' `` est passé et le texte du courrier est correctement rempli.

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: =?cp932?b?g4GBW4OLkZeQTYNlg1iDZw==?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

C'est un email japonais ★

Ça va. Envoie-le! Je suis parfois en colère. En regardant la partie erreur plus tôt, cela semble certainement inutile car j'essaie d'encoder avec une écriture solide ascii dans smtplib ... Que dois-je faire avec cela? S'il vous plaît dites-moi ...

Python3.3.0 + shift_jis

Sjis stables.

MIME-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
Subject: =?iso-2022-jp?b?GyRCJWEhPCVrQXc/LiVGJTklSBsoQg==?=
From: [email protected]
To: [email protected]
Reply-To: [email protected]

F|K\8l$N%a!<%k$@$h!z

La fin

Cela fonctionne presque comme prévu, mais dans la série Python3, le comportement lorsque add_charset est assez suspect et il s'agit d'une porte démon jusqu'à présent. Est-ce que je fais mal? ??

Recommended Posts

J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé de gratter avec Python
Envoyer du courrier japonais avec Python3
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de toucher Python (installation)
J'ai essayé webScraping avec python.
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Je veux déboguer avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé de traduire de force des sous-titres anglais en japonais avec Udemy
J'ai essayé la communication SMTP avec Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de savoir si ReDoS est possible avec Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de résumer les remarques de tout le monde sur le slack avec wordcloud (Python)
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
mail html avec image à envoyer avec python
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé d'implémenter la permutation en Python