邮件功能-python中的SMTP协议邮件发送

文章目录

  • 一、SMTP协议邮件准备
  • 二、smtplib模块
    • 1.使用smtplib封装一个邮件类
    • 2.发送邮件
  • 补充


一、SMTP协议邮件准备

需要一个smtp服务器

二、smtplib模块

smtplib模块是python自带的模块

1.使用smtplib封装一个邮件类

import smtplib
import logging  # 加入日志,保持这个好习惯,使用前需要配置class Smtp(object):  # 类名自定义def __init__(self, sender, pwd, server_url, server_port):"""sender 登录SMTP服务器的用户名 注意除了使用用户名和密码还可使用密钥pwd 登录SMTP服务器的密码server_url SMTP服务器域名或者IPserver_port SMTP服务所开放的端口"""self.sender = senderself.smtp = smtplib.SMTP(server_url, server_port, timeout=5)  # 创建smtp对象self.smtp.starttls()  # 开始TSL加密self.smtp.login(sender, pwd)  # 使用密码或者密码获取登陆凭证def mail(self, *args):  # 发送邮件"""俩个参数依次为:收信邮箱、内容"""self.smtp.sendmail(self.sender, args[0], args[1])def stop_mail(self):  # 邮件发送完毕后需要关闭连接,释放资源"""停止smtp"""self.smtp.quit()

2.发送邮件

代码如下(示例):

import multiprocessing  # 进程模块
import smtplib
from email.header import Header 
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMETextdef send_mail(send_user, send_pwd, server_url, server_port, to_mail, msg):  # msg为smtp的html内容对象,需要完成复杂邮件内容时需要用到MIMEMultipart,此处的msg便为MIMEMultipart(复杂内容为,附件、表格、图片等)smtp_send = Smtp(send_user, send_pwd, server_url, server_port)  # 户名、密码、域名、端口smtp_send.mail(to_mail, msg.as_string()) # 收信人邮箱、bytes数据(直接放字符串内容也行,smtplib会自动转化)smtp_send.stop_mail() # 发信完毕,停止连接

补充

完成上诉代码就能发送邮件了,但STMP协议发送邮件时会阻塞主进程以及网络,所以当你要异步发送smtp协议的邮件时使用线程、协程时无法达成异步效果的,需要开启新的进程

附上完整代码以及进程发送邮件

我代码中邮箱的表格样式:
在这里插入图片描述

import logging
import multiprocessing
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMETexterror_logger = logging.getLogger('celery-error')class Smtp(object):  # 类名自定义def __init__(self, sender, pwd, server_url, server_port):"""sender登录SMTP服务器的用户名 一般为发信邮箱 注意除了使用用户名和密码还可使用密钥pwd 登录SMTP服务器的密码server_url SMTP服务器域名或者IPserver_port SMTP服务所开放的端口"""self.sender = senderself.smtp = smtplib.SMTP(server_url, server_port, timeout=5)  # 创建smtp对象self.smtp.starttls()  # 开始TSL加密self.smtp.login(sender, pwd)  # 使用密码或者密码获取登陆凭证def mail(self, *args):  # 发送邮件"""俩个参数依次为:收信邮箱、内容"""self.smtp.sendmail(self.sender, args[0], args[1])def stop_mail(self):  # 邮件发送完毕后需要关闭连接,释放资源"""停止smtp"""self.smtp.quit()def send_mail(send_user, send_pwd, server_url, server_port, to_mail, msg):  # msg为smtp的html内容对象,需要完成复杂邮件内容时需要用到MIMEMultipart,此处的msg便为MIMEMultipart(复杂内容为,附件、表格、图片等)smtp_send = Smtp(send_user, send_pwd, server_url, server_port)  # 户名、密码、域名、端口smtp_send.mail(to_mail, msg.as_string()) # 收信人邮箱、bytes数据(直接放字符串内容也行,smtplib会自动转化)smtp_send.stop_mail() # 发信完毕,停止连接def mail_to_user(**kwargs):user_obj = Users.objects.filter(username=kwargs.get('touser')).first()try:if user_obj:# 收信人邮箱send_user = 'kkk@qq.com'# 创建MIMEMultipart对象,此处我生成了一个table表格msg = MIMEMultipart()# 设置邮件主题和发件人信息msg['From'] = key_obj.accessSecretmsg['To'] = send_usermsg['Subject'] = Header("测试邮件", 'utf-8')# 创建表格内容的列表table_data = ["测试类型", "测试状态", "申请人", "2023-9-26"]# 初始化表格HTML字符串table_html = """<table><tr><th>类型</th><th>状态</th><th>申请人</th><th>预约完成日期</th></tr>"""# 构建表格内容的HTML字符串 如果此处内容时多行的可以循坏拼接这一段table_html += f"""<tr><td>{table_data[0]}</td><td>{table_data[1]}</td><td>{table_data[2]}</td><td>{table_data[3]}</td></tr>"""table_html += "</table>"# 将表格内容html加入到html代码中html_content = """<html><style type="text/css">table thead, table tr {border-top-width: 1px;border-top-style: solid;border-top-color: rgb(211, 202, 221);}table {border-bottom-width: 1px;border-bottom-style: solid;border-bottom-color: rgb(211, 202, 221);}table td, table th {padding: 5px 10px;font-size: 12px;font-family: Verdana;color: rgb(95, 74, 121);}table tr:nth-child(even) {background: rgb(223, 216, 232)}table tr:nth-child(odd) {background: #FFF}</style><body>""" + table_html + """</body></html>"""# 将表格内容作为MIMEText对象添加到邮件中table_part = MIMEText(html_content, 'html', 'utf-8')msg.attach(table_part)process = multiprocessing.Process(target=send_mail, args=("admin@qq.com", "password", "127.0.0.1", 8043, "test@qq.com", msg))process.start()except Exception as e:print(str(e))error_logger.error('邮件发送错误 ' + str(e))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的泛型

一. 泛型简介 泛型&#xff0c;即“参数化类型”。 作为Java中常用且重要的一个概念&#xff0c;泛型帮我们实现了代码重用&#xff0c;也保证了类型安全。但关于它的详细内容&#xff0c;目前很多同学还不清楚&#xff0c;所以接下来就带各位来学习这个重要的知识点。 背景 …

ArduPilot开源飞控之GCS显示DPS310异常问题

ArduPilot开源飞控之GCS显示DPS310异常问题 1. 源由2. 现象3. 分析3.1 Mission Planner3.2 Ardupilot3.3 AP_Baro分析3.4 AP_Baro定位 4. 修复5. 效果6. 参考资料7. 补充7.1 Ardupilot提交PR注意事项7.2 修复主要使用到的命令 1. 源由 2020年Ardupilot官网论坛就有开始讨论DPS…

计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

python基于轻量级卷积神经网络模型GhostNet开发构建养殖场景下生猪行为识别系统

养殖业的数字化和智能化是一个综合应用了互联网、物联网、人工智能、大数据、云计算、区块链等数字技术的过程&#xff0c;旨在提高养殖效率、提升产品质量以及促进产业升级。在这个过程中&#xff0c;养殖生猪的数字化智能化可以识别并管理猪的行为。通过数字化智能化系统&…

idea 通过tomcat 配置 https方式访问

步骤1&#xff1a;管理员模式打开cmd命令进行生成密匙 D:\software\apache-tomcat-8.5.93\bin\tomcat.keystore 是生成密匙存放的路径&#xff0c;修改成自己tomcat的路径即可 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\s…

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;Web架构&#xff1e;Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…

使用香橙派 在Linux环境中安装并学习Python

前言 在实际项目中&#xff0c;经常会遇到需要使用人工智能的场景&#xff0c;如人脸识别&#xff0c;车牌识别等...其一般的流程就是由单片机采集数据发送给提供人工智能算法模型的公司&#xff08;百度云&#xff0c;阿里云...&#xff09;&#xff0c;然后人工智能将结果回…

C++ 继承详解

目录 C 继承介绍 继承中的特点 public 继承 protected 继承 private 继承 在类里面不写是什么类型&#xff0c;默认是 private 的 如果继承时不显示声明是 private&#xff0c;protected&#xff0c;public 继承&#xff0c;则默认是 private 继承&#xff0c;在 struct …

如何给Nginx配置访问IP白名单

一、Nginx配置访问IP白名单 有时部署的应用需要只允许某些特定的IP能够访问&#xff0c;其他IP不允许访问&#xff0c;这时&#xff0c;就要设置访问白名单&#xff1b; 设置访问白名单有多种方式&#xff1a; 1.通过网络防火墙配置&#xff0c;例如阿里云/华为云管理平台 2.…

百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?

Forbidden site not allowed You do not have the proper credential to access this page. If you think this is a server error, please contact the webmaster. 如果你的百度资源平台&#xff0c;点进去出现这个提示&#xff0c;说明您的网站已经被百度清退了。如果你的网站…

C语言数组和指针笔试题(三)(一定要看)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个…

【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现

目录 一、非线性方程式求根 1、二分法&#xff08;Bisection Method、对分法&#xff09; a. 理论简介 b. python实现 2、迭代法&#xff08;Iterative Method&#xff09; a. 理论简介 b. python实现 3、Newton 迭代法&#xff08;Newtons Method&#xff09; a. 理论…

电脑入门:电脑不认新硬盘时该怎么办?

电脑不认新硬盘时该怎么办? 当新硬盘加进后,正常工作时,没有什么问题。若电脑遇到特殊情况时,电脑对新硬盘“不认”,可采取以下措施让电脑重新“认”新硬盘,显示新分区(如G、H、I、J)。 咱的目的是保持S-ATA的开启,把控制板载S-ATA设定值由No变成Yes就可以。 首…

【数据结构与算法】链表的实现以及一些基本算法

目录 单选链表的基本实现 有序列表的合并&#xff08;双指针法&#xff09; 链表的反转 链表实现两数之和 判定链表是否有环 单选链表的基本实现 public class LinkedList1 {//头节点Node first;//尾节点Node last;//大小int size 0;//头插法public void addFirst(int…

微信小程序学习笔记3.0

第3章 资讯类:仿今日头条微信小程序 3.1 需求描述及交互分析 需求描述 仿今日头条微信小程序,要具有以下功能。 (1)首页新闻频道框架设计,包括底部标签导航设计、新闻检索框设计及新闻频道滑动效果设计。 (2)首页新闻内容设计,包括新闻标题、新闻图片及新闻评论设计…

TikTok的媒体革命:新闻业如何适应短视频时代?

在数字时代&#xff0c;媒体行业一直在不断演变和创新&#xff0c;以适应观众的变化需求和技术的发展。而在这个进化的过程中&#xff0c;短视频应用TikTok已经崭露头角&#xff0c;成为了一个重要的信息传播平台。 这篇文章将深入探讨TikTok如何引领了媒体的一场革命&#xf…

转载-C#学习笔记-基本概念(CLR、CTS、CLS...)

1. CLR(Common Language Runtime&#xff0c;公共语言运行时(库)) 可由多种.NET语言使用的运行时环境&#xff0c;其主要作用是定位、加载和管理.NET类型、内存管理、安全检查、线程管理等。.NET运行库提供了一个定义明确的运行库层&#xff0c;可以被支持.NET的所有语言和平台…

2、Linux中静态IP与动态IP的修改

修改为静态IP 打开文件 sudo vim /etc/network/interfaces修改如下 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopbackauto ens33#配置网络为DHCP模式 #iface ens33 inet dhcp#配置网络 ens33为静态IP模式 iface ens33 inet static #设置…

基于Vue+ELement搭建动态树与数据表格实现分页

基于VueELement搭建动态树与数据表格实现分页 一、前言二、左侧动态树实现2.1.后台数据接口定义2.2.前端导航菜单绑定2.3.根据数据渲染页面 3.分页 一、前言 在上一篇博文我们搭建了首页导航和左侧菜单&#xff0c;但是我们的左侧菜单是死数据今天我们就来把死的变成活的&#…

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…