Python调用工具包实现发送邮件服务
作者:Bruce小鬼 发布时间:2023-08-30 02:25:16
1.概述
这篇文章主要介绍python调用工具包实现发送邮件服务。在第二篇文章中介绍封装邮件服务工具类,该工具类将可以应用到其他的项目中。
2.邮件模块介绍
python内置了发送邮件的模块,因此不需要单独安装。
smtplib 模块负责发送邮件
email 模块负责格式化邮件内容样式
2.1. 建立连接类型
当使用smtplib模块建立发送邮件连接时可以分为非安全和安全连接两种方式。
安全连接: 当python使用smtplib模块调用邮箱服务端发送邮件过程,传输层使用了SSL加密,避免了明文传递邮件内容,通过拦截请求获取邮件内容和登录账号密码。
非安全连接:邮箱服务端采用明文发送邮件,通过连接请求可以获取邮件内容和登录账号密码。
3.发送邮件
使用python发送邮件之前,需要登录邮箱开启SMTP服务才可以发送邮件。每家的邮箱开启入口不同,开启方式搜索具体产品的邮箱。
3.1.发送非安全连接邮件
建立非安全连接邮箱服务端默认使用25端口发送邮件。
import smtplib
from email.mime.text import MIMEText
#设置服务器所需信息
#邮箱服务器地址
mail_host = 'mail.******.com'
#邮箱登录用户名
mail_user = '******@qq.com'
#密码(部分邮箱为授权码)
mail_pass = '123456'
#邮件发送方邮箱地址
sender = '******@qq.com'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['32321232@qq.com']
#设置email信息
#邮件内容设置
message = MIMEText('content','plain','utf-8')
#邮件主题
message['Subject'] = 'title'
#发送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]
#登录并发送邮件
try:
# 建立非安全连接smtplib.SMTP()
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25)
#登录到服务器
smtpObj.login(mail_user,mail_pass)
#发送
smtpObj.sendmail(
sender,receivers,message.as_string())
#退出
smtpObj.quit()
print('success')
except smtplib.SMTPException as e:
print('error',e) #打印错误
3.2.发送安全连接邮件
建立非安全连接邮箱服务端默认使用465端口发送邮件。
import smtplib
from email.mime.text import MIMEText
#设置服务器所需信息
#邮箱服务器地址
mail_host = 'mail.******.com'
#邮箱登录用户名
mail_user = '******@qq.com'
#密码(部分邮箱为授权码)
mail_pass = '123456'
#邮件发送方邮箱地址
sender = '******@qq.com'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['32321232@qq.com']
#设置email信息
#邮件内容设置
message = MIMEText('content','plain','utf-8')
#邮件主题
message['Subject'] = 'title'
#发送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]
# 登录并发送邮件
# 建立安全连接SMTP_SSL,注意端口号默认使用465
with smtplib.SMTP_SSL(mail_host, timeout=10, port=465) as smtpObj:
try:
# 登录到服务器
smtpObj.login(mail_user, mail_pass)
# 发送
smtpObj.sendmail(
sender, receivers, message.as_string())
print('success')
except Exception as e:
print(e)
在使用安全连接发送邮件时可能会抛出下面的异常,这个异常的含义是Python端与邮箱服务端建立连接SSL版本号不对。
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:997)
这个异常出现的原因:
发送邮件的邮箱服务端没有开启SSL或者不支持,这种清空可以登录邮箱服务端确认,如果不支持只能使用非安全建立连接。
端口号错误造成,邮箱服务端模式使用465端口号连接SSL连接,如果python端设置的端口号与邮箱服务端端口号不一致建立连接也会报上面的异常。
4.设置邮件内容格式
python内置的email模块负责设置邮件内容格式,它包含三个模块对应邮件三种类型的格式。下面具体介绍他们的区别。
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
4.1.邮件文本三种类型
1.MIMEText文本类型
发送普通的文本邮件内容,MIMEText对象中有三个需要我们设置的参数,一个是正文内容,一个是正文内容的类型,例如:”text/plain”和”text/html”,一个是正文内容的编码。
plain构造普通文本
# 文本内容
text_info = 'hello world '
# 构造普通文本对象,包含三个参数,邮件内容,类型,编码
text_sub = MIMEText(text_info,'plain', 'utf-8')
完整代码
import smtplib
from email.mime.text import MIMEText
# 创建邮件连接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 构建邮件内容模板
def email_content():
# 邮件内容设置
text_info = 'hello world '
message = MIMEText(text_info, 'plain', 'utf-8')
# 邮件主题
message['Subject'] = 'title'
# 发送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 发送邮件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 设置服务器所需信息
# 163邮箱服务器地址
mail_host = 'smtp.163.com'
# 163用户名
mail_user = '******@163.com'
# 密码(部分邮箱为授权码)
mail_pass = '******'
# 邮件发送方邮箱地址
sender_account = '******@163.com'
# 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
构造html文本
# 邮件内容
url = "https://xxxxx.com"
html_info = """
<p>点击以下链接,查看邮件详情</p>
<p><a href="%s">click me</a></p>
<p>i am very glasses for you</p>
""" % url
# 构建邮件类型html对象
html_sub = MIMEText(html_info, 'html', 'utf-8')
# 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示
html_sub["Content-Disposition"] = 'attachment; filename="email.html"'
构造base64数据流,用于发送文件的时候使用,构造附件代码
txt_file = open(r'D:\python_files\files\hello_world.txt', 'rb').read()
txt = MIMEText(txt_file, 'base64', 'utf-8')
txt["Content-Type"] = 'application/octet-stream'
# 命名发送的附件
txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')
2.MIMEImage图片类型
构造图片类型对象
image_file = open(r'D:\python_files\images\test.png', 'rb').read()
image = MIMEImage(image_file)
image.add_header('Content-ID', '<image1>')
# 命名发送的图片
image["Content-Disposition"] = 'attachment; filename="red_people.png"'
完整代码
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
# 创建邮件连接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 构建邮件内容模板
def email_content():
# 邮件内容设置
image_file = open(r'./白玉堂.jpg', 'rb').read()
message = MIMEImage(image_file)
# 命名发送的图片
message["Content-Disposition"] = 'attachment; filename="red_people.png"'
# 邮件主题
message['Subject'] = 'title'
# 发送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 发送邮件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 设置服务器所需信息
# 163邮箱服务器地址
mail_host = 'smtp.163.com'
# 163用户名
mail_user = '******@163.com'
# 密码(部分邮箱为授权码)
mail_pass = '******'
# 邮件发送方邮箱地址
sender_account = '******@163.com'
# 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
3.MIMEMultipart
对象创建的类型有三种,此模块主要是通过attach方法把上边构造的内容传入到邮件的整体内容中
邮件类型为”multipart/alternative”的邮件正文中包括纯文本正文(text/plain)和超文本正文(text/html)。
邮件类型为”multipart/related”的邮件正文中包括图片,声音等内嵌资源。
邮件类型为”multipart/mixed”的邮件包含附件,图片,文本等都可以添加,所以发的内容多的话一般是用这个的,选择mixed类型,什么内容都可以发。
MIMEMultipart使用方法
MIMEMultipart(‘mixed’).attach(MIMEText或者MIMEImage对象),因为MIMEMultipart对象代表邮件本身,把其他的构造内容添加到MIMEMultipart对象中就可以把文本,html,附件等一起发送。
构造图片类型内容
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 创建邮件连接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 构建邮件内容模板
def email_content():
# 邮件内容设置
image_file = open(r'./白玉堂.jpg', 'rb').read()
# 创建MIMEImage类型对象
mimei_image = MIMEImage(image_file)
message = MIMEMultipart('mixed')
# attach包装MIMEImage对象
message.attach(mimei_image)
# 命名发送的图片
message["Content-Disposition"] = 'attachment; filename="red_people.png"'
# 邮件主题
message['Subject'] = 'title'
# 发送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 发送邮件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 设置服务器所需信息
# 163邮箱服务器地址
mail_host = 'smtp.163.com'
# 163用户名
mail_user = '******@163.com'
# 密码(部分邮箱为授权码)
mail_pass = '******'
# 邮件发送方邮箱地址
sender_account = '******@163.com'
# 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
构造普通类型发送附件邮件
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 创建邮件连接
def create_email_connect(mail_host, timeout, port):
try:
return smtplib.SMTP_SSL(host=mail_host, timeout=timeout, port=port)
except Exception as e:
print(e)
# 构建邮件内容模板
def email_content():
# 邮件内容设置
text_file = open(r'./白玉堂.jpg', 'rb').read()
# 创建MIMEImage类型对象
mime_obj = MIMEText(text_file, 'base64', 'utf-8')
# 命名发送的图片
mime_obj.add_header('Content-Disposition', 'attachment', filename='red_people.jpg')
mime_obj.add_header('Content-Type', 'application/octet-stream')
# 构建mime对象
message = MIMEMultipart('mixed')
# attach包装MIMEImage对象
message.attach(mime_obj)
# 邮件主题
message['Subject'] = '测试邮件'
# 发送方信息
message['From'] = sender_account
# 接受方信息
message['To'] = receivers_account[0]
return message
def sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account, timeout=10, port=465):
with create_email_connect(mail_host, timeout, port) as smtpObj:
try:
smtpObj.login(mail_user, mail_pass)
# 发送邮件
smtpObj.sendmail(
sender_account, receivers_account, email_content().as_string())
print('scusses')
except Exception as e:
print(e)
if __name__ == '__main__':
# 设置服务器所需信息
# 163邮箱服务器地址
mail_host = 'smtp.163.com'
# 163用户名
mail_user = '******@163.com'
# 密码(部分邮箱为授权码)
mail_pass = '******'
# 邮件发送方邮箱地址
sender_account = '******@163.com'
# 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers_account = ['******@qq.com']
sent_email(mail_user, mail_pass, mail_host, sender_account, receivers_account)
来源:https://blog.csdn.net/m0_38039437/article/details/130563417
猜你喜欢
- 导语🎁哈喽!哈喽!我是木木子😎,今日游戏更新——超级玛丽华丽上线🎊啦!“超级玛丽”有多少人还记得这款经典游戏?对于90、00后应该不大熟悉,
- URL 编码是什么东东呢?看看我从网上抄的定义: 引用: url编码是一种浏览器用来打包
- PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数,这些函数都可被称
- 读取文件时报错:xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Exp
- 对所有数据进行整合与管理当你使用SQL Server 2008企业级的数据仓库平台时,你可以高效的操纵所有数据,并对其进行统一管理存储。◆合
- 变量类型ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型。基本类型基本类型指的是简单的数据段,5种基本数据类型:un
- 如下所示:#!/usr/bin/env python#-*- coding: utf-8 -*-"""[0,
- isalnum()方法检查判断字符串是否包含字母数字字符。语法以下是isalnum()方法的语法:str.isa1num()参数
- 内容摘要:一堆数据摆面前,数据背后有什么样的事情在发生,这些数据里面暗藏着什么样的用户需求,什么样的商业机会?看懂这些,将为未来产品设计的方
- 微软今天宣布正式发布SQL Server 2008服务器软件,这将帮助微软与Oracle 11g,IBM DB2 9.5数据库产品对抗.此前
- eval()函数常被称为评估函数,它的功能是去掉参数最外侧引号,变成python可执行的语句,并执行语句的函数。1 eval函数的简介和语法
- python数组和列表的区别列表和数组的定义列表用于顺序存储结构。它可以方便、高效的的添加删除元素,并且列表中的元素可以是多种类型。数组是一
- 工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面
- 在封装自己的FileSystemObject库的时候,测试的时候发现在文件夹或文件很多的时候,效率很低,显示一个文件夹需要2秒甚至更多,这让
- 目录1 键的类型,列表/字典不可以,其它都可以2 多个对象可当作键名,顺序不同时是不同的键3 结论【有误】:今天看别人代码时发现一个事,就是
- 对于软件来说,每一个新版本的推出都应该是一种进步,不可否认,阿里旺旺2008版相较于之前的版本的确是有很多的进步,但进步的同时却也有着比之前
- 一、通信方式进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块主要通过队列方式队列:队列类似于一条管道,元
- 一、可以使用以下步骤获取两个以逗号分割的字符串的并集:使用explode函数将两个字符串转换为数组,以便可以对其执行操作。使用array_m
- 解析url用的类库:python2版本: from urlparse import urlparseimport urllibpython3
- 项目意义如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该pyth