python学习之定制发送带附件的电子邮件
创始人
2024-05-28 12:27:11
0

Python SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python创建 SMTP 对象语法如下:

import smtplibsmtpObj = 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协议中定义的格式。

导入模块如果没有错误,表示已经安装成功。

Python发送带附件的电子邮件基本思路如下:

  1. 构造MIMEMultipart对象做为根容器
  2. 构造MIMEText对象做为邮件显示内容并附加到根容器
  3. 构造MIMEBase对象做为文件附件内容并附加到根容器
      a. 读入文件内容并格式化
      b. 设置附件头
  4. 设置根容器属性
  5. 得到格式化后的完整文本
  6. 用smtp发送邮件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os# 配置邮箱服务器信息
mail_host = "smtp.qq.com"   # 设置服务器
mail_user = "823634900"     # 用户名
mail_pass = "gfgwmfbzmutebajc"  # 口令是授权码,不是邮箱密码# 配置发件人、收件人信息
sender = '823634900@qq.com' # 发件人邮箱
receivers = ['823634900@qq.com']  # 接收邮件,可设置为多个邮箱def message_config():"""配置邮件信息:return: 消息对象"""# 第三方 SMTP 服务content = MIMEText('测试数据,注意查收')message = MIMEMultipart() # 多个MIME对象message.attach(content)  # 添加内容message['From'] = Header("白云", 'utf-8') # 发件人message['To']   = Header("黑土", 'utf-8')  # 收件人message['Subject'] = Header('测试数据', 'utf-8') # 主题# 添加Excel类型附件file_name = 'output.xlsx' # 文件名file_path = os.path.join(file_name)        # 文件路径xlsx = MIMEApplication(open(file_path, 'rb').read())  # 打开Excel,读取Excel文件xlsx["Content-Type"] = 'application/octet-stream'     # 设置内容类型xlsx.add_header('Content-Disposition', 'attachment', filename=file_name) # 添加到header信息message.attach(xlsx)# jpg类型的附件#jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())#jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')#message.attach(jpgpart)# mp3类型的附件#mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())#mp3part.add_header('Content-Disposition', 'attachment', filename='kenny.mp3')#message.attach(mp3part)# pdf类型附件#part = MIMEApplication(open('foo.pdf', 'rb').read())#part.add_header('Content-Disposition', 'attachment', filename="foo.pdf")#message.attach(part)return messagedef send_mail(message):"""发送邮件:param message: 消息对象:return: None"""try:smtpObj = smtplib.SMTP_SSL(mail_host) # 使用SSL连接邮箱服务器smtpObj.login(mail_user, mail_pass)   # 登录服务器smtpObj.sendmail(sender, receivers, message.as_string()) # 发送邮件print("邮件发送成功")except Exception as e:print(e)if __name__ == "__main__":print("开始执行")message = message_config() # 调用配置方法send_mail(message)         # 发送邮件print("执行结束")

相信看到535报错的同学代码编写方面都没有问题,只是不明白为什么填写了帐号密码后还是报535错误,这里我以163和QQ邮箱为例,并使用Python讲解怎么解决535问题
关于发邮件报错535 Error:authentication failed解决方法:

报错:535, b’Login Fail. Please enter your authorization code to login.

在这里插入图片描述
在这里插入图片描述
解决办法:

调用邮箱服务器来发送邮件,我们需要开启POP3/SMTP服务,这时需要我们设置客户端授权码,这个授权码替代上面代码部分的mail_pass 即可成功发送邮件

参考文献:Python3 SMTP发送邮件

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...