专栏导读
-
🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
-
-
-
-
📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅
-
文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
-
❤️ 欢迎各位佬关注! ❤️
库的介绍
-
为了编写一个利用Python进行办公自动化,特别是批量发送邮件(包括收件人、抄送人和附件)的脚本,我们可以使用smtplib库来处理SMTP邮件发送,以及email模块来构建邮件内容。以下是一个简单的示例脚本,展示了如何实现这一功能:
-
首先,确保你有Python环境,并且安装了必要的库(虽然smtplib和email模块是Python标准库的一部分,所以你通常不需要额外安装)。
库的安装
内置库,无需安装
-
批量发送时需要读取Excel,需安装pandas,或 openpyxl
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/
1、确定SMTP服务器地址、端口、发件人邮箱、密码
smtp_server = "smtp.example.com" # 填入 SMTP 服务器地址
smtp_port = 9025 # 填入 SMTP 端口
sender_password = "xxxxxxx" # 填入 发件人密码
2、设置批量发送模板
["发件人邮箱","收件人邮箱(多个封号隔开-英文输入法)","抄送人邮箱(多个封号隔开-英文输入法)","邮件主题","邮件正文","附件路径"]
3、读取模板
sender_email = row[0] # 发件人邮箱,类型:字符串
recipients = row[1].split(';') # 收件人列表,类型:列表
cc_recipients = [row[2].split(';')] # 抄送人列表,类型:列表
subject = row[3] # 邮件主题,类型:字符串
body = row[4] # 邮件内容,类型:字符串
attachments = [row[5]] # 附件路径列表,类型:列表
df = pd.read_excel('./发送模板/' + os.listdir('./发送模板/')[0], dtype=str, keep_default_na='')
for row in df.values.tolist():
sender_email = row[0]
recipients = row[1].split(';')
cc_recipients = [row[2].split(';')]
subject = row[3]
body = row[4]
attachments = [row[5]]
4、设置发送失败日志
5、完整版代码
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
import openpyxl
import pandas as pd
wb = openpyxl.Workbook()
ws = wb.active
ws.append(["发件人邮箱", "收件人邮箱", "抄送人邮箱", "邮件主题", "邮件内容", "附件路径"])
def send_bulk_email(smtp_server, smtp_port, sender_email, sender_password, recipients, cc_recipients, subject, body,
attachments=[]):
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(sender_email, sender_password)
for recipient, cc in zip(recipients, cc_recipients):
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = recipient
msg['Cc'] = ";".join(cc)
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
for file_path in attachments:
attachment = MIMEBase('application', 'octet-stream')
try:
with open(file_path, 'rb') as attachment_file:
attachment.set_payload(attachment_file.read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', f'attachment; filename={os.path.basename(file_path)}')
msg.attach(attachment)
except Exception as e:
print(f"添加附件 {file_path} 时发生错误: {e}")
all_recipients = [recipient] + cc
server.sendmail(sender_email, all_recipients, msg.as_string())
print(f"邮件已发送至 {recipient} (抄送: {';'.join(cc)})")
server.quit()
print("所有邮件已成功发送")
except Exception as e:
print(f"发送邮件时发生错误: {e}")
return False
if __name__ == "__main__":
smtp_server = "smtp.example.com"
smtp_port = 9025
sender_password = "xxxxx"
df = pd.read_excel('./发送模板/' + os.listdir('./发送模板/')[0], dtype=str, keep_default_na='')
for row in df.values.tolist():
sender_email = row[0]
recipients = row[1].split(';')
cc_recipients = [row[2].split(';')]
subject = row[3]
body = row[4]
attachments = [row[5]]
state = send_bulk_email(smtp_server, smtp_port, sender_email, sender_password, recipients, cc_recipients,
subject, body, attachments)
if state == False:
ws.append(row)
wb.save("邮件发送失败日志.xlsx")
总结
-
希望对初学者有帮助
-
致力于办公自动化的小小程序员一枚
-
希望能得到大家的【一个免费关注】!感谢
-
求个 🤞 关注 🤞
-
-
求个 ❤️ 喜欢 ❤️
-
-
求个 👍 收藏 👍
-