PHP |在Outlook中发送电子邮件邀请

时间:2014-12-30 15:37:29

标签: php calendar outlook phpmailer

我正在尝试创建一个在Outlook中发送的邀请电子邮件,用户通常可以选择接受在Outlook中填充日历的约会。我正在使用PHP邮件程序并遇到问题,请参阅下文:

用户应如何接收电子邮件的示例: enter image description here

但是,当发送电子邮件时,它实际上并不发送邀请。而是发送文本,请参阅收到的电子邮件的下图(我已经审查了电子邮件和个人姓名): enter image description here

老实说,我不知道有什么问题,下面是我的代码。请假设变量具有分配给它们的值,否则将会发布过多的信息:

                $participant_name = $userid_result["realname"];
                $participant_email = $userid_result["email_primary"];

                $to = $participant_email;

                $organizer          = 'jimmy Smith';
                $organizer_email    = 'jimmy@example.co.uk';

                $participant_name_1 = $participant_name;
                $participant_email_1= $participant_email;

                $location           = "N/A";
                $date               = $row_date_from;
                $startTime          = $row_date_from;
                $endTime            = $row_date_to;
                $dateend            = $row_date_to;
                $subject            = 'Holiday Request';
                $desc               = 'Email regarding your holiday request made on Vision';

                $headers = 'Content-Type:text/calendar; Content-Disposition: inline; charset=utf-8;\r\n';
                $headers .= "Content-Type: text/plain;charset=\"utf-8\"\r\n"; 

                $message = "BEGIN:VCALENDAR\r\n
                VERSION:2.0\r\n
                PRODID:-//Vision/NONSGML v1.0//EN\r\n
                METHOD:REQUEST\r\n
                BEGIN:VEVENT\r\n
                UID:" . md5(uniqid(mt_rand(), true)) . "example.com\r\n
                DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z\r\n
                DTSTART:".$date."T".$startTime."00Z\r\n
                DTEND:".$dateend."T".$endTime."00Z\r\n
                SUMMARY:".$subject."\r\n
                ORGANIZER;CN=".$organizer.":mailto:".$organizer_email."\r\n
                LOCATION:".$location."\r\n
                DESCRIPTION:".$desc."\r\n
                ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN".$participant_name_1.";X-NUM-GUESTS=0:MAILTO:".$participant_email_1."\r\n
                END:VEVENT\r\n
                END:VCALENDAR\r\n";

              //  $headers .= $message;                 
                $zero = 0; 
                send_email($to,$subject,$message,$zero,$headers);

send_email函数的代码可以在这里阅读: http://pastebin.com/bxJFHUh8

此致

1 个答案:

答案 0 :(得分:1)

您无法设置多个内容类型的标头,希望它能正常工作!这就是为什么像PHPMailer这样的库可以帮助你避免做这些愚蠢的事情!

问题是Outlook没有遵循适当的标准。像这样的消息应格式化为multipart/alternative结构(如典型的组合普通/ html消息),其中一个部分是text/calendar类型。 Outlook希望这是一个multipart/related结构,通常用于附件。在this PHPMailer bug report中对这个问题进行了很好的讨论。

PHPMailer与' extras'中的简单vcal生成器类捆绑在一起。文件夹,单元测试有an example of how to use it

正如您将从错误报告中收集的那样,这并没有得到解决,并且在任何环境中工作解决方案都非常混乱,因为您需要实现两种MIME结构(具有重复数据)才能在两者中工作Outlook和Gmail。