1、首先python有一个自带的简单邮件传输协议(SMTP)服务器,可以用来测试
开启邮件服务的命令是:python -m smtpd -n -c DebuggingServer localhost:1025
2、邮件管理器代码:
import smtplib from email.mime.text import MIMEText from collections import defaultdict def send_email(subject, message, from_addr, *to_addrs, host="localhost", port=1025, headers=None): # 这是固定写法,有疑问可以参考邮件模块的官方文档 headers = {} if headers is None else headers email = MIMEText(message) email['Subject'] = subject email['From'] = from_addr for header, value in headers.items(): email[header] = value sender = smtplib.SMTP(host, port) for addr in to_addrs: del email['To'] email['To'] = addr sender.sendmail(from_addr, addr, email.as_string()) sender.quit() class MailingList: def __init__(self): self.email_map = defaultdict(set) # 保证字典的值总是唯一的 def add_to_group(self, email, group): # 添加邮件组 self.email_map[email].add(group) def emails_in_groups(self, *groups): # 去重 groups = set(groups) return (e for (e,g) in self.email_map.items() if g & groups) # 取交集 def send_mailing(self, subject, message, from_addr, *groups, **kwargs): # 调用发送函数,发送邮件 emails = self.emails_in_groups(*groups) send_email(subject,message,from_addr, *emails, **kwargs) # 测试数据,如果开启了邮件服务,可以看到发送数据 m = MailingList() m.add_to_group("[email protected]", "g1") m.add_to_group("[email protected]", "g1") m.add_to_group("[email protected]", "g2") m.add_to_group("[email protected]", "g2") m.send_mailing("Party", "聚会邀请函", "[email protected]", "g1", "g2", headers={"Reply-To":"[email protected]"}) # Reply-To 这个参数代表:信息来源的地址(可以和发送人的地址一样,也可以不一样) # Return-Path:这个参数代表:返回路径,就是收件人收到消息后,可以回消息给发送人
3、发送成功后的效果如下: