Использование X-ALT-DESC / применение HTML к приглашениям календаря в Outlook


Я новичок в C# (и любой сетевой код, если честно). Я пытаюсь отправить приглашение календаря, которое будет отправлено, когда вы нажмете кнопку на веб-сайте компании. Это типичная n-уровневая система, использующая asp.net/C# и SQL.

Раньше мы просто генерировали ics, которые пользователь должен был бы знать, чтобы открыть с Outlook, но с тех пор я научился вручную кодировать VCALENDAR, чтобы он сразу же появился в Outlook красиво и аккуратно.

Все идет нормально. плавно, но теперь я хотел бы, чтобы тело календаря пригласить, чтобы иметь возможность принимать HTML, прикреплять ссылки в частности. Я экспериментировал с альтернативными представлениями, но, похоже, атрибут "X-ALT-DESC" внутри VCALENDAR должен делать именно то, что я хочу. Однако, как я ни стараюсь, Outlook игнорирует его и использует описание. Мне явно чего-то не хватает.

(чтобы уточнить, все работает и компилируется, за исключением описания HTML alt)

private Guid? CreateEmail()
{

        Guid eventGuid = Guid.NewGuid();

        MailMessage msg = new MailMessage();
        msg.IsBodyHtml = true;
        msg.From = new MailAddress("fromemail", "From Name");
        msg.To.Add(toEmail);
        msg.Subject = subject;

        StringBuilder s = new StringBuilder();
        s.AppendLine("BEGIN:VCALENDAR");
        s.AppendLine("VERSION:2.0");
        s.AppendLine("PRODID:-//My Product//Outlook MIMEDIR//EN");
        s.AppendLine("METHOD:" + method); //In this case, "REQUEST"
        s.AppendLine("STATUS:" + status.status);  //"CONFIRMED"
        s.AppendLine("BEGIN:VEVENT");
        s.AppendLine("UID:" + eventGuid.ToString()); 
        s.AppendLine("PRIORITY" + status.priority); //3
        s.AppendLine("X-MICROSOFT-CDO-BUSYSTATUS:" + ShowAs.ToString()); //"BUSY"
        s.AppendLine("SEQUENCE:" + UpdateNumber);//0
        s.AppendLine("DTSTAMP:" + DateTime.Now.ToUniversalTime().ToString());
        s.AppendLine("DTSTART:" + DateTimetoCalTime(startTime));  
        s.AppendLine("DTEND:" + DateTimetoCalTime(endTime));
        s.AppendLine("SUMMARY:" + subject);
        s.AppendLine("LOCATION: " + location);
        s.AppendLine("DESCRIPTION: " + "Plain simple description"

 string html_begin = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">" +
            "n<html>" +
            "n<head>" +
            "n<title></title>" +
            "n</head>" +
            "n<body>" +
            "n<!-- Converted from text/rtf format -->nn<P DIR=LTR><SPAN LANG="en-us">" +
            "n<Font face="Times New Roman"";

        body = "I simply <b> want some bold </b> here 555";

        string html_end = "</font></span></body>n</html>";
        string html_body = html_begin + body + html_end;

        msg.Body = html_body;
        s.AppendLine("X-ALT-DESC;FMTTYPE=text/html:" + html_body);

        msg.Body = html_body;
        s.AppendLine("X-ALT_DESC;FMTTYPE=text/html:" + html_body);

        s.AppendLine("STATUS:" + status.status); //"CONFIRMED"
        s.AppendLine("BEGIN:VALARM");
        s.AppendLine("TRIGGER:-PT1440M");
        s.AppendLine("ACTION:Accept");
        s.AppendLine("DESCRIPTION:Reminder");
        s.AppendLine("END:VALARM");

        s.AppendLine("END:VEVENT");

        s.AppendLine(string.Format("ATTENDEE;CN="{0}";RSVP=TRUE:mailto:{1}", msg.To[0].DisplayName, msg.To[0].Address));
        s.AppendLine("END:VCALENDAR");

        System.Net.Mime.ContentType type = new System.Net.Mime.ContentType("text/calendar");
        type.Parameters.Add("method", method);
        type.Parameters.Add("name", "meeting.ics");
        msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(s.ToString(), type));

SMTP.send(msg);
return EventGuid;

Производит это тело в перспективы:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 3.2//EN”>
<html>
<head>
<title></title>
</head>
<body>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG=”en-us”>
<Font face=”Times New Roman”I simply <b> want some bold </b> here 555</font></span></body>
</html>

От тестирования: Если я оставлю сообщение.тело вне, оно просто использовало "описание". Если я сделаю его равным HTML, я получу вышеуказанный результат.

Спасибо!

3 4

3 ответа:

Для тех, кто в будущем: Проблема заключалась в использовании .AppendLine. Просто использовать .Append

Я обнаружил, что строка HTML должна быть Все на одной строке. Если HTML разбит на несколько строк, это не соответствует кодировке Vcalendar, и описание либо отображается как пустая страница, либо как обычный текст со всеми видимыми тегами HTML.

Я видел других, утверждающих, что тег описания должен использоваться перед "X-ALT-DESC;FMTTYPE=text/html:". Это совершенно неправильно и ложно. Если "описание" существует, оно имеет приоритет, то "X-ALT-DESC;FMTTYPE=text/html:" строка полностью игнорируется Outlook и выводится текстовое описание. Поэтому "X-ALT-DESC; FMTTYPE=text / html:" должен стоять на своем и быть на своей линии.

Рабочий пример:

   ...
   X-ALT-DESC;FMTTYPE=text/html:<html><body><a href="http://bing.com">Bing</a></body></html>
   ...

Неверно:

   ...
   DESCRIPTION;X-ALT-DESC;FMTTYPE=text/html:<html><body><a href="http://bing.com">Bing</a></body></html>
   ...

Опять неверно:

   ...
   X-ALT-DESC;FMTTYPE=text/html:<html>
   <body>
   <a href="http://bing.com">Bing</a>
   </body>
   </html>
   ...

У ВАС МОЖЕТ БЫТЬ X-ALT-DESC на нескольких строках, вам просто нужно добавить пробел в начале каждой следующей за ним строки.

Строки текста не должны быть длиннее 75 октетов, исключая разрыв строки. Длинные строки содержимого следует разбить на несколько линейных представлений, используя технику "сворачивания" линий. Таким образом, длинная строка может быть разделена между любыми двумя символами путем вставки CRLF, за которым сразу же следует один линейный символ пробела (т. е. пробел или HTAB). Какой-нибудь последовательность CRLF, за которой сразу же следует один линейный символ пробела, игнорируется (т. е. удаляется) при обработке типа контента.

Https://icalendar.org/iCalendar-RFC-5545/3-1-content-lines.html