Python SMTP发送邮件的10段常用代码


【蜂邮EDM】:邮件群发系统,EDM邮件营销平台,邮件代发服务。 查看价格
【AokSend邮件API】:触发式邮件API,15元/万封,99%送达率。 查看价格
【烽火邮箱】:新人领取免费域名邮箱,可用作企业邮箱公司邮箱。 查看价格
Python SMTP 发送邮件的 10 段常用代码
随着互联网的快速发展,发送邮件已经成为企业日常运营中不可或缺的一部分。而在发送邮件的过程中,如何高效地实现邮件发送,尤其是通过 Python 编程来实现,已经成为很多开发者关注的重点。其中,使用 SMTP(Simple Mail Transfer Protocol)协议是一种非常常见的邮件发送方式,因为它支持跨域的邮件传输,适合用于企业级的邮件系统。
在本篇文章中,我们将深入探讨如何利用 Python 的 SMTP 操作,编写 10 段常用的代码示例,并通过详细的解释和注释,帮助读者更好地理解和掌握这些代码的应用场景和优化方法。
1. 导入必要的库
在 Python 中使用 SMTP 发送邮件,首先需要导入相关的库。最常用的是 smtplib
库,它提供了一个 Python 接口来与 SMTP 服务器通信。此外,我们还可以使用 email
库来处理邮件内容的编码和格式化。
from smtplib import *import email
关键词: smtplib
库,email
库,SMTP
协议
2. 创建一个基本的 SMTP 发送邮件函数
为了简化邮件发送的过程,我们可以编写一个函数,接受发送方信息、收件人地址、邮件正文等参数,并在函数内部完成邮件发送的全部操作。
def send_email(sender, recipients, subject, message): # 连接到 SMTP 服务器 server = 'smtp.example.com' # 根据实际服务器地址进行调整 port = 587 # SMTP 服务器的端口 # 建立一个 SMTP 对象 serverobj =.SMTP(server, port) # 连接方式:从客户端出发(即从计算机出发,通过 SMTP 服务器发送邮件) serverobj.ehlo() serverobj.starttls() # 启用 SSL/TLS 加密传输 # 登录到 SMTP 服务器 serverobj.login(sender, 'your_password') # 替换为实际的密码 # 发送邮件 serverobj.sendmail(sender, recipients, subject, message) # 关闭 SMTP 对象 serverobj.quit()
关键词: SMTP
协议,smtplib
库,sendmail
方法,starttls
方法
解释:
server
和port
是 SMTP 服务器的地址和端口,需要根据实际情况进行调整。starttls
方法用于启用 SSL/TLS 加密传输,确保邮件传输的安全性。sendmail
方法用于发送邮件,其参数包括发送方地址、收件人地址、主题和正文。
3. 测试代码 - 基本邮件发送
接下来,我们测试一下上面编写的基本邮件发送函数。假设我们有以下收件人信息:
recipients = ['user1@example.com', 'user2@example.com']subject = '测试邮件:这是测试邮件吗?'message = '这是您的测试邮件正文。'sender = 'test@example.com'
调用 send_email
函数:
send_email(sender, recipients, subject, message)
关键词: 测试邮件
,邮件正文
,收件人列表
解释:
- 这部分代码主要用于测试邮件发送功能,确保 SMTP 服务器连接正常,并且邮件能够正确发送。
- 在实际应用中,建议在发送前添加邮件发送日志,以确保邮件确实被发送。
4. 添加邮件发送的优化措施
在邮件发送过程中,优化措施是非常重要的。以下是一些常见的优化方法:
4.1 设置邮件发送的超时时间
有时候,由于网络问题或 SMTP 服务器的繁忙,邮件发送可能会超时。我们可以设置邮件发送的超时时间,以避免邮件被标记为未发送。
🔔🔔🔔 【烽火邮箱】:烽火邮箱是一款简洁高效的企业邮箱平台,新客户赠送免费企业邮箱,一个起卖、按月付费(低至9.9元);支持别名邮箱及群组邮箱,支持定制无限邮箱。高权重纯净IP池,系统自带反垃圾机制。
立即查看 >> :企业邮箱价格
【蜂邮EDM】:邮件群发系统,EDM邮件营销平台,邮件代发服务,专业研发定制邮件营销系统及邮件群发解决方案!蜂邮自研产品线主要分为标准版、外贸版、企业版、定制版,及邮件API邮件SMTP接口服务。
立即查看 >> :邮件发送价格
【AokSend邮件API】:专注触发式邮件API发送服务。15元/万封,发送验证码邮件、忘记密码邮件、通知告警邮件等,不限速。综合送达率99%、进箱率98%。触发邮件也叫事务性邮件或推送邮件,包含:验证码邮件、重置密码邮件、余额提醒邮件、会员到期邮件、账号认证邮件等!
立即查看 >> :邮件发送价格
import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextimport timedef send_email_with_timeout(sender, recipients, subject, message): timeout = 60 # 60 秒的超时时间 try: server = smtplib.SMTP('smtp.example.com', 587) server.starttls() server.login(sender, 'your_password') server.sendmail(sender, recipients, subject, message) server.quit() except smtplib.SMTPException as e: if time_since_last Send < timeout: send_email_with_timeout(sender, recipients, subject, message) else: print(f"邮件发送失败,已等待{timeout}秒。") return except Exception as e: print(f"邮件发送失败,错误信息:{str(e)}")
关键词: 超时时间
,smtplib
库,SMTP
协议
解释:
timeout
设置为 60 秒,表示如果邮件发送超时,函数会自动重试。- 通过
time_since_last Send
来判断是否需要再次发送邮件。
5. 添加邮件发送的安全措施
在发送邮件时,安全性是非常重要的。以下是一些常见的安全措施:
5.1 邮件内容加密
为了防止邮件内容被截获或篡改,我们可以将邮件内容加密。
def send_encrypted_email(sender, recipients, subject, message): # 配置加密参数 encryption_key = 'your_encryption_key' decryption_key = 'your_decryption_key' # 加密邮件正文 encrypted_message = encrypt(message, encryption_key) # 调用 send_email 函数 send_email(sender, recipients, subject, encrypted_message)
关键词: 邮件内容加密
,加密参数
,encrypt
函数
解释:
- 需要在实际应用中实现
encrypt
函数,用于对邮件正文进行加密。 - 解密时,使用
decryption_key
来解密邮件正文。
6. 批量发送邮件
在实际应用中,往往会需要批量发送邮件。以下是一个简单的批量邮件发送函数。
def send_batch_emails(sender, recipients_list, subject, message template): import smtplib import email # 配置 SMTP 服务器信息 server = 'smtp.example.com' port = 587 # 连接到 SMTP 服务器 serverobj = smtplib.SMTP(server, port) serverobj.starttls() serverobj.login(sender, 'your_password') for recipient in recipients_list: # 替换模板中的占位符 message = message template.replace('RECEPIENT_NAME', recipient) # 发送邮件 serverobj.sendmail(sender, recipient, subject, message) serverobj.quit()
关键词: 批量发送
,邮件模板
,smtplib
库
解释:
recipients_list
是一个包含所有收件人地址的列表。message template
是一个包含占位符的邮件正文,用于将不同的收件人地址替换进去。
7. 邮件合并 - 将多封邮件合并为一封
在某些情况下,需要将多封邮件合并为一封,例如将邮件正文、附件等合并到同一封邮件中。以下是一个简单的示例:
def send_merged_email(sender, recipients, subject, main_message, additional_attachments=None): import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase # 创建一个合并邮件 msg = MIMEMultipart() msg['From'] = sender msg['To'] = ', '.join(recipients) msg['Subject'] = subject # 添加正文 main_part = MIMEText(main_message, 'plain') msg.attach(main_part) # 添加附件(如果有) if additional_attachments is not None: for attachment in additional_attachments: with open(attachment, 'rb') as f: part = MIMEBase('application/x-binary', 'octet-stream') part.set_header('Content-Disposition', 'attachment', filename=attachment) part.add_header('Content-Disposition', 'inline', filename=attachment) part.set_payload(f.read()) msg.attach(part) # 连接到 SMTP 服务器 server = smtplib.SMTP('smtp.example.com', 587) server.starttls() server.login(sender, 'your_password') # 发送邮件 server.sendmail(sender, recipients, subject, msg.as_string()) # 关闭 SMTP 对象 server.quit()
关键词: 邮件合并
,MIMEMultipart
,MIMEText
,MIMEBase
,as_string()
方法
解释:
- 使用
MIMEMultipart
来创建合并邮件。 - 使用
MIMEText
来添加正文,使用MIMEBase
来添加附件。 as_string()
方法用于将合并邮件的二进制表示转换为字符串,以便发送。
8. 批量处理旧邮件
在某些情况下,需要批量处理旧邮件,例如删除已发送的邮件或标记已发送的邮件。以下是一个简单的示例:
def batch_process_old_emails(): import smtplib import email import os import time # 配置 SMTP 服务器信息 server = 'smtp.example.com' port = 587 # 连接到 SMTP 服务器 serverobj = smtplib.SMTP(server, port) serverobj.starttls() serverobj.login('test@example.com', 'your_password') # 获取已发送邮件列表 with open('sent_emails.txt', 'r') as f: sent_emails = f.read().splitlines() # 遍历所有邮件 for email_address in sent_emails: try: serverobj.sendmail('test@example.com', email_address, '邮件状态更新', '邮件已发送!') print(f"已发送邮件:{email_address}") except smtplib.SMTPException as e: print(f"无法发送邮件:{email_address}, 错误信息:{str(e)}") # 重置邮件发送计数器 with open('sent_emails.txt', 'w') as f: f.write('') serverobj.quit()
关键词: 批量处理
,旧邮件
,sent_emails.txt
,smtplib
库
解释:
- 使用
sent_emails.txt
文件记录已发送的邮件地址。 - 在循环中,尝试发送测试邮件,确保邮件发送计数器正常工作。
9. 自动化定时发送邮件
为了提高邮件发送效率,可以编写一个脚本来实现定时发送邮件。以下是一个简单的示例:
import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextimport timedef automated_email_sender(sender, recipients, subject, message): # 配置 SMTP 服务器信息 server = 'smtp.example.com' port = 587 # 创建一个合并邮件 msg = MIMEMultipart() msg['From'] = sender msg['To'] = ', '.join(recipients) msg['Subject'] = subject # 添加正文 main_part = MIMEText(message, 'plain') msg.attach(main_part) # 连接到 SMTP 服务器 serverobj = smtplib.SMTP(server, port) serverobj.starttls() serverobj.login(sender, 'your_password') # 发送邮件 serverobj.sendmail(sender, recipients, subject, msg.as_string()) # 设置定时器 serverobj.quit() # 设置下一个发送时间 next_send_time = time.strftime('%H:%M:%S', time.localtime() + timedelta(hours=1)) while time.strftime('%H:%M:%S', time.localtime()) < next_send_time: serverobj.sendmail(sender, recipients, subject, msg.as_string()) time.sleep(60) serverobj.quit()
关键词: 定时发送
,MIMEMultipart
,MIMEText
,timedelta
,time.strftime()
,time.sleep()
解释:
- 使用
timedelta
来设置发送间隔。 - 使用
time.strftime
来获取当前时间,比较是否需要继续发送邮件。
10. 邮件链式发送 - 将邮件发送与附件上传链式操作
在某些情况下,需要将邮件发送与附件上传链式操作结合在一起。以下是一个简单的示例:
def send_email(sender, recipients, subject, message): # 连接到 SMTP 服务器 server = 'smtp.example.com' # 根据实际服务器地址进行调整 port = 587 # SMTP 服务器的端口 # 建立一个 SMTP 对象 serverobj =.SMTP(server, port) # 连接方式:从客户端出发(即从计算机出发,通过 SMTP 服务器发送邮件) serverobj.ehlo() serverobj.starttls() # 启用 SSL/TLS 加密传输 # 登录到 SMTP 服务器 serverobj.login(sender, 'your_password') # 替换为实际的密码 # 发送邮件 serverobj.sendmail(sender, recipients, subject, message) # 关闭 SMTP 对象 serverobj.quit()
0


【蜂邮EDM】:邮件群发系统,EDM邮件营销平台,邮件代发服务。 查看价格
【AokSend邮件API】:触发式邮件API,15元/万封,99%送达率。 查看价格
【烽火邮箱】:新人领取免费域名邮箱,可用作企业邮箱公司邮箱。 查看价格