python发送邮件

场景:

  1. 工作沟通邮件;登陆注册;广告;修改密码、**链接;邮件客户端…等。

  2. 邮件相关协议:

  • SMTP(发):(simple mail transfer protocol)简单邮件传输协议。用于发邮件。
  • POP3(收):(Post office protocol)邮件协议。将邮件服务器上资料同步到本地。用于收邮件。 开通以上两种协议后收邮件,发现可以正常收取,但有个问题,通过程序拉取的邮件已下载已阅读,但登陆官方邮件后发现之前下载的邮件仍然是未读状态。说明POP3协议只能简单的收件但不能标记邮件状态。
  • IMAP(收,增强版):(internet mail access protocol),交互式邮件存取协议, POP3协议的增强版。标记已读、删除,跟官方邮件服务器状态保持同步,体验较好。
  • SSL(加密):数据链路层加密, https基于此技术。qq邮箱的邮件协议也开启了这个加密,代码中注意配置SSL为True。

准备工作:开启邮箱协议 获得权限**

授权。各个邮件大同小异。这里以qq邮箱为例。

  • qq邮箱首页
  • qq邮箱首页/设置/账户 向下翻到POP3/IMAP/SMTP服务。
  • 开启 IMAP/SMTP服务

图1> 通过qq端进入邮箱

python发送邮件

图2> 点击设置/账户 进入配置页

python发送邮件

图3> 向下翻到协议处

(重要)开启IMAP/SMTP协议
python发送邮件

图4> 安全验证1

因为是代收,安全验证比较严,点击开启时会弹出验证。
(选做)如果之前qq未绑定手机,会先要求qq号开通二代密保,根据提示向下执行
python发送邮件

图5> 安全验证2

如果已经绑定手机号,会看到以下内容

python发送邮件

图6> 发短信内容”配置邮件客户端”到1069070069

python发送邮件

发送后回到网页点击“我已发送”

图7> (重要)生成密码

验证成功后生成**。(建议把**先保存到txt备用,以免忘记.如果忘记再来一次验证)

python发送邮件

内置包

smtplib 、poplib、 imaplib

第三方包

  • zmail是一个邮件收发包。相比内置包,封装程度更高,使用更简单。缺点,有bug,不够流行。
  • yagmail, star人数多,稳定,国外邮件公司开发的产品。缺点不会自动识别qq邮件域名,需要手动配置。 pip install yagmail 。注意anaconda环境中只安装这个包的旧版本。
接收邮件服务器 imap.qq.com 端口 993
发送邮件服务器 smtp.qq.com 端口 465或587
ssl开启

安装 pip install yagmail

示例(含html和附件)

# 邮箱内容为html,携带附件
import yagmail
import os

sender = '[email protected]'  # 发送人(你自己的)
password = 'xxxxx'  # 邮箱授权服务密码,注意不是qq邮箱 登陆密码
target = '[email protected]'  # 接收人
html = """
<html lang="zh">
    <head>
        <meta charset="utf-8">
        <title>示例1<title>
    </head>
    <body>
        <h1>测试</h1>
        <p>dsjdsnewj</p>
        <img src="https://www.baidu.com/img/bd_logo1.png"/>
    </body>
</html>
"""
attachment_path = os.path.join(os.path.dirname(__file__), 'base2.png')
print(attachment_path)
contents = ['测试yagmail示例', html, attachment_path]     # [正文, 正文, 附件]

yag = yagmail.SMTP(user=sender, password=password, host='smtp.qq.com', port=465, smtp_ssl=True)
yag.send(to=target, subject='yagmail示例', contents=contents)     # 群发的话收件人为列表
print('已发送')

python发送邮件

备注:跨邮箱服务商可能会有延迟,比如qq邮箱发送到网易邮箱。谷歌邮箱服务器被 收不到。

报错:SSL报错。解决方法,换用更稳定的python解释器。已知py2.7.6和py3.7.0会出现问题。