使用MimeKit/MailKit生成的.eml在新版Outlook无法添加附件的问题
问题:新版Outlook打开MimeKit生成的.eml无法添加附件(无预添加附件时)
我使用MimeKit/MailKit创建.eml文件,通过ProcessStartInfo调用Windows默认应用打开,以便用户发送邮件前添加附件。以下是创建邮件并在Outlook中打开的代码:
Public Sub SetUpEML(ByVal emailAddress As String, ByVal emailSubject As String, ByVal emailHTMLBody As String) Dim TempMailMessageFile As String = String.Format("{0}", Environment.CurrentDirectory) & $"Export_{Now.ToString("yyyyMMddHHmmss")}.eml" Dim htmlBody = New BodyBuilder() htmlBody.HtmlBody = emailHTMLBody 'htmlBody.Attachments.Add("C:\Users\myemail\Pictures\Programmers.jpg") Using Email As New MimeMessage With Email .To.Add(New MailboxAddress("My Email", "myemail@mydomain.com")) .Headers.Add(New Header("X-Unsent", "1")) .Headers.Add(New Header("Content-Type", "multipart/mixed")) .Subject = emailSubject .Body = htmlBody.ToMessageBody End With Email.WriteTo(TempMailMessageFile) End Using Dim processStartInfo = New ProcessStartInfo processStartInfo.FileName = TempMailMessageFile processStartInfo.UseShellExecute = True Process.Start(processStartInfo) End Sub
该代码在经典版Outlook中可正常添加附件,但在新版Outlook中,仅当取消注释htmlBody.Attachments.Add...行预先添加附件时,用户才能添加附件;若未预添加,尝试添加附件会提示“无法附加以下文件:filename.jpg,请稍后重试”。希望无需预添加附件,让用户可直接在新版Outlook中添加附件,请问缺少什么配置或代码?
解决方案
问题根源在于两个核心点:
- 手动设置的
Content-Type: multipart/mixed头与实际邮件结构不匹配:当没有附件时,BodyBuilder.ToMessageBody()生成的是text/html单部分内容,强行指定多部分类型会导致新版Outlook无法正确识别邮件的可编辑结构。 - 新版Outlook对未发送邮件(
X-Unsent:1)的结构要求更严格,必须确保邮件从一开始就是支持附件的多部分混合结构,即使暂时没有附件。
修改后的代码如下:
Imports System.IO Imports MimeKit Imports System.Diagnostics Public Sub SetUpEML(ByVal emailAddress As String, ByVal emailSubject As String, ByVal emailHTMLBody As String) ' 使用Path.Combine更安全地拼接文件路径 Dim TempMailMessageFile As String = Path.Combine(Environment.CurrentDirectory, $"Export_{Now.ToString("yyyyMMddHHmmss")}.eml") Dim htmlBody = New BodyBuilder() htmlBody.HtmlBody = emailHTMLBody ' 无需预添加任何附件 Using Email As New MimeMessage With Email .To.Add(New MailboxAddress("My Email", "myemail@mydomain.com")) .Headers.Add(New Header("X-Unsent", "1")) .Subject = emailSubject ' 强制创建multipart/mixed容器,确保邮件结构原生支持附件添加 Dim mixedContainer = New Multipart("mixed") ' 将HTML正文添加到多部分容器中 mixedContainer.Add(htmlBody.ToMessageBody()) ' 设置邮件主体为这个多部分容器 .Body = mixedContainer End With Email.WriteTo(TempMailMessageFile) End Using Dim processStartInfo = New ProcessStartInfo processStartInfo.FileName = TempMailMessageFile processStartInfo.UseShellExecute = True Process.Start(processStartInfo) End Sub
关键修改说明:
- 移除手动设置的
Content-Type头:让MimeKit自动根据MultipartMixed容器生成正确的Content-Type头(包含自动生成的边界符,这是多部分邮件必需的核心参数)。 - 强制使用
multipart/mixed结构:即使没有附件,也通过创建Multipart("mixed")容器并加入正文,让邮件从一开始就具备支持附件的结构,完全匹配新版Outlook的编辑逻辑要求。
这样修改后,用户无需预添加附件,就能直接在新版Outlook中正常添加附件。
内容的提问来源于stack exchange,提问作者Steve Hoyer
相关产品推荐
相关产品推荐

