在我们日常项目中, 会经常使用到邮件的发送功能, 如何利用 Python 发送邮件也是一项必备的技能. 本文主要讲述利用 Python 来发送邮件的一些基本操作.
本章主要包含知识点:
邮件发送原理简述即常用 smtp 邮箱服务器
发送文字邮件
发送 html 邮件
我们一般发送邮件时, 用到的代理有 outlook,qq 邮箱等, 不管用什么代理, 你都需要登录你的邮箱, 而这个邮箱就是在各大邮箱服务器上开辟的一部分空间, 用来接收, 发送和存储你的邮件信息.
说到邮件发送, 不得不了解一下 SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议, 是一种提供可靠且有效电子邮件传输的协议. 邮件发送原理简单讲就是代理通过 SMTP 协议将信息发送到邮箱服务器上, 邮箱服务器再通过 POP3 协议转发到收件人的邮件服务器中, 如下图:
因此使用 Python 发送邮件时, 可以将 Python 的解释器当做一个代理, 需要首先连接到邮箱服务器, 将邮件发过去, 那么由于不同公司的邮箱服务器地址不尽相同, 这里列出了一些常用的地址如下:
既然已经知道邮件发送原理, 接下来就是用 Python 连接 smtp 服务器, 不就可发送邮件了. 其实强大的 python 早就封装好了一个 package:email, 利用其中的几个类即可实现, 具体代码如下:
- from email.mime.text import MIMEText
- from email.header import Header
- from email.mime.multipart import MIMEMultipart
- import smtplib
- class Email(object):
- def __init__(self):
- self.smtp = '' self.username =''
- self.password = ''
- self.subject = '' self.sender =''
- self.receiver = []
- self.cc = []
- def message_init(self, HTML):
- message = MIMEMultipart()
- message['subject'] = Header(self.subject, 'utf-8')
- message['From'] = self.sender
- message['To'] = ','.join(self.receiver)
- message['Cc'] = ','.join(self.cc)
- # 解决乱码, HTML 是 HTML 格式的 str
- message_context = MIMEText(HTML, _subtype='html', _charset='utf-8')
- # 邮件正文内容
- message.attach(message_context)
- return message
Email 自定义类中属性包含了邮箱服务器的地址, 邮箱登录的用户名和密码, 邮件主题, 发件人, 收件人和抄送人. 这里注意了, 收件人和抄送人是个 list, 添加的时候使用 append()
message_init(self, HTML) 即将发送内容进行初始化, 包括邮件发送和收件人的初始化. 其中 MIMEText(HTML, _subtype='html', _charset='utf-8') 中, 参数一为发送的邮件内容, 为字符串; 参数二表示设置文本格式为 HTML(邮件都是使用 HTML 格式发送的); 参数三表示设置编码格式为 utf-8. 如上这样一个邮件信息包就构造好了, 万事俱备只欠东风, 发送邮件的核心代码如下:
- def send_email(self, HTML):
- message = self.message_init(HTML)
- smtp_obj = smtplib.SMTP(self.smtp)
- smtp_obj.login(self.username, self.password)
- smtp_obj.sendmail(self.sender, self.receiver + self.cc, message.as_string())
- smtp_obj.quit()
模拟正常客户端邮件发送, 遵循登录 -> 发送 -> 退出原则, 这里注意 sendmail 的第二个参数为 收件人和抄送人的合集.
下面来测试一下这个代码是否可行, 发送一段简单的文字:
- if __name__ == '__main__':
- print('start......')
- sende = Email()
- strs = "This is a test email / 这是一封测试邮件"
- sende.smtp = 'smtp.163.com'
- sende.username = 'wjian.coming@163.com'
- sende.password = 'xxxxxx'
- sende.subject = 'Test / 测试邮件'
- sende.sender = 'wjian.coming@163.com'
- sende.receiver.append('948001879@qq.com')
- sende.cc.append('948001879@qq.com')
- sende.send_email(strs)
- print('end')
如上, 测试了发送中文和英文两种语言, 发送了测试的简单字符串, 实测结果可行, 截图如下
那么如何发送 HTML 格式文件呢? 其实想想也很简单, 将 HTML 文件全部读取出来之后, 转为 str 即可, 如何转换, 可以参考我之前写的文章, 读取文件生成 str, 参考链接: https://www.cnblogs.com/potato-find/p/13216471.html 使用 readFile 方法即可, 然后复用上述的方法. 具体的代码就不在这里体现了, 有兴趣的同学可以结合实现一下呢.
那么, 利用 Python 如何发送邮件已经都了解了吧, 那么这时就会引发更深的问题: 如何添加附件? 如何发送图片呢? Good question! 关注我, 下期为你解答.
(希望我的文章能够助你一臂之力, 成就更辉煌的你, 关注我, 我们一起进步)
来源: https://www.cnblogs.com/potato-find/p/13290419.html