【问题标题】:How to send an iCalendar the same way Outlook does in .NET如何像 Outlook 在 .NET 中一样发送 iCalendar
【发布时间】:2019-01-11 09:32:49
【问题描述】:

目前,我可以使用 MailKit 发送带有 ics 文件作为附件的电子邮件,该 ics 文件是使用 iCal.net 创建的。这可行,但我只能将其视为附件。当我在 Outlook 中手动创建约会时,我会得到精美的 UI。

当我以编程方式创建它时,我会得到它。

我想以编程方式创建精美的 UI。它似乎与 ICS 无关,因为我通过 Outlook 手动创建了一个 ICS 文件。并使用该 ics 文件通过我的应用程序发送,但仍然没有成功。

static void Main(string[] args)
    {
        string serializedCalendar = CreateRecurringEvent();
        File.WriteAllText(@"F:\test.ics", serializedCalendar);
        SendMail();
    }

    private static void SendMail()
    {
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress("Joey Tribbiani", "joey@tribbiani.com"));
        message.To.Add(new MailboxAddress("Monica Geller", "monica@geller.com"));
        message.To.Add(new MailboxAddress("Chandler Muriel Bing", "chandler@murielbing.com"));
        message.Subject = "How you doin?";

        var builder = new BodyBuilder
        {
            TextBody = @"<bodytext>"
        };

        builder.Attachments.Add(@"F:\test.ics");
        message.Body = builder.ToMessageBody();

        using (var client = new SmtpClient())
        {
            client.ServerCertificateValidationCallback = (s, c, h, e) => true;
            client.Connect("<host>", 235236);
            client.Authenticate("<username>", "<password>");
            client.Send(message);
            client.Disconnect(true);
        }
    }

    private static string CreateRecurringEvent()
    {
        DateTime now = DateTime.Now;
        DateTime later = now.AddHours(1);
        var rrule = new RecurrencePattern(FrequencyType.Daily, 1) { Count = 5 };

        var e = new CalendarEvent
        {
            Start = new CalDateTime(now),
            End = new CalDateTime(later),
            RecurrenceRules = new List<RecurrencePattern> { rrule }
        };

        var calendar = new Calendar();
        calendar.Events.Add(e);

        var serializer = new CalendarSerializer();
        return serializer.SerializeToString(calendar);
    }
}

【问题讨论】:

    标签: .net outlook icalendar mailkit mimekit


    【解决方案1】:

    以下是创建适用于 Outlook 的会议请求的方法:

    var message = new MimeMessage();
    message.From.Add(new MailboxAddress("Joey Tribbiani", "joey@tribbiani.com"));
    message.To.Add(new MailboxAddress("Monica Geller", "monica@geller.com"));
    message.To.Add(new MailboxAddress("Chandler Muriel Bing", "chandler@murielbing.com"));
    message.Subject = "How you doin?";
    
    var mixed = new Multipart ("mixed");
    mixed.Add (new TextPart ("plain") {
        ContentTransferEncoding = ContentEncoding.QuotedPrintable,
        Text = "Would you like to join this meeting?"
    });
    
    var ical = new TextPart ("calendar") {
        ContentTransferEncoding = ContentEncoding.Base64,
        Text = CreateRecurringEvent (),
    };
    
    ical.ContentType.Parameters.Add ("method", "REQUEST");
    
    mixed.Add (ical);
    
    message.Body = mixed;
    

    【讨论】:

    • 我无法在 Mac 上的 Outlook 中完成这项工作(尚未测试 Windows)。如果我通过 BodyBuilder 类添加为附件,那么电子邮件会按照原始海报的建议发送。按照此处准确显示的内容,附加了一个文件,上面写着“不支持的日历 message.ics”。标头也输出为:--B_3652851897_92588008 Content-type: text/calendar; name="not supported calendar message.ics"; x-mac-creator="4F50494D" Content-disposition: attachment; filename="not supported calendar message.ics" Content-transfer-encoding: base64 但是,它的功能相同
    • 我刚刚测试了这个解决方案,它运行良好!非常感谢。
    • @carlowahlstedt 我也有同样的问题。您找到解决方案了吗?
    • 抱歉,我记不清了,我无法再访问我使用它的代码库了。
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多