无法发送包含西里尔语的电子邮件

时间:2019-03-01 11:33:36

标签: python unicode ascii smtplib

搜索结果没有帮助 我对编码非常陌生,作为挑战,我试图从一个网站上抓取天气数据,然后将该数据发送到我的电子邮件中。 我怀疑西里尔字母是无法发送电子邮件的原因。 我已经进行了一些测试,并且如果我通过了正常的拉丁语参数“主题”和“味精” 该邮件有效,但是如果其中之一使用非拉丁语,则该邮件将不会通过。我对unicode的了解非常有限,为什么我什至不知道为什么会导致错误

import smtplib
import config
import requests
from bs4 import BeautifulSoup


def weather():
    src = requests.get('https://www.sinoptik.bg/asenovgrad-bulgaria-100733618').text
    soup = BeautifulSoup(src, 'lxml')

    city_name = soup.find('h1').text
    current_temp = soup.find('span', class_='wfCurrentTemp').text
    feels_temp = soup.find('span', class_='wfCurrentFeelTemp').text
    weather_type = soup.find('strong').text
    a = f'{city_name}\nТемпературата вмомента е {current_temp}\n{feels_temp}C\nОчаква се предимно {weather_type} време.'
    return a


def send_email(subject, msg):
    try:
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.ehlo()
        server.starttls()
        server.login(config.EMAIL_ADRESS, config.PASSWORD)
        message = 'Subject: {}\n\n{}'.format(subject, msg)
        server.sendmail(config.EMAIL_ADRESS, config.SEND_TO, message)
        server.quit()
        print('Success: Email sent!')
    except:
        print('Email failed to send.')


subject = 'Дневна прогноза за времето'
msg = weather()

send_email(subject, msg)

当我删除try / except时,出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-14: ordinal not in range(128)

使用.encode('utf-8),我设法收到了要发送的电子邮件,但是我收到了ascii字符。

b'\xd0\x90\xd1\x81\xd0\xb5\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb3\xd1\x80\xd0\xb0\xd0\xb4\n\xd0\xa2\xd0\xb5\xd0\xbc\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd1\x83\xd1\x80\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xb2\xd0\xbc\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd0\xb0 \xd0\xb5 18\xc2\xb0C\n\xd0\xa3\xd1\x81\xd0\xb5\xd1\x89\xd0\xb0 \xd1\x81\xd0\xb5: 18\xc2\xb0C\n\xd0\x9e\xd1\x87\xd0\xb0\xd0\xba\xd0\xb2\xd0\xb0 \xd1\x81\xd0\xb5 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xbd\xd0\xbe \xd0\xa1\xd0\xbb\xd1\x8a\xd0\xbd\xd1\x87\xd0\xb5\xd0\xb2\xd0\xbe \xd0\xb2\xd1\x80\xd0\xb5\xd0\xbc\xd0\xb5.'

然后我尝试使用.decode()将其解码回去,但是电子邮件再也无法正常工作了?

2 个答案:

答案 0 :(得分:1)

导入另一个模块似乎可以部分解决问题

from email.mime.text import MIMEText

然后更改以下内容:

message = 'Subject: {}\n\n{}'.format(subject, msg)
        server.sendmail(config.EMAIL_ADRESS, config.SEND_TO, message)

message = MIMEText('Subject: {}\n\n{}'.format(subject, msg))
server.sendmail(config.EMAIL_ADRESS, config.SEND_TO, message.as_string())

不幸的是,这一更改影响了电子邮件的正文,“主题”不再充当电子邮件的主体,而是在电子邮件的正文中,使我的“主题”为空。

答案 1 :(得分:0)

电子邮件最初严格是7位ASCII,您必须使用MIME封装来正确包含任何其他类型的内容,并正确添加元数据以标识其类型和编码。 SELECT DisplayName AS 'Display Name', PrimaryEmailAddress AS 'Email Address', Licenses AS 'License Type', LastPasswordChangeTimestamp AS 'Last Password Reset' FROM TableName WHERE PrimaryEmailAddress <> 'SMTP:' and Licenses <> 'text:' 库透明地为您完成此操作,并通过将字符串粉碎在一起(特别是如果您不太熟悉RFC5322和朋友的要求)来处理许多其他困难或繁琐的细节。

email

这几乎是https://docs.python.org/3/library/email.examples.html中第一个适合您情况的示例。

也许会注意到from email.message import EmailMessage import smtplib msg = EmailMessage() msg['Subject'] = 'Дневна прогноза за времето' msg['From'] = me msg['To'] = you msg.set_content(weather()) server = smtplib.SMTP('smtp.gmail.com:587') server.ehlo() server.starttls() server.login(config.EMAIL_ADRESS, config.PASSWORD) server.send_message(msg) server.quit() 库在Python 3.6中已经进行了大修;如果您需要支持较旧的版本,则上述某些功能可能需要进行一些细微调整。一旦知道要寻找的内容,就不难找到例子。