邮件格式

关于发信,需要遵循国际发信协议要求[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邮箱,很容易封号

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

[python]邮件发送注意事项的更多相关文章

  1. centos 7 keepalived故障邮件通知实战(附Python邮件发送脚本)

    centos 7 keepalived故障邮件通知实战(附Python邮件发送脚本) #####################     sendmail.py  begin     ######## ...

  2. Python 邮件发送

    python发送各类邮件的主要方法   python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点.     一.相关模块介绍 ...

  3. Python邮件发送脚本(Linux,Windows)通用

    脚本 #!/usr/bin/python #-*- coding:utf-8 -*- #Python Mail for chenglee #if fileformat=dos, update file ...

  4. python邮件发送脚本

    转自:http://phinecos.cnblogs.com/ #!/usr/bin/python #coding=utf-8 #@author:dengyike #@date:2010-09-28 ...

  5. python邮件发送

    '''qq邮件与其他邮件有所不同,下以我的qq邮件为例(切勿转载):''' import osimport smtplibfrom email.mime.text import MIMEText # ...

  6. Python邮件发送源码

    -- coding:utf-8 -- i = 0 while i < 10: #发送十次 import smtplib from email.mime.text import MIMEText ...

  7. python邮件发送自动化测试报告

    话不多说直接贴代码 # encoding: utf-8import smtplib #发送邮件模块from email.mime.text import MIMEText #邮件内容from emai ...

  8. python邮件发送:普通文本、html、添加附件

    # -*- coding: utf-8 -*- # @Time : 2019/9/19 13:46 # @Author : HuangWenjun # @Email : 350920551@qq.co ...

  9. python 邮件发送 脚本

    import smtplib from email.header import Header from email.mime.text import MIMEText from_addr = 'XXX ...

  10. python 邮件发送实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- from email.header import Header from email.mime.text i ...

随机推荐

  1. Java日期时间API系列26-----Jdk8中java.time包中的新的日期时间API类,YearMonth类的源码,转换和应用。

    Java8中为年月新增了类YearMonth,可以用来表示卡片过期时间等问题. 1.YearMonth 默认格式为:2007-12 1.1 部分源码 * * @implSpec * This clas ...

  2. element表单校验 【登录】

    async btnOK () { // 1. 表单校验 (调用表单的校验方法获取校验结果) // this.$refs.formRef.validate(function (valid) { // c ...

  3. js中常见的继承

    1. 使用原型链继承 2. 通过构造函数继承 通过构造函数,创建的实例,可以访问构造函数的属性和方法,以及可以访问构造函数的原型对象 prototype 上的数据和方法 : 3. 组合继承(1 和 2 ...

  4. kotlin类和对象—>类与继承

    1.类的定义,kotlin中依旧使用关键字class声明类,类声明由类名.类头(指定其类型参数.主构造函数等)以及由花括号包围的类体构成.类头与类体都是 可选的;如果一个类没有类体,可以省略花括号. ...

  5. 云原生周刊:Istio 1.19 发布 | 2023.9.11

    开源项目推荐 Timoni Timoni 是 Kubernetes 的软件包管理器,由 CUE 提供支持,灵感来自 Helm. Timoni 项目致力于改善编写 Kubernetes 配置的用户体验. ...

  6. Games104 现代游戏引擎 Picoolo环境搭建 vulkan配置

    0 前言介绍 games104 现代游戏引擎课程是由 GAMES: Graphics And Mixed Environment Symposium 支持的一个课程. 如我们所视,Games并非的含义 ...

  7. Machine Learning Week_5 Cost Function and BackPropagation

    目录 0 Neural Networks: Learning 1 Cost Function and BackPropagation 1.1 Cost Function 1.2 Backpropaga ...

  8. Java高并发Lock接口讲解,精准通知线程间的执行顺序

    题目:两个线程操作一个变量,实现两个线程对同一个资源一个进行加1操作,另外一个进行减1操作,且需要交替实现,变量的初始值为0.即两个线程对同一个资源进行加一减一交替操作. Lock接口与Conditi ...

  9. 2.9 使用系统光盘修复Linux系统

    如果系统错误已经导致单用户模式不能进入了,那么是否需要重新安装Linux 系统?不用着急,为了应对单用户模式也无法修复的错误,Linux 系统提供了 rescue 救援(光盘修复)模式. rescue ...

  10. Matlab矩阵运算的硬件资源分析

    在用Matlab创建矩阵并计算矩阵乘法运算时,要注意计算机的可用内存大小(空间资源)和CPU性能(影响所用计算时间). 例如我们做以下测试:n为qubit的数目,那么一个矩阵Matrix_A=rand ...