Python实现简单的邮件发送服务

214 阅读1分钟

实现逻辑如下

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib


# 格式化输出地址
def __format_address(r):
    name, address = parseaddr(r)
    return formataddr((Header(name, 'utf-8').encode(), address))


content = '''
人生苦短,我用Python
'''

# 发件人邮箱
from_address = input('请输入发件人邮箱:')
# 邮箱密码
pwd = input('请输入邮箱密码:')
# 邮箱服务器
server_smtp = input('请输入邮箱服务器地址:')
# 收件人邮箱列表
to_address_lists = []


def to_address_list():
    to_address = input('请输入收件人邮箱:')
    to_address_lists.append(to_address)
    while True:
        if_quit = input('是否继续输入邮箱,n退出,其他操作继续输入')
        if if_quit == 'n':
            break
        else:
            to_address = input('请输入收件人邮箱:')
            to_address_lists.append(to_address)


# to_address = input('请输入收件人邮箱:')
to_address_list()

# 邮件的消息内容
msg = MIMEText(content, 'plain', 'utf-8')
# 发件人
msg['From'] = __format_address(u'测试<%s>' % from_address)
# 收件人
list_to = []
for i in to_address_lists:
    list_to.append(__format_address(u'管理员<%s>' % i))

msg['To'] = ','.join(list_to)  # 多个收件人需要以','分割成一个字符串
# 邮件主题
msg['Subject'] = Header(u'这是一封测试邮件', 'utf-8').encode()

# 启动服务
server = smtplib.SMTP_SSL(server_smtp, 465)
# 打印日志
server.set_debuglevel(1)
# 登录邮箱
server.login(from_address, pwd)
# 发送邮件,多个收件人是一个列表[]
server.sendmail(from_address, to_address_lists, msg.as_string())
server.quit()

遇到的问题总结

  • msg['To']的值是有‘,’分割开的一个字符串('test1@163.com, test2@163.com'),而server.sendmail参数中的to_address_lists是一个列表(['test1@163.com','test2@163.com'])

  • formataddr 接受2个参数,第一个是需要转换的值,第二个是编码方式,编码默认是utf-8,可以不传

  • 参考文章