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

news/2024/7/24 11:47:43 标签: python

文章目录

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


一、SMTP协议邮件准备

需要一个smtp服务器

二、smtplib模块

smtplib模块是python自带的模块

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

python">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.发送邮件

代码如下(示例):

python">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协议的邮件时使用线程、协程时无法达成异步效果的,需要开启新的进程

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

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

python">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.niftyadmin.cn/n/5052782.html

相关文章

Rocky linux8.8系统通过packstack安装OpenStack yoga版本

目录 材料准备环境配置关闭防火墙和selinux主机网络chrony时间同步安装openstack选择你想安装的openstack版本并安装安装packstackall in one一键部署openstack(不推荐,新手适用)通过应答文件部署附录:CentOS Steam 9配置阿里yum源附录:rocky换中科大源材料准备 Rocky lin…

Ceph入门到精通-netstat -s|grep “dropped“

“104081 SYNs to LISTEN sockets dropped” 是一个网络错误消息&#xff0c;通常出现在服务器日志或网络设备日志中。SYN 是 TCP 握手过程中的一个步骤&#xff0c;用于建立连接。而 LISTEN sockets 是服务器用于接收新连接的状态。 这个错误消息表示服务器接收到了 104081 个…

[Linux]Git

文章摘于GitHub博主geeeeeeeeek 文章目录 1.1 Git 简易指南创建新仓库工作流添加与提交推送改动 1.2 创建代码仓库git init用法讨论裸仓库 例子 git clone用法讨论仓库间协作 例子用法讨论栗子 1.3 保存你的更改git add用法讨论缓存区 栗子 git commit用法讨论记录快照&#xf…

医院陪诊系统:改善患者体验的技术创新

医院陪诊系统是一种创新的技术解决方案&#xff0c;旨在提高患者在医疗机构的整体体验。它不仅为患者提供便利&#xff0c;还增加了医疗机构的效率。本文将深入探讨医院陪诊系统的技术创新&#xff0c;包括其关键功能和实现方法。 1. 医院陪诊系统的基本功能 医院陪诊系统的…

九日集训 Leetcode 371.两整数之和

给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出&#xff1a;5提示&#xff1a; -1000 < a, b < 10…

【Vue】动态树与数据表格分页查询实现

目录 一、动态树 1.1 准备工作 1.1.1 准备数据库 1.1.2 准备好后台服务接口&#xff0c;Moudel查询&#xff0c;和Book查询&#xff08;支持分页&#xff09; 1.1.3 修改mock.js测试环境 1.1.4 配置请求路径 1.2 构建导航菜单 1.2.1 通过接口获取数据 1.2.2 通过后台获…

Prettier - Code formatter格式化规则文件

文章目录 前言安装使用 前言 先前公司在规范代码时,由于个人业务繁忙跟技术总监是后端出身用的IDEA不熟悉vsCode;以及大多数时都自己一个人负责一个项目,当时并不看重这些;最近在整理vue3tsvite的脚手架模板(平时工作用的react),开始整理格式化代码,方便之后 vue 和 react 中应…

(一)连续随机量的生成-加权重采样

加权重采样 import numpy as np import matplotlib.pyplot as plt# Step 1: Generate 10,000 random theta values from U([0, 1]) n 10000 theta_values np.random.rand(n)# Define the function to compute weights for a given theta def compute_weight(theta):return (…