2014-02-22 73 views
0

我正在通過php發送會議邀請。我的代碼確實發送了會議邀請(作爲會議邀請對最終用戶可見),但是我無法設置html說明。PHP Vcalendar:純文本描述可見,而不是HTML文本

我懷疑問題可能是因爲我使用字符串變量傳遞參數到X-ALT-DESC。在邀請中,我通過DESCRIPTION標籤設置了純文本,但HTML文本不是。如果邀請被Outlook 2007收到,他應該看到HTML文本正確嗎?

下面是代碼:

$aHeaders = array(); 
$aHeaders[] = 'MIME-Version: 1.0'; 
$aHeaders[] = 'Content-Type: text/calendar; method=REQUEST'; 
$aHeaders[] = 'Content-Class: urn:content-classes:calendarmessage'; 
$aHeaders[] = 'From: [email protected]'; 
$aHeaders[] = 'Reply-To: [email protected]'; 
$sHeaders = implode("\r\n", $aHeaders); 

    $sBody .= "BEGIN:VCALENDAR\r\n"; 
    $sBody .= "PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN\r\n"; 
    $sBody .= "VERSION:2.0\r\n"; 
    $sBody .= "METHOD:REQUEST\r\n"; 
    $sBody .= "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\r\n"; 
    $sBody .= "BEGIN:VEVENT\r\n"; 
    $sBody .= "ATTENDEE:mailto:" . $sTo . "\r\n"; 
    $sBody .= "ORGANIZER;CN=ABC:mailto:[email protected]\r\n"; 
    $sBody .= "DTSTAMP:'.date('Ymd').'T'.date('His').'Z''\r\n"; 
    $sBody .= "DTSTART:" . $sConfstart . "\r\n"; 
    $sBody .= "DTEND:" . $sConfend . "\r\n"; 
    $sBody .= "LOCATION:Conference Call\r\n"; 
    $sBody .= "TRANSP:OPAQUE\r\n"; 
    $sBody .= "SEQUENCE:0\r\n"; 
    $sBody .= "UID:'. md5(uniqid(mt_rand(), true)) .'\r\n"; 
    $sBody .= "SUMMARY:" . $sSubject . "\r\n"; 
    $sBody .= "PRIORITY:5\r\n"; 
    $sBody .= "CLASS:PUBLIC\r\n"; 
    $sBody .= "DESCRIPTION:this is plain desc"\r\n"; 
    $sBody .= "X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\"><HTML><BODY>html goes here</BODY></HTML>\r\n"; 
    $sBody .= "END:VEVENT\r\n"; 
    $sBody .= "END:VCALENDAR\r\n"; 

----編輯 這裏是生成的iCalendar字符串

BEGIN:VCALENDAR 
PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN 
VERSION:2.0 
METHOD:REQUEST 
X-MS-OLK-FORCEINSPECTOROPEN:TRUE 
BEGIN:VEVENT 
ATTENDEE;CN="[email protected], [email protected]";RSVP=TRUE:mail 
    to:[email protected]\, [email protected] 
CLASS:PUBLIC 
CREATED:20140222T144724Z 
DESCRIPTION:this is plain desc 
DTEND:20140223T140000Z 
DTSTAMP:20140222T144640Z 
DTSTART:20140223T130000Z 
LAST-MODIFIED:20140222T144724Z 
LOCATION:Conference Call 
ORGANIZER;CN="test_org":mailto:[email protected] 
PRIORITY:5 
SEQUENCE:0 
SUMMARY;LANGUAGE=en-us: 
TRANSP:OPAQUE 
UID:20140222T144640Z 
X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//E 
    N">\n<HTML>\n<HEAD>\n<META NAME="Generator" CONTENT="MS Exchange Server ve 
    rsion 08.00.0681.000">\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n<!-- Converted f 
    rom text/plain format -->\n\n<P><FONT SIZE=2>&lt\;!DOCTYPE HTML PUBLIC &qu 
    ot\;-//W3C//DTD HTML 3.2//EN&quot\;&gt\;&lt\;HTML&gt\;&lt\;BODY&gt\;html g 
    oes here&lt\;/BODY&gt\;&lt\;/HTML&gt\;</FONT>\n</P>\n\n</BODY>\n</HTML> 
X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE 
X-MICROSOFT-CDO-IMPORTANCE:1 
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY 
BEGIN:VALARM 
TRIGGER:-PT15M 
ACTION:DISPLAY 
DESCRIPTION:Reminder 
END:VALARM 
END:VEVENT 
END:VCALENDAR 
+0

您可以發佈生成的'iCalendar'字符串而不是代碼? – mb21

+0

我剛纔添加了icalendar字符串...... thx看看:) – user3340744

+0

我沒有Outlook來測試,但DESCRIPTION字段也包含HTML而不是純文本... – mb21

回答

0

我晚年,但所有這些人在此找到搜索結果...這不是「THE」的答案,但它是適用於Outlook的答案。

我無法使用X-ALT-DESC等工具來獲取HTML,我仍然很樂意看到有人回答這個問題。但是,您可以通過創建multipart/alternative電子郵件來使HTML成爲Outlook中事件的一部分。不過,再次,雖然這適用於Outlook,但其他服務(例如Gmail)僅會顯示活動中的摘要/說明。

警告:這無助於防止頭部注射,請用負責任 ;-)

<?php 
    date_default_timezone_set('America/New_York'); 
    //CONFIGURE HERE 
    $fromName   = "John Doe"; 
    $fromEmail   = "[email protected]"; 
    $toName    = "Your Name"; 
    $toEmail   = '[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>");