如何为数组中每个收件人创建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); }
额外优化提示
- 原代码中
if (String.IsNullOrEmpty(attachment))分支里的break会直接终止循环,这也是导致只处理部分收件人的潜在问题,修复代码已移除该逻辑。 - 读取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
相关产品推荐
相关产品推荐

