一、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内容和图片的邮件。