# python自动发邮件
**Repository Path**: HaiXiuDeDXianSheng/python-auto-mail
## Basic Information
- **Project Name**: python自动发邮件
- **Description**: 用于记录python自动收发邮件的相关资料(很久之前学的,为了防止找不到,先上传gitee)
- **Primary Language**: Python
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 1
- **Created**: 2022-05-30
- **Last Updated**: 2024-02-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Python
## README
# 基础知识
常见的电子邮件协议,SMTP、IMAP、POP3,其中SMTP和IMAP经常在一起作用
## SMTP协议
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,是用于发送电子邮件的协议,STMP只负责发送邮件。与之相对有个IMAP协议(Internet Access Message Protocol),负责取回别人发你的邮件(要从服务器上不停问有没有邮件)。
SMTP目前是行业标准。
## pop3(post office protocol)
工作流程类似于邮局。收了之后就是邮件给你了,邮局是不会保存这个邮件的。假如使用IMAP,则多设备上都会保存一封邮件,假如你在手机上接受了邮件并删除了邮件,但是在你的电脑上还是有储存的,服务器上是会备份你的邮件的。但是使用pop3时,假如你在手机上下载了邮件之后,你服务器上的空间没被释放
以qq邮箱为例,首先要设置host_server
找到host_server的域名是smtp.qq.com
# python内置的smtplib库和email库
python内置的smtplib负责邮件的发送,email库负责构造邮件的格式和内容
## 发送基本文本信息
>```python
>import smtplib
>from email.mime.text import MIMEText # 为了写邮件的格式
>import os
>
>def sent_email():
> host_server = 'smtp.qq.com' # 这是我们定义的一个host_server,即我们电脑发送邮件的服务器
> port = 25 # 端口,目前不需要ssl加密,为25
> sender = '160******940@qq.com' # 发送人的邮箱
> sender_alias = '害******生<160******40@qq.com>' # alias表示别名,昵称。这边建议加上
> # password = os.environ.get('EMAIL_PASS') # 这边是通过环境变量对账户密码进行加密
> password = 'jas******bafe' # 这是qq邮箱生成的授权码,第三方登录时需要用这个密码进行登录
> # sender也可以这样进行加密
> receiver = '160******40@qq.com' # 收件人账户信息
> body = '[PYTHON课程]这是一个课程
通过python自动发送邮件,学习就要学使用技能
' # 在字符串中编写html代码
> msg = MIMEText(body,'html') # 使用MIMETEXT()对HTML格式的文本进行转码
> # 规定msg的一些信息,比如from、to、subject等
> msg['subject'] = 'python自动化的教程' # 邮件主题
> msg['from'] = sender_alias
> msg['to'] = receiver
>
> # 产生server
> s =smtplib.SMTP(host_server,port)
> s.login(sender,password) # 对发件人邮箱进行登录操作
> s.sendmail(sender,receiver,msg.as_string()) # msg是以string的形式进行发送的
>
>if __name__=='__main__':
> sent_email()
>```
以上是对一个邮箱账户发送邮件
### 给多人发送和抄送邮件
>```python
>import smtplib
>from email.mime.multipart import MIMEMultipart # 实际上就是一封邮件(邮件由很多部分组成,包含图片和附件)
>from email.mime.text import MIMEText # 邮件文本内容
>
># 准备发送邮件的参数
>sender = '160******40@qq.com'
>sender_alias = '害******生<160******40@qq.com>'
>password = 'jas******afe' # 授权码
># 收件人
>to_list = [
> '160******40@qq.com',
> '2******5@zju.edu.cn'
>] # 收件人,是list因为会发给很多人
># 抄送人
>cc_list=[
> 'Zh******g@cmos.chinamobile.com',
> '13******85@139.com'
>] # 抄送,也可能是好多人
>
># 邮件主题
>subject = 'python自动化邮件发送测试'
>
># 写邮件
># 创建邮件
>em = MIMEMultipart()
>em['Subject'] = subject
>em['From'] = sender_alias
>em['To'] = ','.join(to_list) #用逗号进行分割,对传入的大量字符串进行拼接返回string('xxx,xxx,xxx,xxx')
>em['Cc'] = ','.join(cc_list)
>
># 准备邮件内容
># 准备邮件正文内容(文本内容)
>content_text = '你们可真棒'
>msg =MIMEText(content_text,'plain')
>em.attach(msg) # 把邮件的内容放进邮件
>
>
># 发送邮件
># 邮件服务器
>host_server = 'smtp.qq.com'
># 端口
>port = 25
># 发送
>s = smtplib.SMTP(host=host_server,port=port)
>s.login(sender,password)
>s.sendmail(sender,to_list+cc_list,em.as_string()) # 收件人+被抄送人
>```
发送邮件部分也可写成如下形式
>```python
>s = smtplib.SMTP()
>s.connect(host=host_server,port=port)
>s.login(sender,password)
>#s.sendmail(sender,to_list+cc_list,em.as_string()) # 必须是字符串
>s.send_message(msg) # 这里面的msg参数必须是message.Message的对象
># 假如from_addr和to_addr不给参数,则它会从前面的em['From']和em['To']里面找
>s.close() # 关闭连接
>```
###
其他资料: https://www.jianshu.com/p/8b1d3ab07d5d
## 发送带超链接图片的html文本
>```python
># 准备发送邮件的参数
>sender = '160******40@qq.com'
>sender_alias = '害******生<160******40@qq.com>'
>password = 'jas******afe'
># 收件人
>to_list = [
> '160******40@qq.com',
>] # 收件人,是list因为会发给很多人
>
># 邮件主题
>subject = 'python自动化邮件发送测试'
>
># 写邮件
># 创建邮件
>em = MIMEMultipart() # em其实是message.Message的一个子类对象
>em['Subject'] = subject
>em['From'] = sender_alias
>em['To'] = ','.join(to_list) # 用逗号进行分割,对传入的大量字符串进行拼接返回string('xxx,xxx,xxx,xxx')
>
># 假如要写带图片的html
>content = '我爱你
'
>msg = MIMEText(content,'html')
>em.attach(msg)
># 注意这边的src的图片地址不能填写本地地址,因为邮件发送流程是本地发给host_server,再由host_server发送给目标账户,目标账户是向host_server取邮件的
># 写本地地址,则会取不到
>img = MIMEImage(open('./素材/SMTP收发邮件流程.png','rb').read())
>img.add_header('Content-id','jay') # 给这个文件加上一个头信息id值,表明这个图片是给谁用的
># 这里面的Content-id值要和img src中的cid值要对应
>em.attach(img)
>
># 发送邮件
># 邮件服务器
>host_server = 'smtp.qq.com'
># 端口
>port = 25
>s = smtplib.SMTP()
>s.connect(host=host_server,port=port)
>s.login(sender,password)
>s.sendmail(sender,to_list,em.as_string()) # 必须是字符串
>s.close() # 关闭连接
>```
图片不一定要加链接的.不加链接那就是普通图片
## 添加附件
举例说明:
>```python
># 添加附件
>app = MIMEApplication(_data=open('result.xlsx','rb').read())
>app.add_header('content-disposition', 'attachment',
> filename=('utf-8', '', '结果导出excel表.xlsx')) # 确定下载的时候附件的文件名
>em.attach(app)
>```
附上完整代码则如下:
>```python
>import smtplib # 发送邮件
>from email.mime.multipart import MIMEMultipart # 实际上就是一封邮件(邮件由很多部分组成,包含图片和附件)
>from email.mime.text import MIMEText # 邮件文本内容
>from email.mime.image import MIMEImage # 邮件图片
>from email.mime.application import MIMEApplication # 邮件附件
>
># 准备发送邮件的参数
>sender = '160******40@qq.com'
>sender_alias = '害******生<160******40@qq.com>'
>password = 'jasubqcywrbmbafe'
># 收件人
>to_list = [
> '160******40@qq.com',
>] # 收件人,是list因为会发给很多人
>
># 邮件主题
>subject = 'python自动化邮件发送测试'
>
># 写邮件
># 创建邮件
>em = MIMEMultipart() # em其实是message.Message的一个子类对象
>em['Subject'] = subject
>em['From'] = sender_alias
>em['To'] = ','.join(to_list) # 用逗号进行分割,对传入的大量字符串进行拼接返回string('xxx,xxx,xxx,xxx')
># em['Cc'] = ','.join(cc_list)
>
># 假如要写带图片的html
>content = '我爱你
'
>msg = MIMEText(content,'html')
>em.attach(msg)
># 注意这边的src的图片地址不能填写本地地址,因为邮件发送流程是本地发给host_server,再由host_server发送给目标账户,目标账户是向host_server取邮件的
># 写本地地址,则会取不到
>img = MIMEImage(open('./素材/SMTP收发邮件流程.png','rb').read())
>img.add_header('Content-id','jay') # 给这个文件加上一个头信息id值,表明这个图片是给谁用的
># 这里面的Content-id值要和img src中的cid值要对应
>em.attach(img)
>##################
># 添加附件
>app = MIMEApplication(_data=open('result.xlsx','rb').read())
>app.add_header('content-disposition', 'attachment',
> filename=('utf-8', '', '结果导出excel表.xlsx')) # 确定下载的时候附件的文件名(被你重命名后的文件名)
>em.attach(app)
>
># 发送邮件
># 邮件服务器
>host_server = 'smtp.qq.com'
># 端口
>port = 25
>s = smtplib.SMTP()
>s.connect(host=host_server,port=port)
>s.login(sender,password)
>s.sendmail(sender,to_list,em.as_string()) # 必须是字符串
>s.close() # 关闭连接
>```