Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden

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.

Grundcode

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

Das Ende

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

Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, mit Python zu kratzen
Senden Sie japanische Post mit Python3
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, WebScraping mit Python.
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
[Python] Ich habe versucht, automatisch einen täglichen Bericht über YWT mit Outlook-Mail zu erstellen
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe versucht, englische Untertitel mit Udemy gewaltsam ins Japanische zu übersetzen
Ich habe die SMTP-Kommunikation mit Python versucht
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht herauszufinden, ob ReDoS mit Python möglich ist
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Einfaches Japanisch ⇒ Ich habe versucht, ein englisches Übersetzungswerkzeug zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
HTML-Mail mit Bild zum Senden mit Python
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, Permutation in Python zu implementieren