发送邮件要用到SMTP协议,以下代码通过自己组装邮件头的方式发送邮件
import smtplib
from email.utils import formatdate
# 邮件服务器配置
smtp_server = '服务器地址'
# 587或者25端口
smtp_port = 587
smtp_username = '发件人邮箱'
smtp_password = '邮箱密码'
recipient_list = ['收件人邮箱1','收件人邮箱2','收件人邮箱3']
# 邮件内容配置
sender_name = "发件人昵称"
subject = '邮件主题'
content = '邮件内容'
# 构造邮件消息
def generate_message(recipient_address):
return f'''
Date: {formatdate(localtime=True, usegmt=True)}
From: "{sender_name}" <{smtp_username}>
To: {recipient_address}
Subject: {subject}
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: bit8
{content}
'''.strip()
# 发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as smtp:
smtp.starttls()
smtp.login(smtp_username, smtp_password)
for recipient_address in recipient_list:
print(generate_message(recipient_address))
smtp.sendmail(smtp_username, recipient_address, generate_message(recipient_address).encode('utf-8'))
有几点需要注意:
- 组装邮件头时,以上的属性都是必不可少的,否则邮件无法成功发送
- Date字符串必须符合RFC2822标准,这个字符串长下面这个样子
formatdate函数可以直接生成符合要求的字符串,若格式不符合要求,发送邮件则会报错INVALID_DATE Invalid Date: header (not RFC 2822)# RFC2822 requires that day and month names be the English abbreviations. Fri, 09 Nov 2001 01:08:47 -0000
- message发送时要encode('utf-8')