【2019.05】python 发送邮件

QQ 邮箱对于第三方收发有着较为严格的限制,在正式进行代码实现的过程之前,我们还需要打开 QQ 的 POP3/SMTP 协议,发送短信获取授权码,在这里我们使用163邮箱来做测试使用。

Smtplib 是 Python 常用的库,这个库定义了一个 SMTP 客户端会话对象,可用于将邮件发送到具有 SMTP 或 ESMTP 侦听器的任何互联网上的计算机。读者可以在 RFC 821 和 RFC 1869 查看有关简单邮件传输协议和 SMTP 服务扩展的内容。
smtplib.SMTP(host=’’, port=0, local_hostname=None, [timeout, ]source_address=None)我们创建的实例分别有以下几个参数,host 是需要连接的主机,port 是连接主机使用的端口。可选的 timeout 参数指定停止操作,如尝试连接 10 秒后无反应(以秒为单位),那么停止连接,如果这个参数未指定,将使用全局默认超时设置。local_hostname 指的是如果读者指定了这个参数,那么读者在使用 HELO/EHLO command 进行初始化的时候,这个参数的值就会被当做本地主机的 FQDN(Fully Qualified Domain Name,全限定域名,FQDN 使用“.”将主机名和域名连接起来,比如读者的主机名为 me,使用的域名为 helloworld.com,那么 FQDN 就是 me.helloworld.com,而邮件服务器的连接符是@,这也就是我们邮箱地址的由来)。可选参数 source_address 用来将 SMTP 实例绑定到具有多个网络接口的计算机的源地址上。SMTP 常用方法如下表所示:

【2019.05】python 发送邮件_第1张图片
整体实现流程如下:
【2019.05】python 发送邮件_第2张图片

Python 的 email 模块包含许多有用的电子邮件格式化函数。MIMEText 对象为负责底层实现的 MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)协议传输创建了一个空消息,它最终通过高级 SMTP 协议发送。MIMEText 对象 MSG 包含电子邮件地址、消息正文和主题,Python 使用它们来创建正确格式化的消息。smtplib 模块用于建立关于服务器连接的信息。在这里用到了 Python 的两个包来发邮件:smtplib 和 email,我们来看一下程序:

为了防止账号密码明文,建议将账号,密码,smtpserver 写入到配置文件中,这里写入到当前文件夹下的config.py中
【2019.05】python 发送邮件_第3张图片

#!/usr/bin/env python
# encoding: utf-8

# -*- coding: utf-8 -*-
# @software: PyCharm
# @time: 2019/5/5 15:10
# @author: Paulson●Wier
# @file: 发送邮件.py
# @desc:

import smtplib, time
from email.message import Message
from time import sleep
import email.utils
from ******.config import USER, PASSWORD, SMTPSERVER   # 导入配置文件  

smtpserver = SMTPSERVER
username = USER
password = PASSWORD

time = email.utils.formatdate(time.time(), True)

def Sendmail(from_addr, to_addr, msg):
    message = Message()
    message['Subject'] = msg['subject']
    message['From'] = from_addr
    message['To'] = to_addr
    message.set_payload(msg['content'] + '\n' + time)
    m = message.as_string()

    sm = smtplib.SMTP_SSL(smtpserver, port=465, timeout=20)
    sm.ehlo()  # 初始化 SMTP 或 ESMTP 会话
    # sm.starttls()  # 启用 TLS 模式,默认 keyfile 和 certfile 为空如果给定使用这两个文件来创建安全套接字
    # sm.ehlo()
    sm.login(username, password)  # 使用用户和授权码来登录服务器
    sleep(2)
    sm.sendmail(from_addr, to_addr, m.encode('utf8'))
    sleep(2)
    sm.quit()
    return True


if __name__ == '__main__':
    from_addr = FROM_ADDR
    to_addr = TO_ADDR
    msg = {'subject':'this is a test project', 'content':'this is test content \n 测试内容'}
    Sendmail(from_addr, to_addr, msg)
    print('done')

如果一切无误的话,读者应该可以看到一个我们的程序输出 done 并且受到邮件。下面这条命令是一个复合命令,首先,我们使用 time.time()来获取时间轴(输出的时间格式像这样,1534678628.0146534 表示的是从 1970 年 1 月 1 日 0 时 0 分 0 秒起,至当前时间,经过的浮点秒数),然后我们使用 email.utils.formatdate()函数来将其格式化为标准形式的时间——Sun, 05 May 2019 15:29:23 +0800

time = email.utils.formatdate(time.time(),True)

你可能感兴趣的:(python3,学习路上)