邮件功能-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.rhkb.cn/news/142322.html

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

相关文章

ORACLE 内存结构之系统全局区(SGA)

每个 Oracle 数据库实例都会在内存中分配一个很大的内存结构&#xff0c; 称为系统全局区(System Global Area), 这是一个大型的共享内存结构,每个Oracle进程都会访问它。 在Linux/Unix操作系统上,SGA是一个物理实体&#xff0c;使用操作系统命令能“看到它”。 它被操作系…

一维卷积神经网络

假设输入数据维度为8&#xff0c;filter维度为5&#xff1b; 不加padding时&#xff0c;输出维度为4&#xff0c;如果filter的数量为16&#xff0c;那么输出数据的shape就是4*16. 一维卷积不代表卷积核只有一维&#xff0c;也不代表被卷积的feature也是一维。一维的意思是说卷…

RIP路由

目录 RIP路由 1、什么是RIP路由 2、RIP的工作原理是什么 3、RIP v1 和 RIP v2的区别 4、RIP的常用场景 5、RIP的通信流程 6、RIP的优缺点 优点&#xff1a; 缺点&#xff1a; 7、扩展部分 1.RIP路由的作用与应用场景 2.与其他路由协议的区别 3.RIP路由协议的工作原…

OpenCV显示10bit Raw数据

参考&#xff1a;10 12 14bit图像存储格式&#xff0c;利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现&#xff1a; #include<opencv2/opencv.hpp> #include<iostream> #include<opencv/highgu…

2023年毫米波行业研究报告

第一章 行业概况 1.1 定义 毫米波是一种电磁波&#xff0c;其波长范围在1毫米至10毫米之间&#xff0c;频率介于30GHz至300GHz。与sub-6G (6GHz以下频段&#xff09;的5G系统相比&#xff0c;5G毫米波通信在带宽、时延和灵活弹性空口配置方面具有明显优势。这使其能够有效地满…

【C语言练习】DOS黑框框通讯录(使用结构体、动态内存管理联系人信息,函数指针等)

文章目录 1. contacts.h 头文件、函数/常量/结构体声明2. test.c 主界面菜单打印、菜单功能选项选择3. contacts.c 函数实现4. 使用结构体、动态内存&#xff0c;函数指针实现时的注意点5. 运行演示 1. contacts.h 头文件、函数/常量/结构体声明 #pragma once#include <std…

探索公共厕所的数字化治理,智慧公厕完善公共厕所智能化的治理体系

随着城市化进程的不断发展&#xff0c;公共厕所治理成为一个不容忽视的问题。如何通过数字化手段来提升公共厕所管理水平&#xff0c;成为了一个备受关注的话题。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量精品案例项目实景实图&#xff0c;探讨公共厕所数…

使用transformers进行端到端的目标检测

目录 目标检测的旧方法 使用transformers进行端到端的目标检测 抛去了目标检测旧的方法 网络架构 Transformer encoder Transformers and Parallel Decoding 注意力起到的作用 使用Hungarian algorithm算法完成匹配 在使用transformers的端到端目标检测中&#xff0c;匈…

【开发篇】七、RedisTemplate与StringRedisTemplate + Jedis与Lettcus

文章目录 1、RedisTemplate详解2、常用方法3、关于IDEA的报黄4、RedisTemplate和StringRedisTemplate的区别5、如何通用RedisTemplate和StringRedisTemplate6、Jedis7、Jedis的连接池8、封装Jedis工具类8、RedisTemplate底层实现技术切换 1、RedisTemplate详解 RedisTemplate是…

spark Structured报错解决

报错&#xff0c;不想看原因的直接去解决方案试试 Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/Administrator/AppData/Local/Temp/1/temporary-611514af-8dc5-4b20-9237-e5f2d21fdf88/metadata from hdfs://master:8020/C…

C语言的stdio.h的介绍

C语言的stdio.h的介绍 C语言的stdio.h的介绍 C语言的stdio.h的介绍C语言stdio.h的介绍 C语言stdio.h的介绍 这个含义是导入标准输入输出库 包含头文件.h&#xff0c;std标准库&#xff0c;io是input output输入输出库 <>代表系统库&#xff0c;自定义的话用""…

Ingress Controller

什么是 Ingress Controller &#xff1f; 在云原生生态中&#xff0c;通常来讲&#xff0c;入口控制器( Ingress Controller )是 Kubernetes 中的一个关键组件&#xff0c;用于管理入口资源对象。 Ingress 资源对象用于定义来自外网的 HTTP 和 HTTPS 规则&#xff0c;以控制进…

解决typescript报错:不能将类型xxx分配给类型xxx

现象&#xff1a; 这种情况是因为组件传参时&#xff1a; 等号左右两边的数据类型不能严格匹配一致造成的 等号左边data, 查看一下被传参的子组件ProductList的内部data属性: 可以看到data的类型是 &#xff1a; Product[] 而右边的shoppingCartItems来自于&#xff1a; redu…

作为一名独立开发者,如何获取客户?

很多程序员想成为一名独立开发者&#xff0c;从事自由职业&#xff0c;最大的困难在于如何赚钱&#xff0c;进一步来说&#xff0c;就是如何找到自己的客户&#xff0c;有很多开发者拥有丰富的经验&#xff0c;优秀的能力&#xff0c;但无法吸引客户。这篇文章的灵感正是为此而…

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…

Spring整合第三方框架-MyBatis原始操作代码

建议自己写一下 实体类&#xff0c;用于封装数据库数据 package com.example.pojo;import java.util.Date;public class Emp {private Integer id;private String username;private String password;private String name;private Integer gender;private String image;privat…

网络安全内网渗透之DNS隧道实验--dnscat2直连模式

目录 一、DNS隧道攻击原理 二、DNS隧道工具 &#xff08;一&#xff09;安装dnscat2服务端 &#xff08;二&#xff09;启动服务器端 &#xff08;三&#xff09;在目标机器上安装客户端 &#xff08;四&#xff09;反弹shell 一、DNS隧道攻击原理 在进行DNS查询时&#x…

Redis可视化工具-Another Redis Desktop Manager 安装

Another Redis DeskTop Manager 是 Redis 可视化管理工具&#xff0c;体积小&#xff0c;完全免费。最重要的是稳定&#xff0c;而且操作简单、方便。 目录 一、下载安装 下载 安装 二、简单使用 连接 新增key 三、springboot整合redis 前期准备 一、下载安装 下载 下载…

ARM IIC总线实现温湿传感器

IIC.h #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"/* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_OUT do{G…

数据库选型参考

文章目录 前言嵌入式数据库数据库服务器PostgreSQL和MySQL的对比 NoSQL国产数据库阿里PolarDB腾讯TDSQL阿里OceanBase和PolarDB的区别 华为GaussDb 前言 DB-Engines Ranking 会根据受欢迎程度对数据库管理系统进行排名&#xff0c;排名每月更新一次。 分为关系型数据库、Key-V…