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

news2024/11/25 6:30:08

文章目录

  • 一、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服务器域名或者IP
    	server_port SMTP服务所开放的端口
    	"""
        self.sender = sender
        self.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 MIMEText

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() # 发信完毕,停止连接

补充

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

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

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

import logging
import multiprocessing
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

error_logger = logging.getLogger('celery-error')


class Smtp(object):  # 类名自定义
    def __init__(self, sender, pwd, server_url, server_port):
    	"""
    	sender登录SMTP服务器的用户名 一般为发信邮箱 注意除了使用用户名和密码还可使用密钥
    	pwd 登录SMTP服务器的密码
    	server_url SMTP服务器域名或者IP
    	server_port SMTP服务所开放的端口
    	"""
        self.sender = sender
        self.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.accessSecret
            msg['To'] = send_user
            msg['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.coloradmin.cn/o/1043108.html

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

相关文章

向着趋势奔跑:银行客户中心转型,重构商业模式是关键

随着金融市场化改革的推进 国内银行同业间的竞争日趋激烈 各商业银行在全新的监管要求和市场环境下 纷纷开始推行“以客户为中心”的经营新模式 迅速提升核心竞争力 然而&#xff01;&#xff01;&#xff01; 奇怪的事情发生了 &#x1f447; &#x1f447; &#x1f44…

DP读书:《openEuler操作系统》(三)操作系统的分类

操作系统的发展趋势 微内核库操作系统外内核多内核离散化内核openEuler操作系统简介 操作系统处于应用层与硬件层之间&#xff0c;上看应用、下看硬件。 应用层上&#xff0c;无人驾驶、工业驾驶等场景中&#xff0c;操作系统的可靠性被放在更重要的位置&#xff0c;微内核更受…

即刻报名!飞桨黑客马拉松第五期开启,创新挑战等你来!

新赛制&#xff0c;新玩法 飞桨黑客马拉松第五期 全新挑战&#xff0c;重磅回归&#xff01; 开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营 三大赛道&#xff0c;邀你挑战&#xff01; 多难度梯度开源任务、大模型应用创意挑战、导师1V1指导开发实践 硬核较量一…

SW - 清除零件实体表面上无用的凸起

文章目录 SW - 清除零件实体表面上无用的凸起概述笔记END SW - 清除零件实体表面上无用的凸起 概述 给顶部相机做了一个散射罩, 防止灯光太亮和不均匀. 3D打印的版本. 回来试验后, 要改进一下. 改进完了之后, 发现零件表面有多余的凸起, 看了好多资料, 没看到适用的方法. 如…

亮相“外滩金融峰会” 百望云实力入选“融城杯金融科技创新十佳案例”

近日&#xff0c;第五届“外滩金融峰会”在上海召开&#xff0c;百望云受邀出席峰会&#xff0c;与全球财经政要、机构高管与学界领袖齐聚外滩&#xff0c;分享真知灼见&#xff0c;以对话推动共识。 本届峰会由中国金融四十人论坛&#xff08;CF40&#xff09;与中国国际经济交…

微信加人不频繁的技巧,快码住

微信加人不频繁有哪些技巧&#xff1f; 1、尽量通过手机联系人进行添加 如果对方是你的手机联系人&#xff0c;添加好友可以更方便。不需要像常规方法搜索手机号或者微信号&#xff0c;直接通过手机联系人添加即可。这种方式系统不会认为你频繁加好友。 2、定时定量地去添加好…

线性表(1)

线性表即“把所有数据按照顺序&#xff08;线性&#xff09;的存储结构方式&#xff0c;存储在物理空间”。 线性表又分为 顺序表链表 单向链表双向链表 一、顺序表 数据依次存储在连续的物理空间中&#xff0c;就比如数组。 顺序表存储数据时&#xff0c;会提前申请一整块足够…

centos7忘记root密码重置办法~超简单

此重置linuxroot密码的教程是在centos linux环境中进行的&#xff01;不同版本的linux重置密码的方法是有一定的差的&#xff01; 一. 在下面的页面按“ e ” 编辑内核信息 二. 删除 “ rhgb quiet ” 三. 添加“ rd.break enforcing0 ” ,然后按 Ctrl X进入交互页面 四…

参与抖音官方活动:开启抖音小店的曝光与销售新机会

抖音官方活动是指由抖音平台官方组织或合作举办的各类促销活动、品牌推广活动等。参与抖音官方活动对于抖音小店来说&#xff0c;是一个重要的机会&#xff0c;可以帮助店铺获得更多的曝光和销售机会。下面四川不若与众将介绍抖音小店如何参与抖音官方活动的一般步骤和注意事项…

【LeetCode热题100】--234.回文链表

234.回文链表 快慢指针&#xff1a; 将链表的后半部分反转&#xff08;改变链表结构&#xff09;&#xff0c;然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例 使用快慢指针在一次遍历中找到链表的中间位置&#xff1a…

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

003:如何画出成交量的柱状图

接着《002&#xff1a;如何画出收盘价的曲线图》&#xff0c;继续画成交量柱状图。 import pandas as pd import matplotlib.pyplot as plt# 读取CSV文件&#xff0c;指定逗号作为分隔符 data pd.read_csv(002885.csv, sep,)# 提取成交量和日期数据 volume data[成交量] dat…

tailwind使用教程以及tailwind不生效的问题

以Vite项目为例 我们先安装依赖文件 生成文件 yarn add -D tailwindcss postcss autoprefixer npx tailwindcss init -p配置tailwind.config.js文件 /** type {import(tailwindcss).Config} */ export default {content: ["./index.html","./src/**/*.{vue,j…

基于MWORKS.Sysplorer的油气混合作动筒建模与仿真应用

作为常见的线性传动装置&#xff0c;液压作动筒因其高功率密度和传动平稳、可控性好等特点而被广泛应用于各领域。常规的液压作动筒以油液为介质传递动力&#xff0c;其原理结构如图1所示。液压油从无杆腔进入&#xff0c;推动作动筒活塞伸出&#xff1b;或从有杆腔流入&#x…

递归的总结和案例

①使用递归的方法获取1-100的总和 function sum(num){ if(num 1){ return num 1 }else { return numsum(num-1) } } let num 100 let numSum sum(num) console.log(numSum,numSum) ②数组求和 function arrSum (arr){ let len arr.length…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 B: 双子数

[蓝桥杯 2023 国 B] 双子数 试题 B: 双子数 【问题描述】 若一个正整数 x x x 可以被表示为 p 2 q 2 p^2 \times q^2 p2q2&#xff0c;其中 p p p、 q q q 为质数且 p ≠ q p \neq q pq&#xff0c;则 x x x 是 一个 “双子数”。请计算区间 [ 2333 , 233333333333…

数据结构-在堆中插入或删除新元素

目录 在堆中插入新元素 在堆中删除元素 知识回顾 在堆中插入新元素 首先插入13&#xff08;这里我们依据的是小根堆原则&#xff0c;遇到大根堆也是类似的&#xff09; &#xff08;1&#xff09;将新元素放到队列的队尾&#xff0c;在完全二叉树里面显示的是堆底 如下图…

ElasticSearch - 基础概念,以及和 mysql 的对比

目录 一、ElasticSearch 基础概念 1.1、文档&#xff08;document&#xff09; 1.2、索引&#xff08;index&#xff09; 1.3、映射&#xff08;mapping&#xff09; 二、对比 mysql 2.1、概念对比 2.2、适用场景对比 2.2.1、那是不是说&#xff0c;有了 es 之后&#…

Win10下获取海康威视网络串流(顺便求教Ubuntu服务器做法)

如果有摄像头专供充电器最好&#xff0c;那样可以用交换机&#xff0c;而且可以用海康威视官方的&#xff08;大概&#xff09;400密码重置助手获取摄像头IP地址&#xff0c;并做账号初始化等工作 我是一开始还有充电器的时候做了账号初始化&#xff0c;但是现在找不着充电器了…

java - 数组工具类Arrays

目录 前言 一、Arrays是什么? 二、常用方法 1.toString()&#xff1a;将数组转换为字符串形式。 2. binarySearch()&#xff1a;在已排序的数组中查找指定元素的索引。 3.fill()&#xff1a;将数组的所有元素都设置为指定值。 4. copyOf()&#xff1a;将一个数组的部分或…