python办公自动化之邮件发送——一篇文章解决邮件发送的基本应用场景



系列文章

第一章 python办公自动化之批量修改docx——以修改含有表格的word文件为例
第二章 python办公自动化之批量生成docx——根据excel (word)生成word (excel)
第三章 python办公自动化之python-docx,openpyxl——根据excel(word表格)填写word表格(excel)

前言

  1. 使用的smtplib以及email模块都是标准模块,无需安装
  2. 同样的代码,连接不同的SMTP提供商服务器具有不同的运行结果:比如126不允许在正文中插入图片,否则发送失败。

一、发送纯文本邮件

import smtplib 
from email.mime.text import MIMEText

# 获取SMTP服务账号和密码,一般使用第三方SMTP服务
mail_host="smtp.126.com"  #服务器
mail_user="your_mail_name@126.com"    #用户名
mail_pass="your_authorization_code"   #授权码
 
#写邮件
sender = 'your_mail_name@126.com'  #发件人邮箱
receivers = 'receiver@qq.com' # 收件人邮箱
subject = 'Python SMTP 邮件测试' #邮件主题
mail_message="""
<p>Python 邮件发送测试...</p>
<p><a href="https://blog.csdn.net/FIREseeker/article/details/115600727">CSDN个链接</a></p>
"""

#设置email模块
message = MIMEText(mail_message, 'plain', 'utf-8') #正文,'plain'为文本发送, 'plain'换成"html",邮件内容从文本变为html
message['From'] = sender
message['To'] =  receivers
#message['Cc']='抄送人@qq.com' # 可设置抄送人邮箱
message['Subject'] = subject

#设置smtplib模块
try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print ("Error: 无法发送邮件\n",e)

需要注意的是账号的授权码并不是邮箱密码,而是通过如下设置之后得到的,而且往往具有时效性。
在这里插入图片描述

二、发送带附件的邮件

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

# 获取SMTP服务账号和密码,一般使用第三方SMTP服务
mail_host="smtp.126.com"  #服务器
mail_user="firxxxxight@126.com"    #用户名
mail_pass="VBxxxxxUCVLLO"   #授权码

#邮件内容
#正文
sender = 'firxxxxght@126.com'
receivers = '98xxx254@qq.com' 
subject = 'Python SMTP 邮件测试'
mail_message = """
<p>Python 邮件发送测试...</p>
<p><a href="https://blog.csdn.net/FIREseeker/article/details/115600727">CSDN个链接</a></p>
"""
#txt附件
att_text = MIMEText(open('xxx.txt', 'rb').read(),'plain','utf-8')
#附件内容类型设置,此处设置为二进制流
att_text["Content-Type"] = 'application/octet-stream'
#filename,邮件中显示的附件名字
att_text["Content-Disposition"] = 'attachment; filename="test.txt"'

#图片附件
#此处提供两种文件读取方法
fp = open('welcome.png','rb')
att_image = MIMEImage(fp.read())
fp.close()
"""
with open('welcome.png','rb') as fp:
    att_image = MIMEImage(fp.read())
"""
att_image['Content-Type'] = 'application/octet-stream'
att_image['Content-Disposition'] = 'attachment;filename="welcome you.png"'

#设置email模块
#添加一个MIMEmultipart类,处理正文及附件
message = MIMEMultipart()
message['From'] = sender
message['To'] =  receivers
message['Subject'] = subject
message.attach(MIMEText(mail_message, 'html', 'utf-8'))
message.attach(att_text)
message.attach(att_image)

#设置smtplib模块 
try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print ("Error: 无法发送邮件\n",e)

三、批量发送邮件

#只需更改以下指令
receivers = ['fircccht@126.com','98452254@qq.com'] # 收件箱
message['To'] =  ";".join(receivers)

特别提醒:此方法适用于QQ邮箱,对网易邮箱无效(报554错误),经实践网易批量发送邮件用循环是可以完成的。

四、发送正文中插入图片的邮件

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.utils import formataddr
#parseaddr功能与formataddr正好相反

# 第三方 SMTP 服务
mail_host="pop.qq.com"  
mail_user="980232354@qq.com"    #用户名
mail_pass="xgy232423jbrfj"   #授权码 
 
#填写邮件
sender = '98342135564@qq.com'
receivers = ['f2ir2314tght@126.com','2423154@qq.com'] # 接收邮件
subject = 'Python SMTP 邮件测试'
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.baidu.com">这是一个链接</a></p>
<p><img src="cid:image1"></p> 
"""

# 打开图片,命名,在 HTML 文本中引用
with open('welcome.png','rb') as fp:
    att_image = MIMEImage(fp.read())
att_image.add_header('Content-ID', '<image1>')

#添加一个MIMEmultipart类
message = MIMEMultipart('related')
message['From'] = formataddr(["你好啊",sender])
message['To'] =  ";".join(receivers) #QQ没问题,网易给出554
message['Subject'] = subject
message.attach(MIMEText(mail_msg, 'html', 'utf-8'))
message.attach(att_image)

try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # port 25
    smtpObj.login(mail_user,mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print (e)

后记

  • 使用的smtplib以及email模块都是标准模块,无需安装
  • 同样的代码,连接不同的SMTP提供商服务器具有不同的运行结果:比如126不允许在正文中插入图片,否则发送失败。
  • 应用最多的场景是发送空邮件用于提醒某些任务完成,比如机械学习跑完了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值