目录

上一个主题

7.2. 接收邮件

下一个主题

7.4. 邮件推送给多用户


7.3. 发送邮件

python自动发邮件可使用smtplib库和yagmail库。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。yagmail 可以更简单的来实现自动发邮件功能。

使用smtplib模块发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

Python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python创建 SMTP 对象语法如下:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。

  • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。

  • local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

参数说明:

  • from_addr: 邮件发送者地址。

  • to_addrs: 字符串列表,邮件发送地址。

  • msg: 发送消息

这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

>>> import smtplib
>>> from email.mime.text import MIMEText
>>> from cfg import email_cfg

邮箱服务器地址,设置服务器邮箱为smtp.163.com。给定邮箱的账号及密码。此账号的邮箱smtp服务需要提前开启并获取到授权码,否则会失败。

>>> mailserver = "smtp.163.com"
>>> username_send = email_cfg['user']
>>> password = email_cfg['passwd']

列出收件人信息,当多个收件人时可以用逗号隔开,这个列子是将邮件内容发送给了自己。

>>> username_recv = email_cfg['user']

写入想要发送的邮件内容及主题。

>>> mail = MIMEText("hello!I'm samele")
>>> mail['Subject'] = 'python'

设定发件人及收件人信息。

>>> mail['From'] = username_send
>>> mail['To'] = username_recv

连接邮箱服务器,smtp的端口号是465。

如果连接QQ邮箱的话使用如下代码:

smtp=smtplib.SMTP_SSL('smtp.qq.com',port=465)

>>> smtp =smtplib.SMTP_SSL(mailserver,port=465)

登录服务器邮箱,使用邮箱开始发送邮件。

>>> smtp.login(username_send,password)
(235, b'Authentication successful')

sendmail()发送邮件,参数分别是发送者,接收者,第三个是把上面的发送邮件的内容变成字符串

>>> smtp.sendmail(username_send,username_recv,mail.as_string())
{}

发送完毕后关闭SMTP会话。

>>> smtp.quit()
(221, b'Bye')

如果发送给另一个邮箱不成功,邮件被退回了,则可以将发件人邮箱地址也添加到收件人列表里。多人发送邮件请看后续章节。

使用yagmail模块发送邮件

yagmail比较简单,整体思路清晰,最智能的是能够判断contents列表里面的内容的类型, 先判断是否为本地文件, 如果是本地文件, 则置于附件中发送,可以是相对路径, 也可以填写绝对路径,其次会判断是否为html语言, 是的话, 能够在正文中被浏览器渲染. 如果都不是, 则当作普通文本, 放在邮件正文。

使用pip安装yagmail。

!pip3 install yagmail

导入yagmail库和所需要的参数。

>>> import yagmail
>>> from cfg import email_cfg

连接smtp邮箱服务器。

>>> yag = yagmail.SMTP( user=email_cfg['user'], password=email_cfg['passwd'], host='smtp.163.com')

提前写下邮件内容。

>>> contents = ['This is the body, and here is just text http://somedomain/image.png',
>>>  'You can find an audio file attached.'']

send()发送邮件,第一个参数为接收邮件的邮箱,第二个参数为邮件的主题,第三个参数为邮件内容。

>>> yag.send('alanyers@163.com', 'subject', contents)
{}