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

如何在System.Net.Mail.Attachment的ContentType值中添加双引号以适配Outlook?

问题描述

我尝试在邮件中附加ICS文件,让收件人在Outlook里将其识别为可RSVP的事件而非普通附件。目前生成的邮件头与谷歌日历的生效格式仅差Content-Type里name值的双引号,怀疑这就是Outlook不识别的原因。

谷歌日历生成的可生效格式:

Content-Type: application/ics; name="invite.ics"
Content-Disposition: attachment; filename="invite.ics"
Content-Transfer-Encoding: base64

我两次尝试复现均失败:

第一次尝试

代码:

byte[] byteArray = Encoding.UTF8.GetBytes(ics2);
MemoryStream stream = new MemoryStream(byteArray);
Attachment a = new Attachment(stream, "invite.ics", "application/ics");
a.ContentDisposition.DispositionType = @"attachment; filename=""invite.ics""";

生成的格式(name值无引号):

Content-Type: application/ics; name=invite.ics
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="invite.ics"

第二次尝试

代码:

byte[] byteArray = Encoding.UTF8.GetBytes(ics2);
MemoryStream stream = new MemoryStream(byteArray);
Attachment a = new Attachment(stream, @"""invite.ics""", "application/ics");
a.ContentDisposition.DispositionType = @"attachment; filename=""invite.ics""";

生成的格式(name值带转义引号,不符合预期):

Content-Type: application/ics; name="\"invite.ics\""
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="invite.ics"

需求:如何设置附件ContentType的name值,使其被正确双引号包围,即"invite.ics"?

解决方案

不要直接通过Attachment构造函数传入带引号的文件名,而是手动修改ContentType参数,用Name属性设置原始文件名,再开启Parameters的Quote属性自动添加双引号。

正确代码如下:

byte[] byteArray = Encoding.UTF8.GetBytes(ics2);
MemoryStream stream = new MemoryStream(byteArray);
Attachment a = new Attachment(stream, "invite.ics", "application/ics");

// 处理Content-Type的name参数
a.ContentType.Name = "invite.ics";
var nameParam = a.ContentType.Parameters["name"];
if (nameParam != null)
{
    nameParam.Quote = true;
}

// 处理Content-Disposition的filename参数
a.ContentDisposition.FileName = "invite.ics";
a.ContentDisposition.DispositionType = "attachment";

说明

  • 直接设置ContentType.Name为不带引号的文件名,通过Parameters["name"].Quote = true让框架自动为name值添加双引号,避免手动转义引发的问题。
  • ContentDisposition.FileName无需手动拼接引号,框架会自动处理成带双引号的格式,只需设置DispositionType = "attachment",FileName会被正确附加到Content-Disposition头中。

生成的邮件头将与谷歌日历格式一致:

Content-Type: application/ics; name="invite.ics"
Content-Disposition: attachment; filename="invite.ics"
Content-Transfer-Encoding: base64

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:35:15