Python之smtplib模块

工作中难免会出现自动发送电子邮件的需求,比如说做完自动化测试之后通过电子邮件的形式将结果反馈出来。Python中提供了标准库smtplib来解决这一问题,该模块定义了一个smtp客户端会话对象,能够将邮件发送给smtp服务端。具体用法请查看下面例子。

import smtplib
from email.mime.text import MIMEText


def send_email(from_user_name, from_address, password, to_address_list, subject, content, smtp_host):
    """
    :param from_user_name: str> 发送邮箱的用户名
    :param from_address: str> 发送邮箱地址
    :param password: str> 发送邮箱密码
    :param to_address_list: list> 接收邮箱地址
    :param subject: str> 邮件主题
    :param content: str> 邮件内容
    :param smtp_host: str> smtp服务器地址
    :return send_result: bool > 邮件是否发送成功
    """
    smtp = smtplib.SMTP(smtp_host, 465)
    smtp.starttls()
    smtp.set_debuglevel(1)
    smtp.ehlo(smtp_host)
    smtp.login(from_address, password)
    msg = MIMEText(content, _subtype='html', _charset='utf-8')
    msg['From'] = u'%s<%s>' % (from_user_name, from_address)
    msg['To'] = ",".join(to_address_list)
    msg['Subject'] = subject

    send_result = False
    try:
        smtp.sendmail(from_address, to_address_list, msg.as_string())
        send_result = True
    except smtplib.SMTPException as e:
        print(str(e))
        send_result = False
    finally:
        smtp.quit()
        return send_result


if __name__ == '__main__':
    send_email(
        from_user_name='from_user_name',
        from_address='from_address@xxx.com',
        password='email_password',
        to_address_list=['a@xxx.com', 'b@xxx.com'],
        subject='test_subject',
        content='test_content',
        smtp_host='smtp.xxx.com'
    )

该例子中定义了send_email()函数实现了连接smtp服务端、登录邮箱、发送邮件等功能。其中 smtplib.SMTP(smtp_host, 465) 在初始化实力时就已经进行了smtp连接,需要传入服务端的host和port,所以入参465并不是固定的,要根据服务端的端口号来改变。

登录SMTP服务器时往往会进行身份验证,这里用到了 smtp.login(from_address, password), 入参是用于验证的用户名和密码。

登录完成后,可以通过 smtp.sendmail(from_address, to_address_list, msg.as_string()) 把邮件发送给服务端,入参是发件人地址、收件人地址及邮件内容。