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

使用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中添加附件,请问缺少什么配置或代码?


解决方案

问题根源在于两个核心点:

  1. 手动设置的Content-Type: multipart/mixed头与实际邮件结构不匹配:当没有附件时,BodyBuilder.ToMessageBody()生成的是text/html单部分内容,强行指定多部分类型会导致新版Outlook无法正确识别邮件的可编辑结构。
  2. 新版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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:44:55