Python-邮件收发

介绍

这里介绍两种方法:

  • 利用外部 SMTP 服务器发送邮件
  • 以本身作为 SMTP 服务器发送邮件

利用外部 SMTP 服务器

smtplib 库, 其为 Python 标准库中发送邮件的简单接口.

步骤:

  • 创建 SMTP 连接
  • 登录 SMTP
  • 设置邮件信息
  • 发送邮件
  • 断开 SMTP 连接

这里以 QQ 的 SMTP 服务器为例, 需要先获取自己账号的 “授权码” 以登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import smtplib
from email.mime.text import MIMEText

def main():
# 与发送服务器通信需完成发送服务器相关设置:
# 对于 QQ 邮箱为: smtp.qq.com, SSL, port 465 或 587
server = smtplib.SMTP_SSL('smtp.qq.com', 465)

# 登陆
server.login("12345678@qq.com", "xxxxxYourCodeHere")

# 构建邮件内容
msg = MIMEText("hello, from python")
msg['Subject'] = 'Test Email'
msg['From'] = "12345678@qq.com"
msg['To'] = "2222222@qq.com"

# 发送信息
server.send_message(msg)

# 退出
server.quit()

if __name__ == "__main__":
main()
  • smtplib.SMTP_SSL(host, port), 第一个参数指定 SMTP 服务器地址, 第二个参数指定端口
  • server.login(email, code), 第一个参数为用来发送邮件的邮箱, 第二个是其对应的授权码
  • server.send_message(msg), 发送具体内容, 要发送的邮件需要包含 Subject, From, To 这几个键值

发送图片附件

相比上述多出的步骤:

  • 声明 message 为 Multipart, 并通过 attach 方法添加内容
  • email.mime.image 中的 MIMEImage 处理图片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.mime.image import MIMEImage
    from email.mime.text import MIMEText

    def main():
    # 与发送服务器通信需完成发送服务器相关设置:
    # 对于 QQ 邮箱为: smtp.qq.com, SSL, port 465 或 587
    server = smtplib.SMTP_SSL('smtp.qq.com', 465)

    # 登陆
    server.login("12345678@qq.com", "xxxxxYourCodeHere")

    # 构建邮件内容
    msg = MIMEMultipart()
    msg['Subject'] = 'Test Email with Attachment'
    msg['From'] = "12345678@qq.com"
    msg['To'] = "2222222@qq.com"

    # 添加文本内容
    msg.attach(MIMEText("Please find the attached image.", 'plain'))

    # 添加图片附件
    with open('./test.png', 'rb') as f:
    image = MIMEImage(f.read())
    image.add_header('Content-Disposition', 'attachment', filename='example.jpg')
    msg.attach(image)

    # 发送信息
    server.send_message(msg)

    # 退出
    server.quit()

    if __name__ == "__main__":
    main()

发送 PDF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

def main():
# 与发送服务器通信需完成发送服务器相关设置:
# 对于 QQ 邮箱为: smtp.qq.com, SSL, port 465 或 587
server = smtplib.SMTP_SSL('smtp.qq.com', 465)

# 登陆
server.login("1043752169@qq.com", "biiyjuveileqbdjh")

# 构建邮件内容
msg = MIMEMultipart()
msg['Subject'] = 'Test Email with PDF Attachment'
msg['From'] = "1043752169@qq.com"
msg['To'] = "2694783083@qq.com"

# 添加文本内容
msg.attach(MIMEText("Please find the attached PDF file.", 'plain'))

# 添加 PDF 附件
with open('test.pdf', 'rb') as f:
pdf = MIMEApplication(f.read())
pdf.add_header('Content-Disposition', 'attachment', filename='test.pdf')
msg.attach(pdf)

# 发送信息
server.send_message(msg)

# 退出
server.quit()

if __name__ == "__main__":
main()

本身作为 SMTP 服务器

后面有机会写.


Python-邮件收发
http://example.com/2024/08/21/Python-邮件收发/
作者
Jie
发布于
2024年8月21日
许可协议