在python中,我们可以通过email
包来创建邮件,然后通过smtplib
包来发送邮件,这在官方的文档中也有示例:email-examples。
下面我们以使用smtps发送一封MIME内容类型的邮件为例:
- 首先我们进行邮件账户密码以及目的地址的配置:
mail_user = '[email protected]'
password = 'password'
from_addr = f'test <{mail_user}>'
to_addr = '[email protected]'
mail_host = 'example.com'
- 然后我们创建一封MIME内容类型的邮件:
from email.mime.text import MIMEText
msg = MIMEText('smtp test', 'plain', 'utf-8')
msg['From'] = from_addr
msg['To'] = to_addr
msg['Subject'] = 'smtp test'
- 最后发送邮件:
import smtplib
# smtps
server = smtplib.SMTP_SSL(mail_host)
# smtp
# server = smtplib.SMTP(mail_host)
server.login(mail_user, password)
server.sendmail(mail_user, [to_addr], msg.as_string())
server.quit()
但是,我们按照上述代码发送邮件后,在RSPAMD(一个反垃圾邮件系统)中会获得一个较高的垃圾邮件评分,在我这会是4.50 / 15,容易被认为是垃圾邮件。
为何会出现这种情况呢,仔细查看RSPAMD的history,发现影响评分的原因有如下
- MISSING_MID (2.5)
- MISSING_DATE (1)
- MIME_BASE64_TEXT_BOGUS (1)
- MIME_BASE64_TEXT (0.1)
- MIME_GOOD (-0.1) [text/plain]
其中,MISSING_MID 是由于缺少了message id, MISSING_DATE是由于缺少了message date,所以我们需要在创建邮件时加入对应的头:
from email.utils import make_msgid, formatdate
msg['Message-ID'] = make_msgid('test',mail_host)
msg["Date"] = formatdate(localtime=True)
现在查看RSPAMD的历史,发现评分已经变为了1.00 / 15 分,至于为何还是高于0分,可以看到影响评分的原因为:
- MIME_BASE64_TEXT_BOGUS (1)
- MIME_BASE64_TEXT (0.1)
- MIME_GOOD (-0.1) [text/plain]
MIME_BASE64_TEXT_BOGUS是由于邮件的正文为base64编码,但是并不含任何8bit的字符,而在上面的创建MIMEText时我们指定了utf8编码,而实际上使用ascii编码即可,所以,我们修改直接用默认的us-ascii编码即可避免此问题:
msg = MIMEText('smtp test', 'plain')
此时RSPAMD的评分已经变为-0.10 / 15 分:
- MIME_GOOD (-0.1) [text/plain]
事实上,如果我们的邮件正文中确实含有非ascii字符,那么使用base64编码则是合理的,如果修改一下邮件的正文为:
msg = MIMEText('smtp测试', 'plain', 'utf-8')
那么RASPAMD得到的分数将为0.00 / 15 分:
- MIME_BASE64_TEXT (0.1)
- MIME_GOOD (-0.1) [text/plain]
最后,我们总结一下python发送邮件的完整代码为:
from email.mime.text import MIMEText
from email.utils import make_msgid, formatdate
import smtplib
# configuration
mail_user = '[email protected]'
password = 'password'
from_addr = f'test <{mail_user}>'
to_addr = '[email protected]'
mail_host = 'example.com'
# ascii text
msg = MIMEText('smtp test', 'plain')
# contain unicode characters
# msg = MIMEText('smtp测试', 'plain', 'utf-8')
msg['From'] = from_addr
msg['To'] = to_addr
msg['Subject'] = 'smtp test'
msg['Message-ID'] = make_msgid('test',mail_host)
msg["Date"] = formatdate(localtime=True)
# smtps
server = smtplib.SMTP_SSL(mail_host)
# smtp
# server = smtplib.SMTP(mail_host)
server.login(mail_user, password)
server.sendmail(mail_user, [to_addr], msg.as_string())
server.quit()
本文由 sung 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jan 19,2022