在日常工作和生活中,我们经常需要发送邮件,比如批量通知、营销推广、日报自动发送、服务器告警提醒等。手动发送邮件不仅繁琐,而且容易出错。幸运的是,python提供了强大的smtplib和email模块,可以实现邮件的自动化发送,无论是纯文本邮件,还是带附件、html格式的邮件,都能轻松搞定。本文将详细介绍如何使用python批量发送邮件、添加附件、发送html邮件,并结合schedule实现定时邮件发送,让你的工作更智能、更高效。
一、环境准备与基础操作
1. 安装必要库
python自带的smtplib和email模块无需额外安装,但如果你需要定时发送邮件,可以安装schedule库。安装命令如下:
pip install schedule
2. 配置邮箱
以qq邮箱为例,登录qq邮箱后,在设置中找到“账户”选项,开启pop3/smtp服务,并获取授权码(用于代替密码)。其他邮箱的配置过程大同小异,一般需要开启smtp服务并生成授权码。
3. 发送简单邮件
下面是一个发送简单文本邮件的示例代码:
import smtplib from email.mime.text import mimetext def send_email(subject, content, to_addr): # 邮件配置 from_addr = 'your_email@qq.com' password = 'your_authorization_code' # 授权码 # 创建邮件内容 msg = mimetext(content, 'plain', 'utf-8') msg['from'] = from_addr msg['to'] = to_addr msg['subject'] = subject # 发送邮件 try: server = smtplib.smtp_ssl('smtp.qq.com', 465) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit() print("邮件发送成功") except exception as e: print(f"邮件发送失败:{str(e)}") # 使用示例 send_email('测试邮件', '这是一封测试邮件', 'recipient@example.com')
在这段代码中,我们首先导入了必要的库,然后定义了send_email函数,用于发送邮件。在函数内部,我们设置了发件人邮箱、授权码和收件人邮箱,并创建了邮件内容。接着,我们使用smtp服务器发送邮件,并处理可能的异常。
二、邮件内容高级处理
1. 发送html格式邮件
html格式的邮件可以包含超链接、图片和自定义样式,使邮件内容更加美观。下面是一个发送html格式邮件的示例代码:
from email.mime.text import mimetext def send_html_email(subject, html_content, to_addr): from_addr = 'your_email@qq.com' password = 'your_authorization_code' msg = mimetext(html_content, 'html', 'utf-8') msg['from'] = from_addr msg['to'] = to_addr msg['subject'] = subject try: server = smtplib.smtp_ssl('smtp.qq.com', 465) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit() print("邮件发送成功") except exception as e: print(f"邮件发送失败:{str(e)}") # 使用示例 html_content = """ <h1>月度报告</h1> <p>以下是本月的主要数据:</p> <ul> <li>销售额:¥120,000</li> <li>新增客户:15</li> <li>客户满意度:95%</li> </ul> """ send_html_email('月度报告', html_content, 'manager@example.com')
在这段代码中,我们只需要将邮件内容设置为html格式的字符串,并将mimetext的第二个参数设置为'html'即可。
2. 使用模板生成邮件内容
为了简化邮件内容的编写,我们可以使用模板生成邮件内容。下面是一个使用模板生成html邮件内容的示例代码:
from string import template from email.mime.text import mimetext def generate_email_content(template_file, data): with open(template_file, 'r', encoding='utf-8') as file: template = template(file.read()) return template.substitute(data) # 模板文件示例(template.html) """ <h1>${title}</h1> <p>亲爱的${name}:</p> <p>${content}</p> <p>截止日期:${deadline}</p> """ # 使用示例 data = { 'title': '项目进度提醒', 'name': '张经理', 'content': '请及时提交项目进度报告', 'deadline': '2023-10-15' } html_content = generate_email_content('template.html', data) send_html_email('项目提醒', html_content, 'manager@example.com')
在这段代码中,我们首先定义了generate_email_content函数,用于从模板文件中读取模板,并使用提供的数据替换模板中的占位符。然后,我们使用示例数据和模板文件生成html邮件内容,并调用send_html_email函数发送邮件。
三、邮件附件处理
1. 添加单个附件
在发送邮件时,我们有时需要添加附件,比如pdf、excel、图片等。下面是一个添加单个附件的示例代码:
from email.mime.multipart import mimemultipart from email.mime.base import mimebase from email import encoders def send_email_with_attachment(subject, content, to_addr, attachment_path): from_addr = 'your_email@qq.com' password = 'your_authorization_code' msg = mimemultipart() msg['from'] = from_addr msg['to'] = to_addr msg['subject'] = subject # 添加正文 msg.attach(mimetext(content, 'plain', 'utf-8')) # 添加附件 with open(attachment_path, 'rb') as file: part = mimebase('application', 'octet-stream') part.set_payload(file.read()) encoders.encode_base64(part) part.add_header('content-disposition', f'attachment; filename={attachment_path}') msg.attach(part) try: server = smtplib.smtp_ssl('smtp.qq.com', 465) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit() print("邮件发送成功,附件已附带!") except exception as e: print(f"邮件发送失败:{str(e)}") # 使用示例 send_email_with_attachment('带附件的邮件', '请查收附件', 'recipient@example.com', 'monthly_report.pdf')
在这段代码中,我们使用了mimemultipart对象来创建邮件,并使用mimebase和encoders模块来添加附件。注意,在添加附件时,我们需要将附件文件以二进制模式打开,并读取其内容。
2. 批量添加附件
如果需要批量添加附件,我们可以对上面的代码进行简单的修改。下面是一个批量添加附件的示例代码:
def send_email_with_attachments(subject, content, to_addr, attachment_paths): from_addr = 'your_email@qq.com' password = 'your_authorization_code' msg = mimemultipart() msg['from'] = from_addr msg['to'] = to_addr msg['subject'] = subject # 添加正文 msg.attach(mimetext(content, 'plain', 'utf-8')) # 添加多个附件 for path in attachment_paths: with open(path, 'rb') as file: part = mimebase('application', 'octet-stream') part.set_payload(file.read()) encoders.encode_base64(part) part.add_header('content-disposition', f'attachment; filename={path}') msg.attach(part) try: server = smtplib.smtp_ssl('smtp.qq.com', 465) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit() print("邮件发送成功,多个附件已附带!") except exception as e: print(f"邮件发送失败:{str(e)}") #使用示例 attachment_paths = ['report1.pdf', 'report2.xlsx', 'image.jpg'] send_email_with_attachments('带多个附件的邮件', '请查收所有附件', 'recipient@example.com', attachment_paths)
在这段代码中,我们只需对attachment_paths列表进行迭代,为每个附件执行相同的添加步骤即可。
四、结合schedule实现定时邮件发送
使用schedule库,我们可以轻松实现定时邮件发送。下面是一个结合schedule发送定时邮件的示例代码:
import schedule import time #定时发送邮件的函数 def scheduled_email(): subject = '定时提醒' content = '这是一封定时发送的邮件' to_addr = 'recipient@example.com' send_email(subject, content, to_addr) #设定每天上午9点发送邮件 schedule.every().day.at("09:00").do(scheduled_email) #保持脚本运行,检查并执行定时任务 while true: schedule.run_pending() time.sleep(1)
在这段代码中,我们首先定义了scheduled_email函数,该函数调用之前定义的send_email函数来发送邮件。然后,我们使用schedule.every().day.at("09:00").do(scheduled_email)来设定每天上午9点执行scheduled_email函数。最后,我们使用一个无限循环来保持脚本运行,并不断检查是否有定时任务需要执行。
注意:在实际应用中,直接将脚本放在无限循环中运行可能不是最佳实践。你可以考虑使用操作系统的计划任务功能(如windows的任务计划程序或linux的cron作业)来定期运行python脚本。
五、总结
通过本文,我们学习了如何使用python的smtplib和email模块来发送简单邮件、html格式邮件、带附件的邮件,并结合schedule库实现了定时邮件发送。这些技巧可以大大提高你的工作效率,减少手动发送邮件的繁琐和出错率。无论是日常通知、营销推广、日报发送还是服务器告警提醒,python都能帮你轻松搞定。
到此这篇关于python轻松实现批量邮件自动化详解的文章就介绍到这了,更多相关python邮件自动化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论