如何使用Python发送电子邮件

如何使用Python发送电子邮件

2023-04-21
暂无分类

发送邮件要用到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标准,这个字符串长下面这个样子
    # RFC2822 requires that day and month names be the English abbreviations.
    Fri, 09 Nov 2001 01:08:47 -0000
    
    formatdate函数可以直接生成符合要求的字符串,若格式不符合要求,发送邮件则会报错INVALID_DATE Invalid Date: header (not RFC 2822)
  • message发送时要encode('utf-8')
THE END
0/500
暂无评论