如何在C#中获取收件箱邮件内容,解决MailKit WriteTo路径访问报错
报错原因&修复方案
路径访问被拒错误修复
你当前写入文件时没有指定完整路径,系统默认尝试写入根目录/,普通应用没有该目录的写入权限,所以触发报错。你可以复用已经申请过权限的LocalApplicationData目录作为存储路径,修改写入逻辑即可:
// 构造有写入权限的完整文件路径 string savePath = Path.Combine(pathLog, $"{i}.msg"); message.WriteTo(savePath);
直接提取邮件正文(无需写入文件)
你不需要通过写入文件的方式读取邮件内容,MailKit的MimeMessage对象已封装好正文读取属性,直接调用即可:
- 纯文本格式正文:读取
message.TextBody属性 - HTML格式正文:读取
message.HtmlBody属性
你也可以直接获取其他常用邮件字段:
// 邮件主题 string subject = message.Subject; // 发件人信息 string from = message.From.ToString(); // 收件人信息 string to = message.To.ToString(); // 纯文本正文 string plainTextContent = message.TextBody; // HTML正文 string htmlContent = message.HtmlBody;
修正后完整代码示例
try { string pathLog = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData); string fileNameLog = Path.Combine(pathLog, "pop3.txt"); using (var client = new Pop3Client(new ProtocolLogger(fileNameLog))) { strProgress = strProgress + "c"; client.Connect("outlook.office365.com", 995, SecureSocketOptions.SslOnConnect); strProgress = strProgress + "d"; client.Authenticate("xxx", "yyy"); strProgress = strProgress + "e"; for (int i = 0; i < client.Count; i++) { strProgress = strProgress + "f"; var message = client.GetMessage(i); strProgress = strProgress + "g"; // 直接提取正文,无需写入文件 string emailContent = message.TextBody ?? message.HtmlBody; // 这里可以直接处理emailContent,比如存入数据库、展示到UI等 // 如果你确实需要存文件,改用以下路径即可 // string savePath = Path.Combine(pathLog, $"{i}.msg"); // message.WriteTo(savePath); numCountEmailsDownloaded = numCountEmailsDownloaded + 1; } client.Disconnect(true); } } catch (Exception ex) { Toast.MakeText(this, ex.Message + "\n\nStopped after " + strProgress, ToastLength.Long).Show(); }
内容的提问来源于stack exchange,提问作者Jonathan T
相关产品推荐
相关产品推荐

