Python 发送邮件是一项非常常用的操作,本文将对 Python 发送邮件的方法进行详细、全面的介绍,包括邮件的基本原理、Python 发送邮件的三种方法以及常见错误及解决方案。
邮件的基本原理
在介绍 Python 发送邮件的方法前,我们需要了解邮件发送的基本过程和原理。邮件发送的过程可以简单归纳为以下几个步骤:
- 用户通过邮件客户端编写邮件,并提交邮件到邮件服务器;
- 邮件服务器对邮件进行验证、处理和转发;
- 如果目标邮件地址是本地用户,则直接交给本地邮箱;
- 如果目标邮件地址不是本地用户,则通过 SMTP 协议将邮件发送到目标邮件服务器;
- 目标邮件服务器接收邮件,并将邮件投递到目标用户的邮箱。
在发送邮件的过程中,SMTP(Simple Mail Transfer Protocol) 是一个非常重要的协议。它定义了邮件在网络上传输的标准,主要有以下几个重要步骤:
- 连接到目标邮箱服务器;
- 发送 HELO 命令,表示开始与目标服务器的通信;
- 发送 AUTH 命令,进行认证;
- 发送 MAIL FROM 命令,表示发件人地址;
- 发送 RCPT TO 命令,表示收件人地址;
- 发送 DATA 命令,开始发送邮件内容;
- 发送 . 命令,表示邮件发送完毕。
Python 发送邮件的三种方法
Python 发送邮件有多种方法,本文将重点介绍下面三种:
- 使用 Python 的 smtplib 模块;
- 使用 Python 的 email 模块;
- 使用 Python 的 MIMEText、MIMEMultipart 和 MIMEImage 类库。
1. 使用 Python 的 smtplib 模块
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件服务器地址和端口号
mail_host = "smtp.xxx.com"
mail_port = 587
# 发件人信息
mail_user = "xxx@xxx.com"
mail_pass = "xxx"
# 收件人信息
to_mail = ["xxx1@xxx.com", "xxx2@xxx.com"]
# 邮件内容
mail_content = """
<p>这是一封测试邮件。</p>
<p>Python 邮件发送测试...</p>
"""
# 构造邮件
msg = MIMEText(mail_content,'html','utf-8')
msg['From'] = "{}".format(mail_user)
msg['To'] = ",".join(to_mail)
msg['Subject'] = Header("Python SMTP 发送邮件测试", 'utf-8').encode()
# 发送邮件
try:
smtpObj = smtplib.SMTP(mail_host, mail_port)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(mail_user, to_mail, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件")
print(e)
上面的代码通过 Python 的 smtplib 模块完成邮件发送的任务。其中,邮件的内容使用 MIMEText 类型构建,邮件的收件人可以是一个 list 类型的数组,邮件的主题使用 Header 进行编码。
2. 使用 Python 的 email 模块
import smtplib
import os
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
# 邮件服务器地址和端口号
mail_host = "smtp.xxx.com"
mail_port = 25
# 发件人信息
mail_user = "xxx@xxx.com"
mail_pass = "xxx"
# 收件人信息
to_mail = ["xxx1@xxx.com", "xxx2@xxx.com"]
# 邮件内容
mail_content = """
<p>这是一封测试邮件。</p>
<p>Python 邮件发送测试...</p>
"""
# 构造邮件正文
msg_text = MIMEText(mail_content, 'html', 'utf-8')
# 构造邮件附件
base_path = 'C:\\Users\\xxx\\Desktop\\Test'
filename = 'test.docx'
file_path = os.path.join(base_path, filename)
msg_app = MIMEMultipart()
attachment = MIMEApplication(open(file_path, 'rb').read())
attachment.add_header('Content-Disposition', 'attachment', filename=filename)
msg_app.attach(attachment)
msg_text = MIMEText(mail_content, 'html', 'utf-8')
msg_app.attach(msg_text)
# 构造邮件标题,发件人、收件人信息
msg_app['Subject'] = Header('Python邮件发送测试', 'utf-8')
msg_app['From'] = Header(mail_user)
msg_app['To'] = ','.join(to_mail)
# 发送邮件
try:
smtp_obj = smtplib.SMTP(mail_host, mail_port)
smtp_obj.login(mail_user, mail_pass)
smtp_obj.sendmail(mail_user, to_mail, msg_app.as_string())
print('邮件发送成功')
except smtplib.SMTPException as e:
print('Error: 无法发送邮件')
print(e)
上面的代码通过 Python 的 email 模块完成邮件发送任务。其中,邮件正文和邮件附件都是使用 MIMEMultipart 类型构建,邮件的收件人可以是一个 list 类型的数组,邮件的主题和发件人信息通过 Header 进行编码。该示例中还附带了一个附件,可以非常方便地将本地文件添加为附件发送。
3. 使用 Python 的 MIMEText、MIMEMultipart 和 MIMEImage 类库
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.header import Header
# 邮件服务器地址和端口号
mail_host = "smtp.xxx.com"
mail_port = 587
# 发件人信息
mail_user = "xxx@xxx.com"
mail_pass = "xxx"
# 收件人信息
to_mail = ["xxx1@xxx.com","xxx2@xxx.com"]
# 邮件内容
mail_content = """
<p>这是一封测试邮件。</p>
<p>Python 邮件发送测试...</p>
<p><img src="cid:image1"></p>
"""
# 构造邮件
msg = MIMEMultipart()
msg['From'] = "{}".format(mail_user)
msg['To'] = ",".join(to_mail)
msg['Subject'] = Header("Python MIME 发送邮件测试", 'utf-8').encode()
# 构造邮件内容
text_content = MIMEText(mail_content,'html','utf-8')
msg.attach(text_content)
# 构造邮件图片
image_path = 'C:\\Users\\xxx\\Desktop\\Test\\test.jpg'
with open(image_path, 'rb') as f:
image_data = f.read()
image = MIMEImage(image_data)
image.add_header('Content-ID', '<image1>')
msg.attach(image)
# 发送邮件
try:
smtpObj = smtplib.SMTP(mail_host, mail_port)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(mail_user, to_mail, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件")
print(e)
上面的代码使用 Python 的 MIMEText、MIMEMultipart 和 MIMEImage 类库完成邮件发送。其中,邮件内容使用 MIMEText 类型构建,邮件图片使用 MIMEImage 类型构建,并使用 Content-ID 设置图片 ID,MIMEMultipart 类型可以同时包含文本和图片等多种内容。
常见错误及解决方案
在 Python 发送邮件的过程中,可能会遇到一些常见的错误。下面列出其中三个可能出现的错误及解决方案:
-
SMTPEmptyResponse;
解决方案:检查邮箱用户名、密码以及端口等信息是否填写正确。 -
SMTPAuthenticationError;
解决方案:检查邮箱用户名和密码是否填写正确。 -
SMTPDataError;
解决方案:检查邮件内容是否符合标准的邮件格式,例如是否添加了发件人、收件人、主题等必要项。
以上就是 Python 发送邮件的方法总结,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 发送邮件方法总结 - Python技术站