为什么GMail无法识别代码发送的会议请求?

时间:2014-12-06 17:52:53

标签: c# email outlook gmail icalendar

我想知道如何发送会议请求以允许GMail正确识别它?

如果您尝试发送iCalendar会议请求定义作为替代视图,使用惯用代码(也通过下面给出)通过MailMessage对象GMail,将导致未被识别的会议请求:

enter image description here

但是,通过GMail UI发送完全相同的会议请求的邮件会产生已识别的会议请求!令人费解。

enter image description here

有人知道什么"魔法"我失踪了?

很高兴注意到Outlook正确识别了给定代码发送的完全相同的会议请求。 enter image description here

使用会议请求发送邮件的代码:

class Program
{
    static string From = "sender@example.com";
    static string TimeFormat = "yyyyMMdd\\THHmmss\\Z";
    static string To = "target@example.dom";

    static void Main(string[] args)
    {
        string content = ReadFile("event-template.ics");

        content = content.Replace("#TO#", To);
        content = content.Replace("#FROM#", From);
        content = content.Replace("#UID#", Guid.NewGuid().ToString().Replace("-", ""));
        content = content.Replace("#CREATED-AT#", DateTime.UtcNow.AddDays(-1).ToString(TimeFormat));
        content = content.Replace("#DTSTART#", DateTime.UtcNow.AddDays(1).ToString(TimeFormat));
        content = content.Replace("#DTEND#", DateTime.UtcNow.AddDays(1).AddHours(1).ToString(TimeFormat));

        MailMessage message = new MailMessage();
        message.From = new MailAddress(From);
        message.To.Add(new MailAddress(To));
        message.Subject = "Meeting Request from Code!";

        var iCalendarContentType = new ContentType("text/calendar; method=REQUEST");

        var calendarView = AlternateView.CreateAlternateViewFromString(content, iCalendarContentType);
        calendarView.TransferEncoding = TransferEncoding.SevenBit;
        message.AlternateViews.Add(calendarView);

        using (var smtp = new SmtpClient())
        {
            smtp.Send(message);
        }
    }

    public static string ReadFile(string fileName)
    {
        using (StreamReader r = new StreamReader(fileName))
        {
            return r.ReadToEnd();
        }
    }
}

iCalendar模板定义:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//A//B//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
ORGANIZER;CN="Organizer":mailto:#FROM#
ATTENDEE;CN="Attendee";CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=
 NEEDS-ACTION;RSVP=TRUE:mailto:#TO#
DTSTART:#DTSTART#
DTEND:#DTEND#
LOCATION:Location test
TRANSP:OPAQUE
SEQUENCE:0
UID:#UID#
DTSTAMP:#CREATED-AT#
CREATED:#CREATED-AT#
LAST-MODIFIED:#CREATED-AT#
DESCRIPTION:Test description\n
PRIORITY:5
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR

UPD。代码生成并由GMail收到的电子邮件来源(未被GMail视为会议请求):http://pastebin.com/MCU6P16Y

GMail在转发过程中撰写的电子邮件来源(已确认的相关内容):http://pastebin.com/zfbbj9Gg

重要更新。 只需将目标从我的电子邮件(<my>@gmail.com)更改为我的同事(<colleague>@gmail.com { {1}})开始正确识别!现在它看起来像GMail问题。 (我发送的电子邮件地址与目标不同,当然可以)

更新。在GMail支持论坛中找到完全相同的问题:Bug: Gmail fails to recognize .ics calendar invitations attached to incoming messages。该问题日期为2011年6月,并已报告固定至2011年7月。我在那里创建了新主题:GMail fails to recognize *.ics attachment as a meeting request

2 个答案:

答案 0 :(得分:2)

似乎问题不是GMAIL识别会议请求,而是显示问题。我被同样的问题所困扰。

我从“设置”菜单将GMAIL显示语言更改为“英语(美国)”后,“已修复”。

所以这绝对是一个错误。

答案 1 :(得分:0)

如果您正在使用c#,我设法获得了这个有效的Outlook web,gmail,outlook 2016.

您需要做的是添加一个替代视图,当您有多个视图但这对您上面的示例有用时,这似乎不起作用。

以下替代视图:

                    var ct = new ContentType("text/calendar");

                    if (ct.Parameters != null)
                    {
                        ct.Parameters.Add("method", "REQUEST");
                        ct.Parameters.Add("charSet", "utf-8");

                        var avCal = AlternateView.CreateAlternateViewFromString(calendarAppt.ToString(), ct);
                        avCal.TransferEncoding = TransferEncoding.Base64;
                        mail.AlternateViews.Add(avCal);
                    }