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

如何为数组中每个收件人创建Outlook MailItem邮件草稿?

问题解决:循环创建Outlook邮件草稿仅生成最后一个收件人邮件的问题

核心原因

你只创建了一个MS.Outlook.MailItem实例,循环中只是反复修改这个实例的属性,每次修改都会覆盖之前的设置,最终只有最后一次修改的内容被保存到草稿箱。

修复方案

把创建MailItem的代码移到循环内部,每次循环都生成全新的邮件对象,让每个收件人对应独立的草稿邮件。

修改后的完整代码

var olApplication = new MS.Outlook.Application();
var olNamespace = olApplication.GetNamespace("MAPI");
var olUser = olNamespace.CreateRecipient(UserPrincipal.Current.EmailAddress);
var olDrafts = olNamespace.GetSharedDefaultFolder(olUser, MS.Outlook.OlDefaultFolders.olFolderDrafts);

// 循环内每次新建邮件对象
for (int i = 0; i < recipientArray.Length; i++)
{
    var olMailItem = (MS.Outlook.MailItem)olApplication.CreateItem(MS.Outlook.OlItemType.olMailItem);
    
    olMailItem.To = recipientArray[i];
    olMailItem.Subject = tbTitle.Text;
    olMailItem.Body = tbBody.Text;
    
    if (!String.IsNullOrEmpty(attachment))
    {
        olMailItem.Attachments.Add(attachment);
    }
    
    olMailItem.Display(false);
    olMailItem.Move(olDrafts);
}

额外优化提示

  1. 原代码中if (String.IsNullOrEmpty(attachment))分支里的break会直接终止循环,这也是导致只处理部分收件人的潜在问题,修复代码已移除该逻辑。
  2. 读取CSV收件人的代码可以优化,避免重复覆盖数组:
// 收集所有收件人到列表
var recipientList = new List<string>();
foreach (string line in File.ReadAllLines(FileDiagAttachment.FileName))
{
    var recipientsInLine = line.Split('\n');
    // 过滤空行,避免无效收件人
    recipientList.AddRange(recipientsInLine.Where(r => !string.IsNullOrWhiteSpace(r)));
}
var recipientArray = recipientList.ToArray();
// 填充测试文本框的简化写法
tbTest.Text = string.Join("\n", recipientArray);

关键说明

每次调用olApplication.CreateItem(MS.Outlook.OlItemType.olMailItem)都会生成一个独立的邮件实例,修改这个实例的属性不会影响其他邮件,这样每个收件人都会对应一个单独的草稿邮件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:47:04