如何使用C#调用mail.tm API读取邮件消息?
问题原因
- 令牌对应的邮箱账号未收到任何邮件:测试邮件投递存在延迟、收件地址填写错误、邮件被平台拦截都会导致邮箱内无邮件,接口自然返回空列表
- 授权令牌无效或不匹配:你代码中使用的令牌如果和创建的邮箱账号不对应、或者令牌已经过期,部分场景下平台不会返回401错误,而是直接返回空的邮件列表
- 请求参数有误:部分版本的mail.tm接口对page参数校验逻辑存在异常,传入错误的页码也会返回空结果
解决方法
- 先验证令牌有效性:在调用邮件列表接口前,先调用
GET https://api.mail.tm/me接口,传入同样的Authorization头,确认返回的邮箱地址是你创建的目标地址,如果返回401错误,重新创建邮箱获取最新的有效令牌 - 确认邮件投递状态:使用其他邮箱向创建的mail.tm地址发送测试邮件后,等待10~30秒再调用邮件列表接口,避免因投递延迟取不到数据,同时确认收件地址没有拼写错误
- 调整请求参数:可以先移除请求URL中的
?page=1参数直接调用接口,也可以将Accept头修改为application/json提升兼容性 - 补充响应校验逻辑:在代码中增加响应状态码、返回字段的校验,避免忽略异常情况,参考修改后的代码如下:
try { // 先验证令牌有效性 HttpWebRequest checkReq = (HttpWebRequest)WebRequest.Create("https://api.mail.tm/me"); checkReq.Method = "GET"; checkReq.Accept = "application/json"; checkReq.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + "替换为你实际获取的令牌"); using (HttpWebResponse checkRes = (HttpWebResponse)checkReq.GetResponse()) using (StreamReader checkSr = new StreamReader(checkRes.GetResponseStream())) { // 这里可以输出返回的邮箱地址确认是否正确 Console.WriteLine(checkSr.ReadToEnd()); } // 再获取邮件列表 HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("https://api.mail.tm/messages"); hwq.Method = "GET"; hwq.Accept = "application/json"; hwq.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + "替换为你实际获取的令牌"); using (HttpWebResponse res = (HttpWebResponse)hwq.GetResponse()) using (var sr = new StreamReader(res.GetResponseStream())) { string resStr = sr.ReadToEnd(); dynamic dd = JsonConvert.DeserializeObject(resStr); // 输出总邮件数确认 Console.WriteLine($"总邮件数:{dd["hydra:totalItems"]}"); } } catch (WebException ex) { // 捕获接口异常,比如401令牌失效 using (HttpWebResponse exRes = (HttpWebResponse)ex.Response) { Console.WriteLine($"接口错误,状态码:{exRes.StatusCode}"); } }
内容的提问来源于stack exchange,提问作者Abdelrahman Mahrous
相关产品推荐
相关产品推荐

