邮件列表管理器

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、发送成功后的效果如下:

猜你喜欢

转载自www.cnblogs.com/su-sir/p/12506585.html