首页 > 编程语言 >[python]邮件发送注意事项

[python]邮件发送注意事项

时间:2024-07-06 09:32:06浏览次数:17  
标签:code name python self receiver 注意事项 email 邮件

邮件格式

关于发信,需要遵循国际发信协议要求[4],例如RFC5322协议,避免因为格式不合法,导致被收信服务器拒收。

在二零二三年以前,在开发Python的邮箱发信接口时,对邮箱格式要求不高,主要还算因为发信协议的不够完善,因此之前发信接口的开发比较随意,但随着近年来的发展,电子邮件的广泛应用,邮件相关协议也逐渐完善,例如在RFC2047, RFC822协议,明确支出了邮件标头"From"的形式有两种写法,第一种写法是邮箱地址的形式(用户名@邮件服务器域名),第二种写法是“昵称”+空格+<“邮件地址”> 的形式,并且规定如果昵称不仅仅包含ASCLL字符时,需要使用base64对昵称进行编码,并且规定昵称使用base64编码后的最终格式为"=?" charset "?" encoding "?" encoded-text "?="

相关文献

①https://www.rfc-editor.org/rfc/rfc5322

②https://www.rfc-editor.org/rfc/rfc822

③https://www.rfc-editor.org/rfc/rfc2047

参考代码

# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/5/6
# Coding:UTF-8
import hashlib

import flask, json
from flask import request
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
import random


class EmailSentObject:
    """
    发送邮件对象
    """
    mail_host = "smtp.ym.163.com"  # 网易企业邮箱SMTP服务器
    mail_admin = '请输入邮箱'  # 企业邮箱账号
    mail_pwd = '请输入密码'  # 企业邮箱密码
    mail_sender = "请输入邮箱"  # 企业邮箱账号
    admin_name = "萌狼工作室"  # 发信人姓名
    admin_name_base64 = '=?utf-8?B?6JCM54u85bel5L2c5a6k?='
    admin_email = mail_sender  # 发信人邮箱 与企业邮箱账号保持一致

    # nc -w 2 smtp.ym.163.com 465 < /dev/null && echo "port is ok"
    def __init__(self, receiver_email, receivers_name, subject, content):
        """
        邮件发送对象参数
        :param receiver_email: 接收者邮件,类型为List
        :param receivers_name: 接收者姓名,类型为string
        :param subject: 邮件主题,类型为string
        :param content: 邮件正文,支持解析HTML标签,类型为string
        """
        self.receivers_email = receiver_email  # 接收者邮件,类型为List
        self.receivers_name = receivers_name  # 接收者姓名,类型为string
        self.subject = subject  # 邮件主题,类型为string
        self.content = content  # 邮件正文,支持解析HTML标签,类型为string

    def sent(self):
        """
        发送邮件
        :return: 成功返回 True | 失败返回 False
        """
        message = MIMEMultipart('related')
        message['From'] = '"{}" <{}>'.format(self.admin_name_base64, self.admin_email)
        # message['From'] = Header('{}'.format(self.admin_email), 'utf-8')  # 发信人
        # message['From'] = Header('"{}" <{}>'.format(self.admin_name_base64, self.admin_email), 'utf-8', header_name="From")  # 发信人
        print(message['From'])
        message['To'] = Header(self.receivers_email, 'utf-8')  # 收信人
        message['Subject'] = Header(self.subject, 'utf-8')  # 邮件主题
        msgAlternative = MIMEMultipart('alternative')
        message.attach(msgAlternative)
        msgAlternative.attach(MIMEText(self.content, 'html', 'utf-8'))
        try:
            smtpObj = smtplib.SMTP_SSL(self.mail_host)  # 连接发信服务器
            smtpObj.connect(self.mail_host, 465)
            smtpObj.login(self.mail_admin, self.mail_pwd)  # 发信账号连接
            smtpObj.sendmail(self.mail_sender, self.receivers_email, message.as_string())  # 发送邮件
            return True
        except  smtplib.SMTPException:
            return False


def send_email_code(receiver, name):
    code = str(random.randint(0, 10)) + str(random.randint(0, 9)) + str(random.randint(0, 9)) + str(
        random.randint(0, 9)) + str(random.randint(0, 9)) + str(random.randint(0, 9))
    subject = "【验证码】萌狼工作室旗下产品用户操作验证码"
    content = """
    <p>[萌狼工作室]操作验证,您的验证码为</p>
    <h1>{}<h1>
    <p>请勿泄露自己的验证码。</p>
    <p>如果这不是你自己操作获得的邮件,忽略即可。</p>
    <small>(本邮件发送发送自萌狼工作室通知专用企业邮箱,无需回复)</small>
    """.format(code)
    sent = EmailSentObject(receiver, name, subject, content).sent()
    if sent:
        return code
    else:
        return -1


def send(receiver, name, key):
    if receiver == "":
        return {"Error": 0, "提示": "未填写收信邮箱"}  # 未填写邮箱
    if name == "":
        name = receiver
    md5hash = hashlib.md5()
    md5hash.update(key.encode(encoding='utf-8'))
    md5 = md5hash.hexdigest()
    if md5 == "4fa638bf5ac1d9cb8d43474a4a19294c":
        code = send_email_code(receiver, name)
        if code == -1:
            # 邮件发送失败
            return {"code":46501, "msg": "发送失败,请检查邮箱是否正确"}  # 邮件发送失败
        return {"code":1, "msg": "发送成功", "data": {"user": name, "receiver": receiver, "code": code}}
    return {"code": 46500, "msg": "没有权限"}  # 无权限操作


if __name__ == '__main__':
    key= "哔哩哔哩:萌狼蓝天"
    md5hash = hashlib.md5()
    md5hash.update(key.encode(encoding='utf-8'))
    md5 = md5hash.hexdigest()
    print(md5)

建议

不要使用个人163邮箱,很容易封号

推荐使用网易免费域名邮箱

标签:code,name,python,self,receiver,注意事项,email,邮件
From: https://www.cnblogs.com/mllt/p/18286902

相关文章

  • 运用Python与Keras框架打造深度学习图像分类应用:详尽步骤与代码实例解析
    引言随着深度学习技术的飞速发展,其在图像识别和分类领域的应用日益广泛。在这一背景下,Python因其丰富的数据科学库和强大的生态系统而成为首选编程语言之一。在本文中,我们将深入探讨如何使用Python和其中的Keras深度学习框架来完成一个实际的图像分类任务。我们将通过详细的代......
  • 低代码框架选型注意事项?
        #低代码选型##低代码框架选型#        低代码框架这些年在企业软件行业可谓是烂大街的一个概念,网上一搜各种低代码框架琳琅满目,搜索引擎翻十页不带重样的。笔者在一个甲方公司的信息部搬砖,今年遇到过几次和软件供应商交流完产品和解决方案后,供应商强调他......
  • [python]Markdown图片引用格式批处理桌面应用程序
    需求使用python编写一个exe,实现批量修改图片引用,将修改后的文件生成为文件名_blog.md。有一个编辑框,允许接收拖动过来md文件,拖入文件时获取文件路径,有一个编辑框编辑修改后的文件的输出路径,用户拖入文件时,就能自动得到输出的路径作用是将md文件中的例如![image-20240706062921......
  • python随笔day01
    python随笔day011.不使用中间变量,交换两个变量的值?#方法一:a=10b=20print(f"a={a},b={b}")a,b=b,aprint(f"a={a},b={b}")#方法二:相加减a=10b=20print(f"a={a},b={b}")a=a+bb=a-ba=a-bprint(f"a={a},b={b}")#方......
  • Python在网络爬虫和数据抓取中的应用
    Python在网络爬虫和数据抓取中的应用引言在数字化时代,数据的价值日益凸显。无论是市场趋势分析,还是个人偏好预测,数据都扮演着至关重要的角色。Python,作为一种功能强大、语法简洁的编程语言,为数据的获取、处理和分析提供了一整套解决方案。本文将带您深入了解Python在网络......
  • python笔记day01
    python随笔day011.不使用中间变量,交换两个变量的值?#方法一:a=10b=20print(f"a={a},b={b}")a,b=b,aprint(f"a={a},b={b}")#方法二:相加减a=10b=20print(f"a={a},b={b}")a=a+bb=a-ba=a-bprint(f"a={a},b={b}")#方......
  • ChatGPT对话:Python程序自动模拟操作网页,无法弹出下拉列表框
    【编者按】需要编写Python程序自动模拟操作网页。编者有编程经验,但没有前端编程经验,完全不知道如何编写这种程序。通过与ChatGPT讨论,1天完成了任务。因为没有这类程序的编程经验,需要边学习,边编程,遇到问题再网上查资料。如果没有ChatGPT,估计至少需要5天时间。从登录开始模拟......
  • python批量修改文件后缀名
    python批量修改文件后缀名 importosimportglobdefbatch_rename_files(source_dir,old_extension,new_extension):#确保新的文件名不会与现有文件冲突defget_new_name(file_path,new_extension):base_name=os.path.splitext(file_path)[0]......
  • 使用Python和scikit-learn实现支持向量机(SVM)
            支持向量机(SupportVectorMachine,SVM)是一种强大的监督学习算法,广泛用于分类和回归问题。它能够有效处理线性和非线性数据,并在复杂数据集中表现出色。本文将介绍如何使用Python和scikit-learn库实现SVM,以及如何通过可视化不同参数设置来理解其工作原理。一、......
  • python简单入门(五)
    一、面对对象程序设计基础1. 面对对象程序设计思想概述面向对象程序设计(Object-OrientedProgramming,简称OOP)是一种编程范式,它将数据和操作数据的方法封装在一个对象中。这种方法强调的是将现实世界中的实体抽象为对象,每个对象都有其独特的属性和行为。在Python中,面向对象......