搜索结果没有帮助 我对编码非常陌生,作为挑战,我试图从一个网站上抓取天气数据,然后将该数据发送到我的电子邮件中。 我怀疑西里尔字母是无法发送电子邮件的原因。 我已经进行了一些测试,并且如果我通过了正常的拉丁语参数“主题”和“味精” 该邮件有效,但是如果其中之一使用非拉丁语,则该邮件将不会通过。我对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()将其解码回去,但是电子邮件再也无法正常工作了?
答案 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中已经进行了大修;如果您需要支持较旧的版本,则上述某些功能可能需要进行一些细微调整。一旦知道要寻找的内容,就不难找到例子。