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.
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
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? ??