您的位置:

Python SMTP邮件:简单、方便的发送邮件方式

一、SMTP协议的简介

SMTP(Simple Mail Transfer Protocol)是一种邮件传输协议,用于发送、路由和接收电子邮件消息。

在发送邮件时,需要先把邮件从发件人的邮件服务器发送至收件人的邮件服务器,再由收件人的邮件客户端下载。SMTP协议就是在发件人和收件人之间传递邮件的过程中发挥作用。

Python内置smtplib模块可以方便地使用SMTP协议进行邮件发送。

二、SMTP邮件的基本用法

下面是一个使用Python发送邮件的基本示例:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 邮件内容
mail_content = '这是一封测试邮件。'

# 创建一个MIMEText对象,表示邮件正文
message = MIMEText(mail_content, 'plain', 'utf-8')
# 设置邮件主题
message['Subject'] = Header('测试邮件', 'utf-8')
# 设置发件人
message['From'] = 'sender@163.com'
# 设置收件人
message['To'] = 'receiver@qq.com'

# 邮箱账号和密码
mail_user = 'sender@163.com'
mail_password = 'password'

# 发送邮件
smtp_server = 'smtp.163.com'
smtp_port = 25
server = smtplib.SMTP(smtp_server, smtp_port)
server.login(mail_user, mail_password)
server.sendmail(mail_user, [message['To']], message.as_string())
server.quit()

以上代码中,使用email模块构建了一个邮件对象message,包括邮件正文、主题、发件人和收件人。然后使用smtplib模块连接邮件服务器并发送邮件。

三、SMTP邮件的进阶用法

1. 发送附件

除了文本内容以外,我们还可以发送附件。具体做法是将文件读取为二进制内容,再使用email模块构建MIMEBase对象,并将其添加到MIMEMultipart对象中。

下面是一个发送带有附件的邮件示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE
from email import encoders
from email.header import Header
import os

# 邮件内容和主题
mail_content = '这是一封带有附件的测试邮件。'
subject = '测试邮件'

# 发件人和收件人
from_addr = 'sender@163.com'
to_addrs = ['receiver@qq.com']

# 发送附件
file_path = '附件文件路径'
filename = '附件名称'
file = open(file_path, 'rb')
file_data = file.read()
file.close()
part = MIMEBase('application', 'octet-stream')
part.set_payload(file_data)
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=('gb2312', '', filename))

# 邮件对象
msg = MIMEMultipart()
msg['From'] = from_addr
msg['To'] = COMMASPACE.join(to_addrs)
msg['Subject'] = Header(subject, 'utf-8')
msg.attach(MIMEText(mail_content, 'plain', 'utf-8'))
msg.attach(part)

# 发送邮件
smtp_server = 'smtp.163.com'
smtp_port = 25
smtp_user = 'sender@163.com'
smtp_password = 'password'
server = smtplib.SMTP(smtp_server, smtp_port)
server.login(smtp_user, smtp_password)
server.sendmail(from_addr, to_addrs, msg.as_string())
server.quit()

2. 发送HTML邮件

如果需要发送HTML格式的邮件,只需要在MIMEText对象中指定'mimetype'为text/html即可。

下面是一个发送HTML邮件的示例:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# HTML内容
mail_content = '<h1>这是一封测试邮件</h1><p>邮件正文内容。</p>'

# 邮件对象
message = MIMEText(mail_content, 'html', 'utf-8')
message['Subject'] = Header('测试邮件', 'utf-8')
message['From'] = 'sender@163.com'
message['To'] = 'receiver@qq.com'

# 发送邮件
smtp_server = 'smtp.163.com'
smtp_port = 25
mail_user = 'sender@163.com'
mail_password = 'password'
server = smtplib.SMTP(smtp_server, smtp_port)
server.login(mail_user, mail_password)
server.sendmail(mail_user, [message['To']], message.as_string())
server.quit()

3. 发送带图片的邮件

如果需要在邮件中嵌入图片,需要使用cid和Content-ID进行引用。具体做法是将图片读取为二进制内容,然后使用MIMEImage对象构建相关内容。

下面是一个发送带图片的邮件的示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.header import Header

# 邮件内容和主题
mail_content = '<h1>这是一封带图片的测试邮件</h1><p><img src="cid:image1"></p>'
subject = '测试邮件'

# 发件人和收件人
from_addr = 'sender@163.com'
to_addrs = ['receiver@qq.com']

# 读取图片和邮件内容
image_path = '图片文件路径'
image_file = open(image_path, 'rb').read()
msg = MIMEMultipart()
msg['From'] = from_addr
msg['To'] = ','.join(to_addrs)
msg['Subject'] = Header(subject, 'utf-8')
msg.attach(MIMEText(mail_content, 'html', 'utf-8'))

# 添加图片
image = MIMEImage(image_file)
image.add_header('Content-ID', '<image1>')
msg.attach(image)

# 发送邮件
smtp_server = 'smtp.163.com'
smtp_port = 25
smtp_user = 'sender@163.com'
smtp_password = 'password'
server = smtplib.SMTP(smtp_server, smtp_port)
server.login(smtp_user, smtp_password)
server.sendmail(from_addr, to_addrs, msg.as_string())
server.quit()

四、总结

Python SMTP邮件是一种简单、方便的发送邮件方式。使用Python内置的smtplib和email模块,可以快速实现邮件的发送。不仅可以发送文本邮件,还可以发送带有附件、HTML内容和图片的邮件。