分享

python干货| python3利用SMTP进行邮件Email自主发送

 hdzgx 2019-12-25

一、前言

利用python进行邮件的发送,这个功能自我感觉主要应用于检测或者报告之类,我两次运用这个功能。

  • 第一次用在主要发送实时的数据给一个邮箱

  • 第二次用是检测挂在服务器端一直在跑的python程序是否出现异常情况。

我这里采用163邮箱(sender)给qq邮箱(receiver)发送文本类邮件

如何在服务器端托管执行python3工程请看我另一篇文章:

【TOOLS】在云服务器上托管执行自己的python3工程程序

二、提取163邮箱的客户端授权密码

首先登陆163邮箱的网页版本。

640?wx_fmt=png
客户端授权密码

最后点击开启,自己设置密码即可。
之后这个密码不要忘记了,代码中要用到。

三、代码

show you my code

  1. 1from smtplib import SMTP
  2. 2from email.mime.text import MIMEText
  3. 3from email.header import Header
  4. 4 """
  5. 5    function: 利用模型进行推理
  6. 6    Parameters:
  7. 7       SMTP_host:  string类型,SMTP 服务器主机ip地址。 这里为 "smtp.163.com" 
  8. 8       from_addr:  string类型,发送方,也就是作用为发送邮件的邮箱地址 
  9. 9       password:  string类型,邮箱的授权码,而不是邮箱的登陆密码,可从邮箱获得,就是上面二所讲获取的授权码。
  10. 10       to_addrs:  list里面嵌套string类型,接收邮件的邮箱地址,可以有多个接收邮件的邮箱地址。
  11. 11       subject:   string类型,主题
  12. 12       content:   string类型,内容
  13. 13    Returns:
  14. 14    CSDN:
  15. 15        http://chehongshu.blog.csdn.net
  16. 16 """
  17. 17def send_email(SMTP_host, from_addr, password, to_addrs, subject, content):
  18. 18
  19. 19    email_client = SMTP(SMTP_host) #初始化 SMTP类,SMTP服务使用的端口号默认为25,这里默认情况,也可自己设置port参数
  20. 20    email_client.login(from_addr, password) #登陆服务器
  21. 21
  22. 22    # 以下在下面的结果图片中再具体标出说明
  23. 23    msg = MIMEText(content, 'plain', 'utf-8') #可以理解为发送这个邮箱内容的类,这句话主要是设置这个邮件内容
  24. 24    msg['Subject'] = Header(subject, 'utf-8') # 设置邮箱主题,也就是标题
  25. 25    msg['From'] = from_addr  # 这个是最后显示的邮件的from
  26. 26    msg['To'] = "".join(to_addrs)     # 这个是最后显示的邮件的to
  27. 27    email_client.sendmail(from_addr, to_addrs, msg.as_string()) #发送信息,将msg转换为string
  28. 28
  29. 29    email_client.quit()# 退出服务器
  30. 30
  31. 31if __name__ == "__main__":
  32. 32
  33. 33    hoster = "smtp.163.com"
  34. 34    sender_email = "XXXXXXXXX@163.com"
  35. 35    Authorization_code= "XXXXXXXXXXX"
  36. 36    receiver_email = ["XXXXXXXX@qq.com"]# 这里如果需要发送多个邮箱,形式为["xxxqq.com","xxx163.com","xxx126.com"]
  37. 37    subject = "我发送邮件了"
  38. 38    text = "今天天气真好"
  39. 39
  40. 40    send_email(hoster, sender_email, Authorization_code, receiver_email, subject, text)

四、结果

可能出现这个问题

smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp12,

640?wx_fmt=png
error

解决方案,把测试和test类似的语句换掉,比如我的demo code中的比较正常的语言即可。

接收邮箱显示。

640?wx_fmt=png
结果显示

有subject和content对应

对于在阿里云服务器上运行本文章有几处需要改动的地方。阿里云服务器里面有很多端口都被限制,所以以下的代码在本地可以成功,但在云服务器上并出现问题成功的为port=587我发送的邮件改为qq邮箱,接受为网易163邮箱,服务器host也改为"smtp.qq.com"

qq邮箱操作如下

获取qq邮箱授权码

640?wx_fmt=png
账户昵称

点击开启,给qq官方发送一个短信即可获得,别忘了复制保存。
开启服务

修改后的代码有改动,请自己对照使用,亲测好用
  1. 1from smtplib import SMTP
  2. 2from email.mime.text import MIMEText
  3. 3from email.header import Header
  4. 4
  5. 5def send_email(SMTP_host, from_addr, password, to_addrs, subject, content):
  6. 6    """
  7. 7    port = 587
  8. 8    在登陆邮箱前加上email_client.starttls()这句话
  9. 9    """
  10. 10    email_client = SMTP(SMTP_host, 587) 
  11. 11    email_client.starttls()
  12. 12    email_client.login(from_addr, password)
  13. 13
  14. 14    msg = MIMEText(content, 'plain', 'utf-8')
  15. 15    msg['Subject'] = Header(subject, 'utf-8')#subject
  16. 16    msg['From'] = from_addr
  17. 17    msg['to'] = ''.join(to_addrs)
  18. 18    email_client.sendmail(from_addr, to_addrs, msg.as_string())
  19. 19
  20. 20    email_client.quit()
  21. 21
  22. 22if __name__ == "__main__":
  23. 23    """
  24. 24    sender和receiver对调   
  25. 25    """
  26. 26    receiver = ["xxx@163.com"]
  27. 27    send_email("smtp.qq.com","xxx@qq.com","shouquanma",receiver ,"程序出问题了","ps")

结果

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多