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

如何在C#生成的带ICS附件邮件中添加Gmail日历导入按钮?

实现邮件内按钮跳转Gmail添加日历事件

问题说明

我正在生成作为邮件附件的ICS文件,希望在邮件中添加一个按钮,点击后可跳转至Gmail(支持询问需添加事件的Gmail用户名)并将事件同步到Gmail日历,目前未找到可行的实现方案,寻求帮助。

原生成ICS的代码如下:

StringBuilder sb = new StringBuilder();
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("PRODID:Domain.com");
sb.AppendLine("CALSCALE:GREGORIAN");
sb.AppendLine("METHOD:REQUEST");
sb.AppendLine("BEGIN:VEVENT");
sb.AppendLine("UID:" + guid);
sb.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", retailStore.LocationEmail));
sb.AppendLine(string.Format("ATTENDEE;CN='{0}, {1}';ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE:MAILTO:{2}", CustomerFirstName, CustomerLastName, CustomerEmail));
sb.AppendLine("DTSTART:" + DateStart.ToUniversalTime().ToString(DateFormat));
sb.AppendLine("DTSTAMP:" + now);
sb.AppendLine("SUMMARY: " + Summary);
sb.AppendLine("LOCATION: " + Location);
sb.AppendLine("DESCRIPTION:" + Description);
sb.AppendLine("PRIORITY:5");
sb.AppendLine("TRANSP:OPAQUE");
sb.AppendLine("END:VEVENT");
sb.AppendLine("END:VCALENDAR");

var calendarBytes = Encoding.UTF8.GetBytes(sb.ToString());
System.IO.MemoryStream stream = new System.IO.MemoryStream(calendarBytes);
Attachment attachment = new Attachment(stream, FileName, "text/calendar");
customerMailMessage.Attachments.Add(attachment);

实现方案

1. 构建Gmail日历事件添加链接

Gmail支持通过URL直接预填充日历事件信息,核心格式为:
https://calendar.google.com/calendar/r/eventedit?text=[标题]&dates=[开始时间]/[结束时间]&location=[地点]&details=[描述]

若需要让用户指定Gmail账户,可通过HTML输入框获取用户名后拼接跳转链接(邮件中JS通常被禁用,建议用纯HTML表单提交)。

2. 将邮件设置为HTML格式

邮件需使用HTML正文才能添加按钮和交互元素,设置customerMailMessage.IsBodyHtml = true,并在正文嵌入带表单的HTML内容,实现用户名输入与跳转功能。

3. 整合代码实现

修改原有代码,添加HTML正文部分:

// 生成ICS部分(保留原有代码)
StringBuilder sb = new StringBuilder();
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("PRODID:Domain.com");
sb.AppendLine("CALSCALE:GREGORIAN");
sb.AppendLine("METHOD:REQUEST");
sb.AppendLine("BEGIN:VEVENT");
sb.AppendLine("UID:" + guid);
sb.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", retailStore.LocationEmail));
sb.AppendLine(string.Format("ATTENDEE;CN='{0}, {1}';ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE:MAILTO:{2}", CustomerFirstName, CustomerLastName, CustomerEmail));
sb.AppendLine("DTSTART:" + DateStart.ToUniversalTime().ToString(DateFormat));
sb.AppendLine("DTSTAMP:" + now);
sb.AppendLine("SUMMARY: " + Summary);
sb.AppendLine("LOCATION: " + Location);
sb.AppendLine("DESCRIPTION:" + Description);
sb.AppendLine("PRIORITY:5");
sb.AppendLine("TRANSP:OPAQUE");
sb.AppendLine("END:VEVENT");
sb.AppendLine("END:VCALENDAR");

var calendarBytes = Encoding.UTF8.GetBytes(sb.ToString());
System.IO.MemoryStream stream = new System.IO.MemoryStream(calendarBytes);
Attachment attachment = new Attachment(stream, FileName, "text/calendar");
customerMailMessage.Attachments.Add(attachment);

// 添加HTML正文
string startDateUtc = DateStart.ToUniversalTime().ToString("yyyyMMddTHHmmssZ");
// 假设事件时长为1小时,可根据实际需求调整
DateTime endDate = DateStart.AddHours(1);
string endDateUtc = endDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ");

string htmlBody = $@"
<div style='padding: 20px; font-family: Arial, sans-serif;'>
    <h3>你的预约信息</h3>
    <p>标题:{Summary}</p>
    <p>时间:{DateStart.ToString("yyyy-MM-dd HH:mm")} 至 {endDate.ToString("yyyy-MM-dd HH:mm")}</p>
    <p>地点:{Location}</p>
    <p>详情:{Description}</p>
    <hr>
    <p>点击下方按钮快速添加到Gmail日历:</p>
    <form action='https://calendar.google.com/calendar/r/eventedit' method='GET' target='_blank'>
        <input type='hidden' name='text' value='{Summary}'>
        <input type='hidden' name='dates' value='{startDateUtc}/{endDateUtc}'>
        <input type='hidden' name='location' value='{Location}'>
        <input type='hidden' name='details' value='{Description}'>
        <label style='margin-right: 8px;'>你的Gmail账户:</label>
        <input type='email' name='add' placeholder='yourname@gmail.com' required style='padding: 6px; margin-right: 8px;'>
        <button type='submit' style='padding: 8px 16px; background: #4285F4; color: white; border: none; border-radius: 4px; cursor: pointer;'>添加到Gmail日历</button>
    </form>
    <p style='margin-top: 16px;'>也可以下载下方附件,导入到其他日历应用中。</p>
</div>";

customerMailMessage.IsBodyHtml = true;
customerMailMessage.Body = htmlBody;

注意事项

  • 部分邮件客户端可能过滤表单元素,此时可直接生成带add参数的固定链接(如https://calendar.google.com/calendar/r/eventedit?add=xxx@gmail.com&...),将按钮设置为该链接的跳转。
  • 日期格式必须严格遵循Gmail要求的UTC格式,否则事件时间会出现偏差。
  • 若不需要询问用户名,可移除输入框,Gmail会默认使用当前登录账户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:06:01