天天财汇 购物 网址 万年历 小说 | 三峰软件 小游戏 视频
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页 淘股吧 股票涨跌实时统计 涨停板选股 股票入门 股票书籍 股票问答 分时图选股 跌停板选股 K线图选股 成交量选股 [平安银行]
股市论谈 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事
商业财经 科技知识 汽车百科 工程技术 自然科学 家居生活 设计艺术 财经视频 游戏--
  天天财汇 -> 科技知识 -> 邮箱里已读回执是什么原理? -> 正文阅读

[科技知识]邮箱里已读回执是什么原理?

[收藏本文] 【下载本文】
收到已读回执就表示收信人打开过这封邮件了是吧?
给邮件里插入一个1像素的图片,肉眼几乎不可见,对方如果打开了邮件,该远程资源被加载,那么就可以知道你已读了
安卓上不也这么玩吗


但是这招不见得好用,很多客户端会默认拦截这玩意,如下是outlook




网易最近上线了该功能


经过测试,确实有这么个图像




但不知为何,即使我进行了下载,网易那边也仍然显示未读


目前看来有三种方法:
1。在邮件头部携带 “希望获取已读回执” 的信息。
优点:光明正大,是获取已读回执的正当方法。
缺点:需要收件人手动确认回执,有些人可能无所谓回不回执,只是懒得确认,那你就获取不到。
2。在邮件内携带一个图片,检查到图片被访问即已读。
优点:无需收件人确认。
缺点:
a 可能侵犯了收件人的选择权
b 目前大多数邮箱对图片有过滤,又或者类似 Gmail 一样会先内部下载图片,这样会影响准确性
c 对纯文本的邮件客户端不友好
3。邮件服务商内置功能,在收件人查询邮件时,通知寄件人已读
优点:准确率较高,而且这种功能一般默认开启但是可以手动关闭,在保证了选择权的同时让无所谓的人能正确显示状态。
缺点:只兼容自家邮箱,对其他域名邮箱不生效。
你设置的已读回执是需要收件人配合才能接收到的,你发给别人设置了已读回执,那么收件人每次读这封邮件都会提示”是否回复对方已读状态“这样的提示,收件人点击否的时候就没有回复。
曾经有幸短暂接触过邮箱业务,过来答一下这个问题。
先说结论:邮件已读回执是通过 MDN (Message Disposition Notification)协议来实现的。
另外,网上提到的“野路子”并不靠谱,原因有二:
技术层面不通:这些“野路子”虽然可以用于实现有用的功能,但同时也可以用于作恶,所以多数邮件厂商都会有对应的屏蔽手段; 即使技术层面侥幸能通,产品层面也不一定能达到预期:已读回执一般是作为凭证用于“吵架”的;而“野路子”不一定能被所有人认可,那么其产出的“回执”自然也可能无法作为证据产生目标效果;
接下来讲讲 MDN 协议。
一. MDN 基本流程
MDN 协议定义于 RFC-8098https://datatracker.ietf.org/doc/html/rfc8098" data-tooltip-richtext="1" data-tooltip-preset="white" data-tooltip-classname="ztext-reference-tooltip">[1],其基本流程如下:


MDN 基本流程发送方邮件客户端(也叫 MUA,即 Mail User Agent)对需要已读回执的邮件打上标记(下文会将具体方式); 接收方客户端将邮件展示给收件人; 若邮件携带了“需要回执”的标记,接收方邮件客户端会在得到收件人确认后,发送一封“回执邮件”,即 MDN;
收件人确认是否发送已读回执的交互效果大致如下:


MUA 请求收件人确认是否发送 MDN
收件人同意发送后,发件人收到的 MDN 邮件效果大致如下:


MDN 效果示例二. 发送方标记”需要回执“的方式
电子邮件的消息格式符合 RFC-5322https://datatracker.ietf.org/doc/html/rfc5322" data-tooltip-richtext="1" data-tooltip-preset="white" data-tooltip-classname="ztext-reference-tooltip">[2] 中定义的“Internet Message Format”,即分为 Headers 和 Body 两部分。
而 RFC-8098 为 MDN 定义了一个 Header:Disposition-Notification-To 。当该 Header 出现在邮件中时,不仅表示发件人期望能有一个已读回执,而且 Disposition-Notification-To 字段的值也指示了发件人期望用哪个邮件地址接收 MDN 。
除 Disposition-Notification-To 核心 Header 字段外,RFC-8098 还定义了 Disposition-Notification-Options、Original-Recipient 等辅助字段,用于指定表达"需要回执"过程的相关参数;限于篇幅,不在这里赘述了,有兴趣的同学可以参考 RFC-8098。
三. 接收方发送 MDN 的格式
当展示了包含 Disposition-Notification-To Header 字段的邮件后,接收方邮件客户端会请求收件人确认是否发送已读回执;得到确认后,接收方邮件客户端会向 Disposition-Notification-To 指定的地址发送已读回执邮件(MDN)。
关于 MDN 邮件的格式,RFC-8098 的核心规定如下:
该邮件的 Content-Type 为“multipart/report; report-type=disposition-notification”; 既然是 multipart 类型,那么可以包含多个部分,各部分作用如下: 第一部分针对本 MDN 给出人类可读的解释性描述; 第二部分的 Content-Type 为 message/disposition-notification ,以字段列表的形式给出详细信息;核心字段如下: Reporting-UA :指明发送 MDN 的邮件客户端类型; Original-Recipient :MDN 所回复的那封原始邮件的收件人地址; Original-Message-ID :MDN 所回复的那封原始邮件的 Message-ID ,用于发件人将收到的 MDN 和原始邮件关联起来; 第三部分可选,用于将原始邮件附加于此;
接收方邮件客户端会记录各邮件是否已完成 MDN 的发送,用以保证“给定一封原始邮件,仅有一封 MDN 发出”。
不过,若收件人使用多个不同的邮件客户端访问自己邮箱的话,那该怎么办,会有多个 MDN 发出吗?
正常不会,一般协议会兼容这种场景。比如,RFC-3503https://datatracker.ietf.org/doc/html/rfc3503" data-tooltip-richtext="1" data-tooltip-preset="white" data-tooltip-classname="ztext-reference-tooltip">[3] 定义了 IMAP 协议的处理方式:即通过 $MDNSent 关键字将“是否已完成 MDN 发送”的信息改为存储到服务端,从而避免多客户端重复触发 MDN。
总结
才疏学浅,未能窥其十之一二,欢迎大家随时交流补充。
若内容质量还算及格,记得点赞关注加以鼓励哦~
研发老司机,互联网头部厂商摸鱼侠,更多内容在个人主页~
参考^RFC-8098 : Message Disposition Notification https://datatracker.ietf.org/doc/html/rfc8098^RFC-5322 : Internet Message Format https://datatracker.ietf.org/doc/html/rfc5322^RFC-3503 : Message Disposition Notification (MDN) profile for Internet Message Access Protocol (IMAP) https://datatracker.ietf.org/doc/html/rfc3503
送礼物
还没有人送礼物,鼓励一下作者吧
回执的原理是在发邮件的时候告知对方需要回执,如QQ为例






收到邮件后,会显示“回执”按钮,点击“发送”后,发件人就可以在邮箱里收到一封回执邮件。其实就多了一封通知已打开邮件的邮件通知。
原理是在发邮件的头文件里加Disposition-Notification-To:"发件人邮箱"。如QQ
Disposition-Notification-To: "=?gb18030?B?xL7X07rEZXJpYw==?=" <phpxx@qq.com>
已读回执(read receipts)是Email标准协议的一部分,邮箱软件如果按照RFC协议开发,必须提供支持。
微软Exchange团队在技术社区里专门写了篇文章介绍已读回执的相关问题。
https://techcommunity.microsoft.com/t5/exchange-team-blog/everything-you-wanted-to-know-about-read-receipts-and-delivery/ba-p/587312?techcommunity.microsoft.com/t5/exchange-team-blog/everything-you-wanted-to-know-about-read-receipts-and-delivery/ba-p/587312
A read receipt is defined in RFC 2298 and has a mime content type of multipart/report; report-type=disposition-notification
An Extensible Message Format for Message Disposition Notifications?www.rfc-editor.org/rfc/rfc2298
This memo defines a MIME content-type [5] for message disposition
notifications (MDNs). An MDN can be used to notify the sender of a
message of any of several conditions that may occur after successful
delivery, such as display of the message contents, printing of the
message, deletion (without display) of the message, or the
recipient's refusal to provide MDNs.
也就是说,这其实是一种约定。
当邮件被显示、被打印、没有被阅读就被删除时,发送给邮件发送者的。
实际执行时,邮件阅读软件通常会询问阅读者的意见,要不要按照要求发送这些通知。
所以,这属于君子协议。
很多邮件服务商都有一个已读回执功能,需要自己打开的,对方在收到邮件以后需要按一下发送已读回执才会发送,如果对方不愿意发送回执,或者忽略了这个按钮,那么你就收不到了。好处就是确保回你邮件的都是真人;缺点很显而易见:有些用户压根不按已读回执,且你需要整理收到的邮件。
所以就有些人想出了一个办法:给邮件里面加一个1像素×1像素的图,这个图片不是邮件附件,是需要用户远程加载的,所以只要用户加载了这个图片即视为用户打开了你的邮件。现在很多客户端都默认屏蔽掉所有远程内容了,因为发垃圾邮件的也喜欢这么弄,你点了邮件,他们服务器就收到了信号,证明该邮箱有人看的。好处就是你不会收到大量的邮件,缺点就是容易产生误报(比如服务器缓存或用户无意间打开)或被拦截。
有些邮箱服务商能够告知你对方是否看了你的邮件,但是缺点就是只支持同一个公司下的产品。
这功能没啥大用。
第一个就是说,必须和带有图片的邮件一起用,而且必须要点开。否则扫视下收件箱的邮件主题没有作用,搞营销的没有意义。而且现在大部分邮箱都不自动加载邮箱中的图片了,单纯点开邮件可能没用。
第二个,就是说,如果需要回复,建议邮件标题中写明。
邮件已读回执是所有通讯软件“已读显示”的开山鼻祖
当初发明邮件“已读回执”是为了方便收件人查看所发邮件时,收件人能收到通知,不必为了对方有没有查看邮件而牵肠挂肚,甚至重新发一封邮件询问对方。
邮箱里已读回执是通过一种称为"MDN"(Message Disposition Notification)的技术实现的。它允许发送方得知邮件是否被接收和阅读。这种技术基于邮件传输协议(如SMTP)和邮件客户端之间的通信。
目前,大部分企业邮箱(比如亿邮企业邮箱)都具有“已读回执”功能。比如用邮件通知重要事务,而且是必须通知到每一个相关人员,这种情况下,怎么保证所有人都看到了你所说的事务呢?已读回执就能很好地解决这个问题,只要对方点开了邮件,发件人就能收到回执,大大提高了整个流程的工作效率。

    def send_email(self):
        """发送邮件"""
        # 设置登录及服务器信息
        try:
            sender = '**@163.com'  # 发送邮箱地址
            password = '***'  # 邮箱授权码,非登陆密码
            mailto_list = ['****']  # 群发邮箱地址
            smtp_server = 'smtp.163.com'  # smtp服务器

            # 发送纯文本格式的邮件
            msg = MIMEText('hello,send by python_test...', 'plain', 'utf-8')

            msg.add_header("Disposition-Notification-To", sender)
            msg['From'] = sender  # 发送邮箱地址
            msg['To'] = ';'.join(mailto_list)  # 发送多人邮件写法
            msg['Subject'] = '测试回执' + datetime.datetime.now().strftime('%Y-%m-%d') # 主题

            # server = smtplib.SMTP(smtp_server, 25)  # SMTP协议默认端口是25
            server = smtplib.SMTP()
            server.connect(smtp_server, 25)
            server.login(sender, password)  # login()方法用来登录SMTP服务器
            # server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息。
            server.sendmail(sender, mailto_list, msg.as_string())  # msg.as_string()把MIMEText对象变成str server.quit()
            # 第一个参数为发送者,第二个参数为接收者,可以添加多个例如:['hello@163.com','xxx@qq.com',]# 第三个参数为发送的内容

            server.quit()
        except Exception as a:
            print('失败')
            print(a.args)

重点是:MIMEText 中的属性 add_header添加参数:Disposition-Notification-To
msg = MIMEText('hello,send by python_test...', 'plain', 'utf-8')
msg.add_header("Disposition-Notification-To", sender)
小红薯觉得,邮箱里已读回执的原理简单来说就是:在发送邮件时,发件人可以选择请求已读回执。当收件人打开这封邮件时,系统会询问收件人是否愿意发送一个回执给发件人,表明邮件已被阅读。小红薯认为,如果收件人同意,发件人就会收到一封回执邮件,从而知道邮件已被收件人查看。这是一种基于邮件客户端之间通信的功能,旨在帮助发件人确认邮件是否被成功阅读。
[收藏本文] 【下载本文】
   科技知识 最新文章
百度为什么越来越垃圾了?
百度为什么越来越垃圾了?
为什么程序员总是发现不了自己的Bug?
出现在抖音评论区里边的算命真不真?
你认为 C++ 最不应该存在的特性是什么?
为什么 Windows 的兼容性这么强大,到底用了
如何看待Nvidia禁止使用翻译工具将cuda运行
为何苹果搞了十年的汽车还是难产,小米很快
该不该和AI说谢谢?
为什么突破性的技术总是最先发生在西方?
上一篇文章      下一篇文章      查看所有文章
加:2025-05-08 14:26:31  更:2025-05-14 13:41:26 
 
 
股票涨跌实时统计 涨停板选股 分时图选股 跌停板选股 K线图选股 成交量选股 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事
网站联系: qq:121756557 email:121756557@qq.com  天天财汇