首页 > 解决方案 > 无法发送包含西里尔字母的电子邮件

问题描述

我对编码非常陌生,作为挑战,我尝试从网站上抓取天气数据,然后将这些数据发送到我的电子邮件。我怀疑西里尔字母是电子邮件无法发送的原因。我已经进行了一些测试,如果我的参数“主题”和“味精”通过了正常的拉丁语,则邮件可以正常工作,但如果其中一个有任何非拉丁语,则邮件将无法通过。我对 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”编解码器无法对位置 9-14 中的字符进行编码:序数不在范围内(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() 将其解码,但电子邮件无法再次使用?

标签: pythonunicodeasciismtplib

解决方案


导入另一个模块似乎部分解决了这个问题

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())

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


推荐阅读