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

时间:2013-01-27 07:42:19

标签: c# icalendar

此时我已经坚持这个问题好几个小时了,我无法弄清楚问题。

我想通过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;
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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