You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是无效占位符,需替换为实际服务器地址
  • 拆分功能模块:把发送邮件逻辑抽成独立方法,代码结构更清晰

额外注意事项

  1. 确保项目已引用Microsoft.Office.Interop.Outlook程序集(可通过NuGet安装对应包)
  2. 运行程序时需保证Outlook客户端处于登录状态
  3. SMTP服务器配置需根据你的邮件服务商调整(比如QQ邮箱用smtp.qq.com,端口587,需开启授权码)

内容的提问来源于stack exchange,提问作者PWill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:54:58