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

如何在C#生成的ICS邀请中仅保留接受与拒绝按钮?

问题描述

我用C#编写了生成ICS格式会议邀请的代码,目前功能正常:受邀者能收到邮件并进行接受、拒绝操作,接受后Google Calendar和Outlook日历可同步更新。现在需要仅保留接受和拒绝选项,移除提议新日期、添加评论的功能,现有代码片段如下:

StringBuilder str = new StringBuilder();
str.AppendLine("BEGIN:VCALENDAR"); // Init Calendar
str.AppendLine("PRODID:-//test//EN"); // Identifier for the product that created the Calendar object
str.AppendLine("VERSION:2.0"); // Indicates that the data is in iCalendar format
str.AppendLine("METHOD:REQUEST"); // Request, Cancel
str.AppendLine("CALSCALE:GREGORIAN");
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", startTime)); // Start time            
if (Utility.IsNotEmptyStr(endTime))
    str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", endTime)); // End time
if (Utility.IsNotEmptyStr(location))
    str.AppendLine(string.Format("LOCATION: {0}", location)); // Location
str.AppendLine(string.Format("UID:{0}", "evendronescanflyaway@gmail.com")); // ID
str.AppendLine(string.Format("DESCRIPTION:{0}", body)); // Body
str.AppendLine(string.Format("SUMMARY:{0}", subject)); // Subject    
str.AppendLine(string.Format("STATUS:{0}", cancelled ? "CANCELLED" : "CONFIRMED")); // Confirmed, Cancelled
str.AppendLine(string.Format("ORGANIZER;CN=\"{0}\":MAILTO:{1}", senderDisplayName, "evendronescanflyaway@gmail.com"));
foreach (RcptObject attendee in rcpts)
    str.AppendLine(string.Format(@"ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN={attendee.EMail};X-NUM-GUESTS=0:MAILTO:{attendee.EMail}"));

str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR"); // End Calendar


System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType("text/calendar"); // MIME Type
ct.Parameters.Add("method", "REQUEST");
ct.Parameters.Add("name", "invite.ics");
AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), ct);
avCal.TransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable;
解决方案

可以实现该需求,通过添加ICS扩展属性限制客户端操作,适配Outlook和Google Calendar两大主流工具:

核心修改点

  1. 禁用提议新日期功能:添加微软扩展属性X-MICROSOFT-DISALLOW-COUNTER:TRUE,直接告知Outlook禁止参会者发起时间提议,Google Calendar也会兼容该属性限制对应操作。
  2. 禁用回复评论功能:添加微软扩展属性X-MICROSOFT-DISALLOW-COMMENTS:TRUE,关闭Outlook回复时的评论输入框;Google Calendar会自动简化回复选项,减少评论入口。

修改后的完整代码片段

StringBuilder str = new StringBuilder();
str.AppendLine("BEGIN:VCALENDAR");
str.AppendLine("PRODID:-//test//EN");
str.AppendLine("VERSION:2.0");
str.AppendLine("METHOD:REQUEST");
str.AppendLine("CALSCALE:GREGORIAN");
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", startTime));
if (Utility.IsNotEmptyStr(endTime))
    str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", endTime));
if (Utility.IsNotEmptyStr(location))
    str.AppendLine(string.Format("LOCATION: {0}", location));
str.AppendLine(string.Format("UID:{0}", "evendronescanflyaway@gmail.com"));
str.AppendLine(string.Format("DESCRIPTION:{0}", body));
str.AppendLine(string.Format("SUMMARY:{0}", subject));
str.AppendLine(string.Format("STATUS:{0}", cancelled ? "CANCELLED" : "CONFIRMED"));
str.AppendLine(string.Format("ORGANIZER;CN=\"{0}\":MAILTO:{1}", senderDisplayName, "evendronescanflyaway@gmail.com"));

// 添加禁用时间提议和评论的扩展属性
str.AppendLine("X-MICROSOFT-DISALLOW-COUNTER:TRUE");
str.AppendLine("X-MICROSOFT-DISALLOW-COMMENTS:TRUE");

foreach (RcptObject attendee in rcpts)
    str.AppendLine(string.Format(@"ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN={0};X-NUM-GUESTS=0:MAILTO:{0}", attendee.EMail));

str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR");

System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType("text/calendar");
ct.Parameters.Add("method", "REQUEST");
ct.Parameters.Add("name", "invite.ics");
AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), ct);
avCal.TransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable;

注意事项

  • 上述扩展属性为微软针对Outlook的定制属性,Google Calendar会兼容解析,限制对应操作;
  • 不同客户端的ICS解析逻辑存在细微差异,建议测试Outlook(桌面/网页版)和Google Calendar的实际效果;
  • 确保UID字段唯一且稳定,避免重复邀请导致的日历冲突。

内容的提问来源于stack exchange,提问作者Jairo Álvarez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:25:36