Python 发送邮件方法总结

yizhihongxing

Python 发送邮件是一项非常常用的操作,本文将对 Python 发送邮件的方法进行详细、全面的介绍,包括邮件的基本原理、Python 发送邮件的三种方法以及常见错误及解决方案。

邮件的基本原理

在介绍 Python 发送邮件的方法前,我们需要了解邮件发送的基本过程和原理。邮件发送的过程可以简单归纳为以下几个步骤:

  1. 用户通过邮件客户端编写邮件,并提交邮件到邮件服务器;
  2. 邮件服务器对邮件进行验证、处理和转发;
  3. 如果目标邮件地址是本地用户,则直接交给本地邮箱;
  4. 如果目标邮件地址不是本地用户,则通过 SMTP 协议将邮件发送到目标邮件服务器;
  5. 目标邮件服务器接收邮件,并将邮件投递到目标用户的邮箱。

在发送邮件的过程中,SMTP(Simple Mail Transfer Protocol) 是一个非常重要的协议。它定义了邮件在网络上传输的标准,主要有以下几个重要步骤:

  1. 连接到目标邮箱服务器;
  2. 发送 HELO 命令,表示开始与目标服务器的通信;
  3. 发送 AUTH 命令,进行认证;
  4. 发送 MAIL FROM 命令,表示发件人地址;
  5. 发送 RCPT TO 命令,表示收件人地址;
  6. 发送 DATA 命令,开始发送邮件内容;
  7. 发送 . 命令,表示邮件发送完毕。

Python 发送邮件的三种方法

Python 发送邮件有多种方法,本文将重点介绍下面三种:

  1. 使用 Python 的 smtplib 模块;
  2. 使用 Python 的 email 模块;
  3. 使用 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 发送邮件的过程中,可能会遇到一些常见的错误。下面列出其中三个可能出现的错误及解决方案:

  1. SMTPEmptyResponse;
    解决方案:检查邮箱用户名、密码以及端口等信息是否填写正确。

  2. SMTPAuthenticationError;
    解决方案:检查邮箱用户名和密码是否填写正确。

  3. SMTPDataError;
    解决方案:检查邮件内容是否符合标准的邮件格式,例如是否添加了发件人、收件人、主题等必要项。

以上就是 Python 发送邮件的方法总结,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 发送邮件方法总结 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • Python使用正则表达式实现爬虫数据抽取

    以下是Python使用正则表达式实现爬虫数据抽取的完整攻略: 步骤1:导入re和requests模块 在Python中使用正则表达式进行爬虫数据抽取需要导入re和requests模块。re模块用于处理正则表达式,requests模块用于发送HTTP请求和获取响应。可以使用以下代码导入: import re import requests 步骤2:发送HTTP…

    python 2023年5月14日
    00
  • 在Python中使用K-Means聚类和PCA主成分分析进行图像压缩

    下面我将详细讲解“在Python中使用K-Means聚类和PCA主成分分析进行图像压缩”的完整攻略。 一、背景知识 在学习本攻略前,需要掌握以下知识: Python编程基础 NumPy库基础 matplotlib库基础 K-Means聚类算法 PCA主成分分析算法 二、图像压缩原理 对于一张彩色图片,它通常由三个颜色通道(R、G、B)组成。假设每个通道都是8…

    python 2023年5月18日
    00
  • Python MD5加密实例详解

    Python MD5加密实例详解 什么是MD5加密 MD5(Message-Digest Algorithm 5),中文名为“消息摘要算法5”,是一种基于哈希算法的加密方法,可以将任意长度的消息压缩为一个128位的消息摘要。MD5加密算法可用于数据加密、数字签名、与SSL证书一起保护Web页面的完整性以及密码加密等领域。 Python中的MD5加密 Pyth…

    python 2023年6月2日
    00
  • python实现大文件分割与合并

    接下来我将会详细讲解Python实现大文件分割与合并的完整攻略,同时给出两个示例说明。 1. 大文件分割 1.1 背景 在日常工作中,有时候我们会遇到需要将大文件分割成若干个小文件的情况,以便于上传、备份、压缩等操作。Python作为一门强大的编程语言,可以方便地实现大文件的分割。 1.2 实现步骤 确定文件路径及分割大小(单位为MB): import os…

    python 2023年5月19日
    00
  • 使用urllib库的urlretrieve()方法下载网络文件到本地的方法

    使用urllib库的urlretrieve()方法可以方便地下载网络上的文件到本地。下面是该方法的完整攻略: 1. 引入urllib库 import urllib.request 2. 定义本地文件保存路径和网络文件的url地址 url = ‘http://example.com/file.txt’ save_path = ‘D:/downloads/fil…

    python 2023年6月3日
    00
  • python 在threading中如何处理主进程和子线程的关系

    来讲一下“python 在threading中如何处理主进程和子线程的关系”的完整攻略。 1. 使用 threading 模块创建子线程 在 Python 中使用 threading 模块创建子线程非常简单。代码如下: import threading def worker(): print("子线程执行中") t = threading…

    python 2023年5月19日
    00
  • Python如何获取多线程返回结果

    获取多线程返回结果是使用Python多线程编程的重要部分。下面我们将分为以下几个步骤来详细讲解如何获取多线程返回结果。 1.导入必要的库 首先,建议导入必要的库: threading和Queue。 import threading from queue import Queue 2.创建线程类 在创建线程的时候,我们可以通过Thread类继承并重写run()…

    python 2023年5月18日
    00
  • python使用json将字符串转字典报错的解决

    当我们使用Python内置的json库将字符串转换为字典时,如果字符串格式不符合json标准格式,就会导致转换失败并出现报错。下面介绍两种可能出现的报错情况以及相应的解决方法: 1. JSONDecodeError: Expecting property name enclosed in double quotes: 当我们尝试使用json库将一个字符串转换…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部