[python]邮件发送注意事项

news/2024/10/5 8:16:12/文章来源:https://www.cnblogs.com/mllt/p/18286902

邮件格式

关于发信,需要遵循国际发信协议要求[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 hashlibimport 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 randomclass 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  # 接收者邮件,类型为Listself.receivers_name = receivers_name  # 接收者姓名,类型为stringself.subject = subject  # 邮件主题,类型为stringself.content = content  # 邮件正文,支持解析HTML标签,类型为stringdef 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 Trueexcept  smtplib.SMTPException:return Falsedef 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 codeelse:return -1def send(receiver, name, key):if receiver == "":return {"Error": 0, "提示": "未填写收信邮箱"}  # 未填写邮箱if name == "":name = receivermd5hash = 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邮箱,很容易封号

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

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

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

相关文章

【QT】工程库引用

创建多工程项目创建子项目UI窗体项目创建库工程项目引用库工程添加日志输出类5.1 需要添加特殊配置,否则编译会报错5.2 正确添加配置5.3 日志正常输出5.4 如果缺少5.1步骤,则报如下错误5.5 如果添加了5.1步骤,还是报The process was ended forcefully 找到项目文件,把debug…

陪玩系统源码,为守护系统安全增添更多助力

陪玩系统源码,为守护系统安全增添更多助力在开发陪玩系统源码时,可以通过加密、解密算法来提升系统的安全性,比较常见的加密、解密算法类型有:1、对称加密:速度快,可逆,常见DES,AES等2、非对称加密:速度慢,可逆,常见RSA等3、签名算法:唯一,不可逆,常见MD5,SHA,…

pycharm创建临时文件scatch file

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 有时您可能需要创建临时注释或在项目上下文之外起草一些代码。为此,您可以使用临时文件和临时缓冲…

P5441

P5441 神仙题目。 tips:后面把 \(4\) 个点说成一个组。我们先考虑一个组怎么连才不是强联通的。一个点 A 向另外三个点 BCD 连一条有向边。在不满足第一种的情况下,BCD 向另一个点 A 连一条有向边。AB 之间连有向边,CD 之间连无向边,然后 AC 和 AD 连一条有向边,BC 和 BD …

二水中分白鹭洲

二水中分白鹭洲 题目大意 假设水中 \(n\) 条体积相等的鱼将按顺序依次排列,准备进行战斗。初始时,每条鱼可以选择向左游或向右游;但是鱼儿不太聪明,它们只会随机选择初始方向。 战斗时,若两条不同方向的鱼相遇,则体积大的鱼会吃掉体积小的鱼;如果两条鱼的体积相同,则向…

git恢复到之前提交的记录

项目搞崩了,还提交上去了怎么办? 那当然是恢复到之前的提交记录了,那怎么操作呢? 首先,到代码托管平台找到你想恢复的提交记录(在此以github为例) 获取 commit id 首先,通过如下图操作获取到commit id {% asset_img image-20240706062921362.png "..." "…

[python]Markdown图片引用格式批处理桌面应用程序

需求 使用python编写一个exe,实现批量修改图片引用,将修改后的文件生成为 文件名_blog.md。有一个编辑框,允许接收拖动过来md文件,拖入文件时获取文件路径,有一个编辑框编辑修改后的文件的输出路径,用户拖入文件时,就能自动得到输出的路径 作用是将md文件中的例如 ![ima…

读人工智能全传04NP完全问题

读人工智能全传04NP完全问题1. 问题解决与搜索 1.1. 解决问题的能力无疑是区分人类和其他动物的关键能力之一 1.1.1. 解决问题是需要智慧的 1.2. 汉诺塔 1.2.1. 对于三个金环而言 1.2.1.1. 你不可能找到少于7次的解决方案了 1.2.2. 最初,我们只能选择移动最小的金环,只有将它…

sunny 拦截不成功解决

可能开了tz,导致无法拦截请求 解决方法:打开这个注释本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18286840

02.内建变量类型

内建变量类型bool,string(u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr 无长度 int 的实际长度取决于操作系统位数(32/64)uintptr 为指针类型byte,rune rune 为 Go 语言的字符型相当于其他语言的 char ,长度为4字节 int32float32,float32,complex64,complex128 complex …

01.变量定义

变量定义 新建项目func variableZeroValue() {//赋空值var a intvar s stringfmt.Printf("%d %q\n", a, s) } 变量赋空值func variableZeroValue() {//赋空值var a intvar s stringfmt.Printf("%d %q\n", a, s) } 变量赋初值func variableInitialValue()…

7.5 - 贪心篇完结

435. 无重叠区间 题意描述:[!WARNING] 给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。…