Как отправить электронное письмо с некоторыми не-ASCII символами в Python? - PullRequest
1 голос
/ 25 июня 2019

Я использую Python 3.7 и пытаюсь отправлять электронные письма с помощью smtplib.Мой сценарий работает безупречно, пока сообщение не содержит турецких символов, таких как «ş, ı, İ, ç, ö».Единственное найденное мной решение, которое работает до сих пор, - это использование строки "string=string.encode('ascii', 'ignore').decode('ascii')", но когда я это делаю, строка "İşlem tamamlanmıştır." становится "lem tamamlanmtr.". Так как же сохранить исходную строку и обойти эту ошибку?

Соответствующая часть кода:

import smtplib
server = smtplib.SMTP_SSL(r'smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
message = 'Subject: {}\n\n{}'.format(subject, text)
server.sendmail(from, to, message)
server.close()

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

SMTP требует, чтобы любое содержимое, отличное от ASCII, было инкапсулировано и помечено должным образом. Если вы знаете, что делаете, это не сложно сделать вручную, но простое и масштабируемое решение состоит в том, чтобы использовать библиотеку Python email для создания правильного сообщения для передачи на sendmail.

Это адаптировано в значительной степени дословно из примера Python email . Он использует класс EmailMessage, который стал официальным в 3.5, но должен работать уже в Python 3.3.

from email.message import EmailMessage

# Create a text/plain message
msg = EmailMessage()
msg.set_content(text)

msg['Subject'] = subject
msg['From'] = from
msg['To'] = to
0 голосов
/ 25 июня 2019
import smtplib
from email.mime.text import MIMEText

text_type = 'plain' # or 'html'
text = 'Your message body'
msg = MIMEText(text, text_type, 'utf-8')
msg['Subject'] = 'Test Subject'
msg['From'] = gmail_user
msg['To'] = 'user1@x.com,user2@y.com'
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.login(gmail_user, gmail_password)
server.send_message(msg)
# or server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
...