بيثون 3 smtplib إرسالها مع أحرف Unicode
-
07-07-2019 - |
سؤال
وأواجه مشكلة البريد الإلكتروني حروف يونيكود باستخدام smtplib في بيثون 3. هذا فشل في 3.1.1، ولكن يعمل في 2.5.4:
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
وحاولت مثال من المستندات، والتي فشلت أيضا. http://docs.python.org/3.1/library/email-examples. أتش تي أم أل ، وإرسال محتويات الدليل كمثال رسالة MIME
وأي اقتراحات؟
المحلول
والمفتاح هو في مستندات و>:
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
<اقتباس فقرة>
وهناك فئة فرعية من MIMENonMultipart، و ويستخدم الدرجة MIMEText لخلق MIME كائنات النص نوع كبير. _text هو سلسلة لحمولة. _subtype هو نوع بسيط والتخلف ل عادي. _charset هو مجموعة الأحرف النص ويتم تمريرها على أنها معلمة إلى MIMENonMultipart البناء؛ لأنه تخلف عن US-ASCII. لا التخمين أو يتم تنفيذ الترميز على البيانات النص.
اقتباس فقرة> وهكذا ما تحتاج إليه هو واضح، <م> لا م> msg = MIMEText('€10')
، ولكن إلى حد ما:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
وبينما لم يكن كل ذلك موثق بشكل واضح، تنسخ يحتاج إلى سلسلة بايت، وليس يونيكود واحد (وهذا ما يحدد بروتوكول SMTP)؛ ننظر إلى ما يبدو msg.as_string()
مثل لكل من الطريقتين بناء عليه - نظرا ل"لا التخمين أو ترميز"، طريقك لا يزال لديه هذا الحرف اليورو في هناك (وليس وسيلة لتنسخ إلى تحويلها إلى bytestring)، والألغام لا (و UTF-8 يتم تحديد بشكل واضح طوال).
نصائح أخرى
والمعلمة _charset
من التخلف عن السداد MIMEText
إلى us-ascii
وفقا لفي مستندات . منذ €
ليس من US-ASCII تعيين انها لا تعمل.
والمثال في المستندات التي كنت قد حاولت بوضوح ما يلي:
<اقتباس فقرة>وعلى سبيل المثال، افترض أن ملف نصي يحتوي على أحرف ASCII فقط.
اقتباس فقرة> هل يمكن استخدام .get_charset
أ > الطريقة على رسالتك للتحقيق في محارف، وهناك بالمناسبة .set_charset
كذلك.
وجوس مولر مشكلة مشابهة: http://bugs.python.org/issue4403