通过iCal文件发送电子邮件邀请

在这一点上我已经坚持这个问题几个小时了,我无法弄清楚问题。

我想通过iCal文件发送电子邮件(gmail)邀请,

如果我发送一个事件,它可以工作(接收者可以收到邀请,可以点击“是”将此邀请添加到接收者的日历)

但它失败了(如果我发送两个事件,gmail将只显示一个邀请,如果我点击是我想将它添加到我的日历中,它只会添加一个邀请到我的日历)。

代码如下:

protected void Page_Load(object sender, EventArgs e) { MailMessage msg = new MailMessage("testxxx@gmail.com", "testxxx@gmail.com", "test", "test"); msg.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); smtp.Credentials = new NetworkCredential("test", "test"); msg = GetCalanderInviteMsg3(msg); smtp.EnableSsl = true; smtp.Send(msg); } public static MailMessage GetCalanderInviteMsg3(MailMessage msg) { StringBuilder sb = new StringBuilder(); sb.AppendLine("BEGIN:VCALENDAR"); sb.AppendLine("PRODID:-//Google Inc//Google Calendar 70.9054//EN"); sb.AppendLine("VERSION:2.0"); sb.AppendLine("CALSCALE:GREGORIAN"); sb.AppendLine("METHOD:PUBLISH"); sb.AppendLine("X-WR-CALNAME:test"); sb.AppendLine("X-WR-TIMEZONE:Asia/Taipei"); sb.AppendLine("X-WR-CALDESC:"); sb.AppendLine("BEGIN:VEVENT"); sb.AppendLine("DTSTART;VALUE=DATE:20130705")` sb.AppendLine("DTEND;VALUE=DATE:20130706"); sb.AppendLine("DTSTAMP:20130127T040705Z"); sb.AppendLine("UID:" + "c643b569-9ba8-45c1-9264-8f160411872a"); sb.AppendLine("CREATED:20130624T082605Z"); sb.AppendLine("DESCRIPTION:"); sb.AppendLine("LAST-MODIFIED:" + "2013127T054310Z"); sb.AppendLine("LOCATION:"); sb.AppendLine("SEQUENCE:0"); sb.AppendLine("STATUS:CONFIRMED"); sb.AppendLine("SUMMARY:event1"); sb.AppendLine("TRANSP:TRANSPARENT"); sb.AppendLine("END:VEVENT"); sb.AppendLine("BEGIN:VEVENT"); sb.AppendLine("DTSTART;VALUE=DATE:20130703"); sb.AppendLine("DTEND;VALUE=DATE:20130704"); sb.AppendLine("DTSTAMP:20130127T040730Z"); sb.AppendLine("UID:" + "84395bf9-875e-4925-864f-910309e0a355"); sb.AppendLine("CREATED:20080624T082556Z"); sb.AppendLine("DESCRIPTION:"); sb.AppendLine("LAST-MODIFIED:" + "2013127T054320Z"); sb.AppendLine("LOCATION:"); sb.AppendLine("SEQUENCE:0"); sb.AppendLine("STATUS:CONFIRMED"); sb.AppendLine("SUMMARY:event2"); sb.AppendLine("TRANSP:TRANSPARENT"); sb.AppendLine("END:VEVENT"); sb.AppendLine("END:VCALENDAR"); System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType("text/calendar"); ct.Parameters.Add("method", "REQUEST"); AlternateView avCal = AlternateView.CreateAlternateViewFromString(sb.ToString(), ct); msg.AlternateViews.Add(avCal); return msg; } 

问题不在于您的代码(尽管根据rfc5545强制使用不同的uid),但使用来自不同日历应用程序的GUI。

如果我们扩展您的用例,它们可能是电子邮件中100或1000的事件,GUI应该如何? 为每个单独的活动点击100个或1000个系列按钮?

因此,尽管您的代码是正确的,并且iMIP(RFC6047)也说可以包含超过1个VEVENT,但是由于用户需要逐个批准它们,因此不应该有多个事件。

如果你想要的是同一个事件的2个instances (因此是相同的UID),你应该使用RDATE属性在一个EVENT中指定你的2个日期,然后你的用户可以接受1个事件的邀请(将有2个实例)。