python实现邮件发送功能
作者:小黑and小白 发布时间:2023-10-11 02:27:09
什么是POP3、SMTP和MAP?
POP3是Post Office Protocol 3的简称,即邮局协议的第三个版本,他是规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是因特网电子邮件的第一个离线协议的标准。POP3允许用户从服务器上把邮件存储到本地计算机上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接受邮件服务器,用来接受电子邮件。
SMTP的全称是Simple Mail Transfer Protocol,即简单的邮件传输协议。它是一组用于从源地址到目的地的地址传输邮件的规范,通过它控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或者中转信件时找到下个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。
SMTP认证,简单来说就是要求必须在提供了账户名和密码之后才能登陆SMTP服务器。
IMAP全称是Iternet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似的邮件访问标准协议之一。不同的是,开启了IMAP后,你在电子邮件客户端收取的邮件仍然保存在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件、标记邮件等,服务器上的邮件也会做相应的动作。无论从浏览器登陆还是客户端登陆邮箱看到的邮件以及状态都是一致的。
我们使用网易的163邮箱来发送邮件,所以我们需要先将163邮箱的POP3/SMTP/IMAP都给打开。
具体步骤是:设置->POP3/SMTP/IMAP->设置POP3/SMTP/IMAP,点击复选框时邮箱会要求你设置授权码,设置授权码,然后一定要将授权码给记住,后面会用到。邮箱设置好后我们就开始编写代码发送邮件。
首先引入我们需要导入的库及包
import smtplib
import email
# MIME 多邮件扩充协议
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
然后设置邮箱的域名,端口,发送者邮箱,接收者邮箱
host = 'smtp.163.com' # 使用163邮箱
port = '465' # 163邮箱服务器的端口号
sender = 'xxxxxx@163.com' # 发送者的邮箱
password = 'xxxxxx' # 授权码
receiver = 'xxxxxx' # 接收者的邮箱,可以为其他类型的邮箱,如果是多个接收者请传入列表
接下来构建文本邮箱的主体
body = 'xxx' # 你要发送的邮件的内容
subject = 'xxx' # 你要发送的邮件的标题
# plain表示邮件内容的类型,文本类型默认是plain。utf-8表示内容的编码格式。
message = MIMEText(body, 'plain', 'utf-8')
message['From'] = sender # 发送者
message['To'] = receiver # 接收者
message['Subject'] = subject # 邮件标题
接下来我们获取SMTP协议的证书,登陆我们的邮箱发送邮件
# 获取SMTP协议证书
email_clint = smtplib.SMTP_SSL(host, port)
# 登陆邮箱,这里也是用授权码登陆邮箱的
login_result = email_clint.login(sender, password)
# 发送邮件
email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())
# 关闭邮件发送客户端
email_client.close()
其实这里我们可以打印login_result,如果返回的状态码是235则证明邮件发送成功。
下面是发送文本邮件的全部代码。
import email
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
class SendEmail(object):
def __init__(self):
self.host = 'smtp.163.com'
self.port = '465'
self.sender = 'xxxxxx@163.com'
self.password = 'xxxxxx'
def send_email(self, receiver, subject='', body=''):
message = MIMEText(body, 'plain', 'utf-8')
message['From'] = self.sender
message['To'] = receiver
message['Subject'] = subject
try:
email_clint = smtplib.SMTP_SSL(self.host, self.port)
print('获取证书成功')
login_result = email_clint.login(self.sender, self.password)
print('开始登陆')
if login_result[0] == 235:
print('登陆成功')
email_clint.sendmail(self.sender, receiver, message.as_string())
print('邮件发送成功')
else:
print('登陆失败')
except Exception as e:
print('发生错误', e)
下面介绍发送HTML格式内容的邮件以及向邮件内容中添加图片。
其实发送HTML格式内容的邮件很简单,只需将发送邮件的内容格式改为html就行了,像这样
message = MIMEText('<h2 style="color">学习使我快乐</h2>', 'html', 'utf-8')
还有使用内嵌的方法向邮件内容中加入文本或者图片
# related 表示使用内嵌资源的形式,将邮件发送给对方
message = MIMEMultipart('related')
然后向邮件中添加内容,如果把图片嵌入到邮件正文中只需在HTML中通过引用src="cid:x"即可。x代表图片的编号可以是数字也可是是字符串
# ---------------发送文本-----------------
message_html = MIMEText('<h2 style="color:red;font-size:100px">学习使我快乐</h2><img src="cid:small">','html','utf-8')
# 将邮件内容 装入到邮件信息当中去
message.attach(message_html)
# ---------------发送图片-----------------
# rb 读取二进制文件(图片是二进制文件)
image_data = open('1.gif','rb')
# 设置读取获取的二进制数据
message_image = MIMEImage(image_data.read())
# 关闭刚才打开的文件
image_data.close()
message_image.add_header('Content-ID','small')
# 添加图片文件到邮件信息当中去
message.attach(message_image)
然后构建邮件的主体,发送邮件即可
message['From'] = sender # 发送者
message['To'] = receiver # 接收者
message['Subject'] = subject # 邮件标题
email_clint = smtplib.SMTP_SSL(host, port)
login_result = email_clint.login(sender, password)
email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())
email_client.close()
我们经常会向邮件中添加附件,下面介绍添加附件的方式
添加附件也是使用内嵌的方式添加的
# 对二进制文件需要设置默认的编码形式
# 对于MIMEText()来说 默认的编码形式就是base64
# 如果对于二进制文件来说 没有设置base64进行编码 则附件的就会呈现乱码
# --------------------添加图片附件----------------------
message_image = MIMEText(open('1.gif','rb').read(),'base64','utf-8')
# 设置附件在邮件中的名字
message_image['Content-disposition'] = 'attachment;filename="happy.gif"'
message.attach(message_image)
# --------------------添加xlsx表格附件---------------
message_xlsx = MIMEText(open('table.xlsx','rb').read(),'base64','utf-8')
# 设置附件在邮件当中的名字
message_xlsx['Content-Disposition'] = 'attachment;filename="test.xlsx"'
message.attach(message_xlsx)
然后发送邮件即可。
来源:https://blog.csdn.net/qq_38684419/article/details/81569019
猜你喜欢
- PHP number_format() 函数实例格式化数字:<?php echo number_format("100000
- 如下所示:ffmpeg中文文档:http://linux.51yip.com/search/ffmpegffmpeg -i test_bao
- 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间。Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕。如
- 考虑这个问题:定义一个简单的行向量a如何复制10行呢?即:同理,对于一个列向量,如何复制 10 列呢?关键函数1:repmat( A , m
- python天数转日期字符串在利用python读取Excel的时候, 日期格式的单元格读取出来是数字,该数字表示1990年01月01日到该日
- webp 格式的图片显示异常webp介绍WebP,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。提供了有损压缩与无损压缩(可
- 1、下载python安装包,进入python官网(python.org)2、安装python,可根据需求选择默认安装或自定义安装,如下3、选
- 其实相信每个和mysql打过交道的程序员都应该会尝试去封装一套mysql的接口,这一次的封装已经记不清是我第几次了,但是每一次我希望都能做的
- 在一个页面制作过程,突然被设计稿上的一个问题难住了,思路一时没打开,后来在费人的提醒下,用定位控制,顺利完成。这个是我做的大概的
- 代码如下:<% '=================================================
- Mysql存储过程1.创建存储过程语法(格式)DELIMITER $CREATE PROCEDURE 存储过程名A(IN 传入参数名a IN
- 项目进行到和服务器交互,通过post访问服务器端jsp,jsp访问服务器端mysql数据库,最终返回到客户端的中文出现乱码问题。在整个流程中
- 本文实例讲述了Python实现监控Nginx配置文件的不同并发送邮件报警功能。分享给大家供大家参考,具体如下:因为项目中经常涉及到多个Ngi
- 先给出结论:要替换的字符数量不多时,可以直接链式replace()方法进行替换,效率非常高;如果要替换的字符数量较多,则推荐在 for 循环
- 上一课:ACCESS入门教程:窗口和菜单的使用向导简介 这一课我们要建立一个客户订单管理数据库,这个数据库将用ACCESS提供的数据库向导来
- 本文实例讲述了JavaScript DOM节点操作方法。分享给大家供大家参考,具体如下:使用DOM可以新建HTML元素,也可以删除已有的HT
- 导读:随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则的
- 前记上一遍文章《Python中Async语法协程的实现》介绍了Python是如何以生成器来实现协程的以及Python Asyncio通过Fu
- 一、序言前段时间一直在弄报表,快被这些报表整吐了,然后接触到了Oracle的table()函数。所以今天把table()函数的具体用法整理下
- 装完sql server 2005后却没有找到ms的示例数据库northwind 后来查看安装光盘发现sql server 2005种只有a