# 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() # 关闭连接 >```