2017-02-20 10 views
0

Моя PHP-программа создает файл ics, она работает ранее для большинства почтовых клиентов, но я получил сообщение об ошибке для Outlook 2013, имя файла файл ics, названный «не поддерживается календарным сообщением», но при двойном щелчке, чтобы открыть его, он правильно показывает содержимое. Я ищу в Интернете, но не могу найти причин. Может ли кто-нибудь помочь в этой ситуации?В Outlook 2013 отображаются «не поддерживаемые календарные сообщения.», Но Gmail, Outlook 2007 хороши

Вот сгенерированный ектронный пример:

BEGIN:VCALENDAR 
PRODID:-//MY COMPANY NAME//System iCal Generator//EN 
VERSION:2.0 
METHOD:REQUEST 
BEGIN:VEVENT 
DTSTART:20170314T180000Z 
DTEND:20170314T210000Z 
DTSTAMP:20170217T161443Z 
ORGANIZER;CN=name of event here:mailto:[email protected] 
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:[email protected] 
SUMMARY:Test website for evet 
DESCRIPTION:xyz 
LOCATION:tbc 
SEQUENCE:0 
UID:[email protected] 
END:VEVENT 
END:VCALENDAR 

Спасибо за помощь!

+0

Какая ошибка в Outlook вы получаете? –

ответ

0

Попробуйте создать встречу в Outlook, а затем сохраните ее в формате .ics. См. How To Save A Selected Appointment As Ics File In Outlook? для получения дополнительной информации. Затем вы можете открыть сохраненный файл и сравнить его содержимое с сгенерированным программным способом.

0

Старый, но я буду идти дальше и отвечать, так как он появился в моих поисках.

У меня возникли проблемы с тем, что новый Outlook был очень конкретным в отношении того, примет ли он мое событие без каких-либо странных проблем ... , и многое из этого действительно сводилось к правильным окончаниям строк. Я должен был убедиться, что \r\n был использован в коде VCalendar, но в PHP на Unix я должен был убедиться, что для новых строк в фактическом сообщении электронной почты был использован \n. Вот код, который я работал с последним Outlook, который использует строковые массивы так, чтобы линия окончания каждого раздела является явным и очевидным:

Пожалуйста, обратите внимание, что этот код не делает ничего, чтобы предотвратить заголовок инъекцию. Пожалуйста, используйте ответственно :)

<?php 
    date_default_timezone_set('America/New_York'); 
    //CONFIGURE HERE 
    $fromName   = "John Doe"; 
    $fromEmail   = "[email protected]"; 
    $toName    = "Your Name"; 
    $toEmail   = isset($_GET['to']) ? $_GET['to'] : '[email protected]'; 
    $start    = new DateTime('2017-08-15 15:00'); 
    $end    = new DateTime('2017-08-15 16:00'); 
    $summary   = "Hello World Event"; 
    //END CONFIGURATION 

    $uid    = ""; 
    $headers   = array(); 
    $boundary   = "_CAL_" . uniqid("B",true) . "_B_"; 
    $headers[]   = "MIME-Version: 1.0"; 
    $headers[]   = "Content-Type: multipart/alternative; boundary=\"".$boundary."\""; 
    $headers[]   = "To: \"{$toName}\" <{$toEmail}>"; 
    $headers[]   = "From: \"{$fromName}\" <{$fromEmail}>"; 

    $calendarLines  = array(
     "BEGIN:VCALENDAR", 
     "METHOD:REQUEST", 
     "PRODID:-//PHP//MeetingRequest//EN", 
     "VERSION:2.0", 
     "BEGIN:VEVENT", 
     "ORGANIZER;CN={$fromName}:MAILTO:{$fromEmail}", 
     "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN={$toName}:MAILTO:{$toEmail}", 
     "DESCRIPTION:{$summary}", 
     "SUMMARY:{$summary}", 
     "DTSTART:".$start->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'), 
     "DTEND:".$end->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'), 
     "UID:{$uid}", 
     "CLASS:PUBLIC", 
     "PRIORITY:5", 
     "DTSTAMP:".gmdate('Ymd\THis\Z'), 
     "TRANSP:OPAQUE", 
     "STATUS:CONFIRMED", 
     "SEQUENCE:0", 
     "LOCATION:123 Any Street", 
     "BEGIN:VALARM", 
     "ACTION:DISPLAY", 
     "DESCRIPTION:REMINDER", 
     "TRIGGER;RELATED=START:-PT15M", 
     "END:VALARM", 
     "END:VEVENT", 
     "END:VCALENDAR" 
    ); 


    $calendarBase64  = base64_encode(implode("\r\n",$calendarLines)); 
    //ensure we don't have lines longer than 70 characters for older computers: 
    $calendarResult  = wordwrap($calendarBase64,68,"\n",true); 

    $emailLines = array(
     "--{$boundary}", 
     "Content-Type: text/html; charset=\"iso - 8859 - 1\"", 
     "Content-Transfer-Encoding: quoted-printable", 
     "", 
     "<html><body>", 
     "<h1>Hello World</h1>", 
     "<p>This is a calendar event test</p>", 
     "</body></html>", 
     "", 
     "--{$boundary}", 
     "Content-Type: text/calendar; charset=\"utf - 8\"; method=REQUEST", 
     "Content-Transfer-Encoding: base64", 
     "", 
     $calendarResult, 
     "", 
     "--{$boundary}--" 
    ); 
    $emailContent = implode("\n",$emailLines); 

    $headersResult  = implode("\n",$headers); 
    mail($toEmail, $summary, $emailContent, $headersResult); 
    echo("<pre>".htmlentities($headersResult)."\n\n".htmlentities($emailContent)."</pre>"); 
    echo("<br /><br />"); 
    echo("<pre>".base64_decode($calendarResult)."</pre>"); 

Пожалуйста, не стесняйтесь добавлять комментарии к приложениям/сайтах, что делает или не работать. Спасибо.

0

Тестирование фида icalendar с помощью валидатора icalendar в https://icalendar.org/validator.html показало, что строка ATTENDEE длиннее 75 символов, что является максимальным размером строки для файла icalendar. Возможно, поэтому он не работает?