【TOOLS】Python 3利用SMTP进行邮件Email自主发送

  • Post author:
  • Post category:python


640?wx_fmt=jpeg





作者 | Che_Hongshu


来源 |  AI蜗牛车(ID:AI_For_Car)






一、前言






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




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


  • 第二次用是检测挂在服务器端一直在跑的

    P

    ython程序是否出现异常情况。




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




如何在服务器端托管执行

P

ython3工程请看我另一篇文章:


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




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






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



640?wx_fmt=png


客户端授权密码


最后点击开启,自己设置密码即可。



之后这个密码不要忘记了,代码中要用到。






三、代码






show you my code





1


from

smtplib

import

SMTP


2


from

email.mime.text

import

MIMEText


3


from

email.header

import

Header


4


“””

5    function: 利用模型进行推理

6    Parameters:

7       SMTP_host:  string类型,SMTP 服务器主机ip地址。 这里为 “smtp.163.com”

8       from_addr:  string类型,发送方,也就是作用为发送邮件的邮箱地址

9       password:  string类型,邮箱的授权码,而不是邮箱的登陆密码,可从邮箱获得,就是上面二所讲获取的授权码。

10       to_addrs:  list里面嵌套string类型,接收邮件的邮箱地址,可以有多个接收邮件的邮箱地址。

11       subject:   string类型,主题

12       content:   string类型,内容

13    Returns:

14    CSDN:

15        http://chehongshu.blog.csdn.net

16    “””



17



def


send_email


(SMTP_host, from_addr, password, to_addrs, subject, content)

:



18



19

email_client = SMTP(SMTP_host)

#初始化 SMTP类,SMTP服务使用的端口号默认为25,这里默认情况,也可自己设置port参数



20

email_client.login(from_addr, password)

#登陆服务器



21



22


# 以下在下面的结果图片中再具体标出说明



23

msg = MIMEText(content,

‘plain’

,

‘utf-8’

)

#可以理解为发送这个邮箱内容的类,这句话主要是设置这个邮件内容



24

msg[

‘Subject’

] = Header(subject,

‘utf-8’

)

# 设置邮箱主题,也就是标题



25

msg[

‘From’

] = from_addr

# 这个是最后显示的邮件的from



26

msg[

‘To’

] =

“”

.join(to_addrs)

# 这个是最后显示的邮件的to



27

email_client.sendmail(from_addr, to_addrs, msg.as_string())

#发送信息,将msg转换为string



28



29

email_client.quit()

# 退出服务器



30



31


if

__name__ ==

“__main__”

:


32



33

hoster =

“smtp.163.com”



34

sender_email =

“XXXXXXXXX@163.com”



35

Authorization_code=

“XXXXXXXXXXX”



36

receiver_email = [

“XXXXXXXX@qq.com”

]

# 这里如果需要发送多个邮箱,形式为[“xxxqq.com”,”xxx163.com”,”xxx126.com”]



37

subject =

“我发送邮件了”



38

text =

“今天天气真好”



39



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邮箱操作如下






获取qq邮箱授权码



640?wx_fmt=png


账户昵称


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



640?wx_fmt=png


开启服务


修改后的代码有改动,请自己对照使用,亲测好用






1


from

smtplib

import

SMTP


2


from

email.mime.text

import

MIMEText


3


from

email.header

import

Header


4



5



def


send_email


(SMTP_host, from_addr, password, to_addrs, subject, content)

:



6


“””

7    port = 587

8    在登陆邮箱前加上email_client.starttls()这句话

9    “””



10

email_client = SMTP(SMTP_host,

587

)


11

email_client.starttls()


12

email_client.login(from_addr, password)


13



14

msg = MIMEText(content,

‘plain’

,

‘utf-8’

)


15

msg[

‘Subject’

] = Header(subject,

‘utf-8’

)

#subject



16

msg[

‘From’

] = from_addr


17

msg[

‘to’

] =



.join(to_addrs)


18

email_client.sendmail(from_addr, to_addrs, msg.as_string())


19



20

email_client.quit()


21



22


if

__name__ ==

“__main__”

:


23


“””

24    sender和receiver对调

25    “””



26

receiver = [

“xxx@163.com”

]


27

send_email(

“smtp.qq.com”

,

“xxx@qq.com”

,

“shouquanma”

,receiver ,

“程序出问题了”

,

“ps”

)




结果




640?wx_fmt=png


结果










(*本文仅代表作者观点,转载请联系原作者)





CTA核心技术及应用峰会



5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。



识别海报二维码查看

更多重磅嘉宾,并抢购优惠票价。


添加小助手微信



15101014297



,备注「



CTA



」,了解详情。

640?wx_fmt=jpeg



扫描二维码,立即参会。