怎么知道一封邮件是否已经到达对方的邮箱?

2016-01-03 16:07:00 +08:00
 Lpl

比如 A 发送了一封邮件给 B , A 这边发送成功了, B 那边可能会有一段网络延迟未能收到。

有没有什么方法能够知道 A 发送的邮件是否已经到了 B ?

20088 次点击
所在节点    问与答
41 条回复
Citrus
2016-01-03 16:08:26 +08:00
搜索: 已读回执
233
2016-01-03 16:09:13 +08:00
非技术手段的话, 是可以请求已读回执的
akira
2016-01-03 17:05:38 +08:00
送到和已读还是有区别的。
邮件发送成功后一段时间内没收到退信,应该就可以认为送达了。
Slienc7
2016-01-03 17:11:59 +08:00
我不确定你这里说的网络延迟是什么意思。
这是包含在协议里的:
如果是 SMTP 发件,如果服务器没有返回错误代码(拒收,不存在等),回应正常的状态码,可以认作投递成功,可以认作已经到达对方邮箱(当然也可能是垃圾箱)。
至于说网络延迟这类应该是对方的邮件服务器内部的同步延迟,这是不可控问题。

楼上提到的已读回执是“已读”,且并不是所有邮件服务提供商都支持,且可能需要用户手动确认。
jugelizi
2016-01-03 17:13:43 +08:00
你说的收到的意思是指邮件到达对方邮件服务器上吧
一般发送接口都有返回状态的呀
Lpl
2016-01-03 17:15:53 +08:00
@Citrus
@233
@akira
其实想表达的意思是不需要人工的已读回执,是通过技术手段,比如记录这次发信的某个特殊标识,然后判断是否达到收信方,是否读了无关紧要,只是想判断是否到达他邮箱了
Lpl
2016-01-03 17:21:25 +08:00
@xgowex 这个网络延迟是这样的:比如 A 发信给 B ,可能是网络问题,需要一二十分钟才能到达 B 的邮箱,我想知道怎么判断什么时候到达 B 的邮箱的

@jugelizi 对对,终于表达出来我的意思了。这里不需要开发一个邮件系统,就是想通过普通的 gmail 邮箱发送邮件判断邮件是否正常发送到对象邮箱了。因为由于延迟的原因可能一二十分钟到达,我想判断具体到达对方邮箱的时间
liuhaotian
2016-01-03 17:23:26 +08:00
这样子的话只要 Gmail 没有退信就可以认为发送成功了。
如果是已读回执的话可以通过自己的服务器来实现。
tammy
2016-01-03 17:25:28 +08:00
给你个思路,弄个透明图片放你服务器上,然后右键包含这个图片,如果别人看了,你服务器那边就有日志
xenme
2016-01-03 17:56:29 +08:00
@tammy 然后图片非信任,不下载,哈哈
FrankFang128
2016-01-03 18:08:03 +08:00
附上口令红包不就行了。
SourceMan
2016-01-03 18:10:15 +08:00
独一的资源,看是否请求过
sennes
2016-01-03 18:46:10 +08:00
烦请阁下点击下面链接以便告诉我们您已阅读邮件。
Lpl
2016-01-03 19:04:26 +08:00
@liuhaotian 嗯嗯,我理解你的意思。那么如果没有已读回执的话能判断邮件是否已经到达对方邮箱以及对方是否已读呢?


@tammy 哈哈,这个倒是简单暴力啊。有没有通过网络层面实现的呢?


@FrankFang128 不太明白这个意思..是附上一个口令红包,然后对方如果使用了即表明阅读了么


@SourceMan 是这个意思,比如发的每一份邮件也是独一的资源,关键这里怎么判断是否已经收到了


@sennes 邮件回执的意思我了解,我想想能否不需要回执就可以知道。这里只是想知道邮件是否已经发送到对方邮箱,从发送开发到对方邮箱接收用时多少。 而且...要回执有点怪怪的
regist
2016-01-03 20:05:03 +08:00
你想让服务器返回一段指令让你明白邮件已经被收件箱收取
问题是,你能让对方服务器(不是你自己的发件服务器)返回特殊的指令吗?

再说,对方客户端设置一天才收取一次邮件呢?这些都是你没法控制的。

兄台,洗洗睡吧。
gdtv
2016-01-03 20:24:30 +08:00
1 、判断邮件是否已到达对方的服务器,分两种情况,第一种是你自己写的邮件发送端代码,你可以实时知道对方服务器是否已收到,如果收方没收到或者拒收,在邮件协议里有说明的。 第二种是使用网页版的邮箱服务器,例如 gmail ,当你在 gmail 网页上点击发送按钮,邮件其实是发送到了 gmail 的服务器,此时还没有到达收件方的服务器,你需要等几分钟, gmail 才会告诉你是否发送成功。
2 、第 1 只是判断是邮件是否到达收件方的服务器,但不通判断对方人员的邮件客户端是否收到了邮件,例如人家自己家里电脑上的 Outlook 设置每 1 同步一次,那他可能要等一天才收到你的邮件,这个你无法判断。
3 、判断对方(指人类)是否已打开了你的邮件。某些邮件提供商在自家邮箱范围内会提供这样的服务器。例如 QQ 邮箱发给 QQ 邮箱,就可以有已读回执。如果不是同一个提供商,就没有办法。上面回复里说的嵌入一张图片的方法,大部分网页版的邮箱会默认不显示图片,所以无效。
Lpl
2016-01-03 20:33:00 +08:00
@regist 不需要对方服务器返回特殊指令的。比如说 SMTP 和 Ping 都属于 TCP/IP 协议, Ping 可以发送数据包然后让对方返回同样的数据包然后检测网络是否通行。那么 SMTP 协议也可以说是发送了数据到对方服务器,那么对方服务器是否也会返回某个状态码给 SMTP 呢(就是这点不理解,到底返回没返回,返回的话怎么能够查看)?

因为网络时延的问题,这个状态码肯定会返回的很慢,等于说双倍时间( A 服务器发送给 B 服务器,时间记为 t , B 服务器判断没有这个邮箱,返回状态码,时间记为 t 。那么这个时候应该是 2t )。

但是,如果你的邮件地址填写时正确的,在 Foxmail 这些客户端上并不会返回错误代码; 相反,如果邮件地址是正确的,那么邮件协议肯定有一个正确的代码。那么问题来了.....咋看到这个状态码
soland
2016-01-03 20:37:23 +08:00
放个图片。
Lpl
2016-01-03 20:41:18 +08:00
@gdtv good !!总算是搞明白这个问题了,对于第二种来说,貌似 gmail 没有告诉过我是否发送成功。
对于第一种来说,是不是发送到对方邮件使用的服务器后(不管是否发送到对方客户端)协议会有一个成功到达的状态码返回呢?返回的过程是否是肯定会经过发邮件的那一些节点,还是会视网络情况随机找最近的网络节点呢?
regist
2016-01-03 20:49:58 +08:00
@Lpl 如果你配制过服务器的邮件,应该用 telent 测试过发信,配合监控邮件日志,你能知晓对方收件服务器确实会返回状态码,但是这个状态码到你的收件箱依赖你的收信频率设置(客户端),网页端也能给你解析结果,发送成功 or 发送失败,以及发送失败的原因,不过这个状态变化依赖于网页端邮件提供商的设置。

发信过程类似如下:

你的客户端( or 网页端) <--> smtp 服务器 <--> 对方收件服务器 <--> 对方客户端

如果你用客户端发送,那么后面的过程你控制不了
如果你能直接接触到 smtp 服务器,那么你能知晓对方收件服务器返回的状态码,进而判断,这个时候如果对方用客户端收件,那么你同样没法控制
至于后面两个,你接触不到的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX