C#实现Outlook发件箱未发送邮件统计及用户通知技术问询
解决Outlook发件箱未发送邮件统计及通知问题
先给你修正后的可运行代码,再拆解关键修改点:
using System; using System.Net.Mail; using System.Linq; using Outlook = Microsoft.Office.Interop.Outlook; namespace OutlookOutboxMonitor { class Program { static void Main(string[] args) { // 定义判断邮件卡住的时间阈值(可选,按需调整) TimeSpan stuckThreshold = TimeSpan.FromMinutes(5); string currentUserEmail = string.Empty; // 正确获取当前用户的Outlook邮箱地址 try { Outlook.Application outlookApp = new Outlook.Application(); Outlook.NameSpace ns = outlookApp.GetNamespace("MAPI"); currentUserEmail = ns.CurrentUser.Address; } catch (Exception ex) { Console.WriteLine("获取用户邮箱失败: " + ex.Message); return; } // 连接Outlook并获取发件箱 Outlook.Application outlook = new Outlook.Application(); Outlook.NameSpace mapiNs = outlook.GetNamespace("MAPI"); Outlook.MAPIFolder outboxFolder = mapiNs.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderOutbox); // 筛选未发送的邮件:SentOn为最小值表示尚未发送 var unsentMails = outboxFolder.Items .OfType<Outlook.MailItem>() .Where(mail => mail.SentOn == DateTime.MinValue); int unsentCount = unsentMails.Count(); Console.WriteLine($"发件箱中未发送邮件数量: {unsentCount}"); // 检查是否有超过阈值的卡住邮件并发送通知 if (unsentCount > 0) { var stuckMails = unsentMails.Where(mail => DateTime.Now - mail.CreationTime > stuckThreshold); if (stuckMails.Any()) { SendAlertEmail(currentUserEmail, stuckMails.Count()); } } } static void SendAlertEmail(string recipientEmail, int stuckCount) { try { // 替换为实际的SMTP服务器地址和发件人信息 using (SmtpClient smtpClient = new SmtpClient("your-smtp-server.com")) { smtpClient.Port = 587; // 根据SMTP服务器配置调整端口 smtpClient.Credentials = new System.Net.NetworkCredential("your-sender-email@domain.com", "your-password"); smtpClient.EnableSsl = true; // 多数SMTP服务器需要SSL using (MailMessage mail = new MailMessage()) { mail.From = new MailAddress("your-sender-email@domain.com"); mail.To.Add(recipientEmail); mail.Subject = "Outlook发件箱邮件卡住提醒"; mail.Body = $"你的Outlook发件箱中有{stuckCount}封邮件已超过5分钟未发送,请检查。"; smtpClient.Send(mail); Console.WriteLine("提醒邮件发送成功"); } } } catch (Exception ex) { Console.WriteLine("发送提醒邮件失败: " + ex.Message); } } } }
关键修改点说明
- 修正语法错误:移除了
using System;后的无效字符your text,补充了完整的类和入口方法(原代码无执行入口) - 可靠获取用户邮箱:改用Outlook内置的
ns.CurrentUser.Address直接获取登录用户邮箱,比从WindowsIdentity提取更准确 - 类型安全遍历:用
OfType<Outlook.MailItem>()过滤发件箱中的非邮件项,避免类型转换异常 - 准确识别未发送邮件:未发送邮件的
SentOn属性会是DateTime.MinValue,这比单纯用时间差判断更精准 - 完善SMTP配置:补充了SMTP端口、凭据、SSL等必要参数,原代码的
stmpclient是无效占位符,需替换为实际服务器地址 - 拆分功能模块:把发送邮件逻辑抽成独立方法,代码结构更清晰
额外注意事项
- 确保项目已引用
Microsoft.Office.Interop.Outlook程序集(可通过NuGet安装对应包) - 运行程序时需保证Outlook客户端处于登录状态
- SMTP服务器配置需根据你的邮件服务商调整(比如QQ邮箱用
smtp.qq.com,端口587,需开启授权码)
内容的提问来源于stack exchange,提问作者PWill
相关产品推荐
相关产品推荐

