邮件格式

关于发信,需要遵循国际发信协议要求[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. 16 模块time、datetime、random、hashlib、logging

    1. 时间模块time.datetime 在python中,表示时间有三种方式:时间戳 格式化的时间字符串(Format String): '2022-03-01' 时间元组(struct_time) ...

  2. 逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header

    逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header 搜索示例 搜索 123,网页地址为:https://www.virustotal.com/gui/search/12 ...

  3. 理解 keep-alive

    keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,避免重新渲染 : 对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 act ...

  4. yarn 和 npm 不能混合使用

    当有 yarn.lock 的时候说明项目使用的yarn 创建的 则后面的都要使用 yarn 操作,比如下载 包 等 : 当项目没有 yarn.lock 而是 package.json.lock 说明项 ...

  5. 云原生周刊:K8s 上的 gRPC 名称解析和负载平衡

    开源项目推荐 Kraken Kraken 是一个基于 P2P 的 Docker 注册表,专注于可扩展性和可用性.它专为混合云环境中的 Docker 镜像管理.复制和分发而设计.借助可插拔的后端支持,K ...

  6. 使用 Fluent Bit 实现云边统一可观测性

    本文基于 KubeSphere 可观测性与边缘计算负责人霍秉杰在北美 KubeCon 的 Co-located event Open Observability Day 闪电演讲的内容进行整理. 整理 ...

  7. RAC环境中某数据文件(非system表空间)创建在本地,不停机迁移到ASM磁盘中

    Datafiles are mistakenly built into the local file system for processing in the RAC environment The ...

  8. ROS入门21讲(2)

    四.创建工作空间与功能包 1.工作空间 工作空间(workspace):是一个存放工程开发相关文件的文件夹(相当于在IDE中创建的工程文件). 包含: src:代码空间(Source Space),放 ...

  9. 『玩转Streamlit』--多页应用

    Streamlit不仅让创建单页应用变得易如反掌,更通过一系列创新特性,支持构建多页面应用,极大地丰富了用户体验和数据探索的可能性. 随着我们Streamlit App的功能逐渐增多之后,单个页面展示 ...

  10. Sql高级

    sql高级 1. 索引与视图 常见的数据结构 栈:先进后出 队列:先进先出 数组:查询快,根据下标查询 链表:分为双链表与单链表.单链表指向下一个数据的存储位置:双链表指向前一个与下一个数据的存储位置 ...