Ich habe verschiedene Dinge ausprobiert. Um zunächst zu schließen, müssen Sie im Grunde nicht zu viel darüber nachdenken, da Sie verhindern können, dass es verstümmelt wird. Außerdem verstehe ich das Verhalten beim Spielen mit dem Zeichensatz mit add_charset in Python3 nicht wirklich.
Dies ist das Hauptthema.
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' # <---------------(Es ist eine Zeichensatzeinstellung)
message = MIMEText(u'Es ist eine japanische E-Mail ★', 'plain', cset)
message['Subject'] = Header(u'E-Mail-Sendetest', cset)
message['From'] = '[email protected]'
message['To'] = '[email protected]'
con.sendmail('[email protected]', ['[email protected]'],
message.as_string())
con.close()
Lass es uns versuchen.
Python2.7.2 + None Es ist ein plötzlicher Wechselball, aber ich werde es versuchen, wenn ich den Zeichensatz nicht festgelegt habe. Im Basiscode habe ich `` `cset = None``` ausprobiert.
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
Ich bin wirklich wütend. Wenn Sie keinen Zeichensatz registrieren, wird dieser als us-ascii verarbeitet, sodass er irgendwo Moos ist.
Python2.7.2 + utf-8 (with BASE64) Versuchen Sie `` `cset = utf-8``` im Basiscode. Ich konnte dies sicher empfangen. Rohdaten sehen so aus.
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
Die Body-Codierung ist Base64. Dies liegt daran, dass der Python-Standard wie folgt lautet.
/email/charset.py
CHARSETS = {
...
'utf-8': (SHORTEST, BASE64, 'utf-8'),
#Taple ist die Codierung des Headers,Es zeigt den Zeichensatz für die Körpercodierung und die Ausgabecodierung.Es wurde in py geschrieben
…
}
Wahrscheinlich gibt es damit fast kein Problem, aber früher war es NG mit Au-Terminals. Aber ich denke das ist in Ordnung. Das ist es.
Python2.7.2 + utf-8 with QP
Ich hasse Base64! Wenn ja, überschreiben Sie CHARSET. Fügen Sie dies am Anfang des Basiscodes ein.
sendmain.Schreiben Sie irgendwo in py.py
charset.add_charset('utf-8', charset.SHORTEST, charset.QP, 'utf-8')
# uft-Bei einer Einstellung von 8 ist der Header SHORTEST und der Body QP (in Anführungszeichen).-printable)Ich werde es verwenden, die Ausgabecodierung ist utf-8
cset = utf-8
Wenn Sie dies tun, sieht es so aus:
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
Es ist etwas anderes als BASE64. Es gibt kein Problem mit der Rezeption.
Python2.7.2 + utf-8 with 8bit Was ist, wenn ich nichts für die Körpercodierung spezifiziere?
sendmain.Schreiben Sie irgendwo in py.py
charset.add_charset('utf-8', charset.SHORTEST, None, 'utf-8')
cset = utf-8
Die Ausgabe ist wie folgt. Es kommt so heraus wie es ist.
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]
Es ist eine japanische E-Mail ★
Die Inhaltsübertragungscodierung kann 7 Bit oder 8 Bit sein. Dies ist in /email/encoders.py Es wurde entschieden, dass die Funktion encode_7or8bit () gut ist. Wenn Sie es 8bit machen wollen, ist dies das Richtige. Vielleicht ist das heutzutage ziemlich viel.
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
Wenn der Zeichensatz'hift_jis 'ist, lautet die Ausgabe iso-2022-jp, was jeder liebt. Dies ist die Standardeinstellung von Python
'shift_jis': (BASE64, None, 'iso-2022-jp'),
Die Body-Codierung lautet None. Content-Transfer-Encoding ist 7bit ohne Erlaubnis.
Python3.3.0 + None Versuchen Sie es als nächstes mit Python3. Erstens, wenn Sie keinen Zeichensatz angeben. Derjenige, der UnicodeEncodeError in Python2 erhalten hat.
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
Wie kann ich es senden? Es gibt kein Problem mit der Rezeption. Es fühlt sich an, als hätte ich den Inhalt ein wenig gelesen, versuche es mit us-ascii, und wenn ich einen UnicodeEncodeError bekomme, versuche ich es mit utf-8. Mit Python3.3 können Sie also E-Mails überspringen, ohne den Zeichensatz zu kennen.
Python3.3.0 + utf-8 (with BASE64)
Selbst wenn Sie `` `cset = utf-8``` ausführen, sollte dies das gleiche sein wie oben.
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
das Gleiche! Nächster!
Python3.3.0 + utf-8 with QP Ich möchte QP für BODY verwenden!
Schreiben Sie also wie bei Python 2 irgendwo unten.
sendmain.Schreiben Sie irgendwo in py.py
charset.add_charset('utf-8', charset.SHORTEST, charset.QP, 'utf-8')
cset = utf-8
E-Mail senden!
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
Ich war sauer! Beängstigend beängstigend beängstigend beängstigend! !! !! !! Es wird gesagt, dass es keinen solchen Schlüssel im Array gibt. Wie Sie sehen können, sollte _QUOPRI_BODY_MAP alphanumerisch sein, aber ich versuche, auf das 26085. Zeichen zu verweisen. Ich frage mich warum ... Ich bin mir auf den ersten Blick nicht sicher, also habe ich es auf Eis gelegt.
Python3.3.0 + utf-8 with 8bit Ich möchte es so senden, wie es in 8bit ist.
sendmain.Schreiben Sie irgendwo in py.py
charset.add_charset('utf-8', charset.SHORTEST, None, 'utf-8')
Fügen Sie dies hinzu und senden Sie.
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)
Ich war sauer! Beängstigend beängstigend beängstigend beängstigend! !! !! !!
Warum ist das wütend?
Im Gegensatz zum QP-Fehler wird `message.as_string ()`
übergeben und der Mail-Text wird ordnungsgemäß vervollständigt.
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]
Es ist eine japanische E-Mail ★
Es ist in Ordnung. Schicken Sie es! Ich bin manchmal wütend. Wenn ich mir den Fehlerteil früher anschaue, scheint er sicherlich nutzlos zu sein, da ich versuche, mit ASCII-Solid-Schrift in smtplib zu codieren ... Was soll ich damit machen? Bitte sag mir ...
Python3.3.0 + shift_jis
Stabile sjis.
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
Es funktioniert fast wie erwartet, aber in der Python3-Serie ist das Verhalten bei add_charset ziemlich verdächtig und es ist bisher ein Dämonentor. Mache ich es falsch ??
Recommended Posts