1

我正在尝试将事件日历发送到 gmail/yahoo/outlook。为此我正在使用

            $from_name = "My Name";
            $from_address = "xxxxxx@example.com";
            $subject = "Meeting Booking"; //Doubles as email subject and meeting subject in calendar
            $meeting_description = "Here is a brief description of my meeting\n\n";
            $meeting_location = "My Office"; //Where will your meeting take place


            //Convert MYSQL datetime and construct iCal start, end and issue dates
            $meetingstamp = strtotime($meeting_date . " UTC");    
            $dtstart= gmdate("Ymd\THis\Z",$meetingstamp);
            $dtend= gmdate("Ymd\THis\Z",$meetingstamp+$meeting_duration);
            $todaystamp = gmdate("Ymd\THis\Z");

            //Create unique identifier
            $cal_uid = date('Ymd').'T'.date('His')."-".rand()."@mydomain.com";

            //Create Mime Boundry
            $mime_boundary = "----Meeting Booking----".md5(time());

            //Create Email Headers
            $headers = array(
                    'From:'.$from_name.' <'.$from_address.'>\n',
                    'Reply-To: '.$from_name.' <'.$from_address.'>\n',
                    'MIME-Version: 1.0\n',
                    'Content-Type: multipart/alternative; boundary='.$mime_boundary.'\n',
                    'Content-class: urn:content-classes:calendarmessage\n'
            );
//            $headers = "From: ".$from_name." <".$from_address.">\n";
//            $headers .= "Reply-To: ".$from_name." <".$from_address.">\n";
//
//            $headers .= "MIME-Version: 1.0\n";
//            $headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";
//            $headers .= "Content-class: urn:content-classes:calendarmessage\n";

            //Create Email Body (HTML)
            $message .= "--$mime_boundary\n";
            $message .= "Content-Type: text/html; charset=UTF-8\n";
            $message .= "Content-Transfer-Encoding: 8bit\n\n";

            $message .= "<html>\n";
            $message .= "<body>\n";
            $message .= '<p>Dear '.$firstname.' '.$lastname.',</p>';
            $message .= '<p>Here is my HTML Email / Used for Meeting Description</p>';    
            $message .= "</body>\n";
            $message .= "</html>\n";
            $message .= "--$mime_boundary\n";

            //Create ICAL Content (Google rfc 2445 for details and examples of usage) 
            $ical =    'BEGIN:VCALENDAR
            PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
            VERSION:2.0
            METHOD:PUBLISH
            BEGIN:VEVENT
            ORGANIZER:MAILTO:'.$from_address.'
            DTSTART:'.$dtstart.'
            DTEND:'.$dtend.'
            LOCATION:'.$meeting_location.'
            TRANSP:OPAQUE
            SEQUENCE:0
            UID:'.$cal_uid.'
            DTSTAMP:'.$todaystamp.'
            DESCRIPTION:'.$meeting_description.'
            SUMMARY:'.$subject.'
            PRIORITY:5
            CLASS:PUBLIC
            END:VEVENT
            END:VCALENDAR';   

            $message .= 'Content-Type: text/calendar;name="meeting.ics";method=REQUEST;charset=utf-8\n';
            $message .= 'Content-Type: text/calendar;name="meeting.ics";method=REQUEST\n';
            $message .= "Content-Transfer-Encoding: 8bit\n\n";
            $message .= $ical;      

            $mail_vars = array(
                'from_name' => $from_name,
                'from' => $from_address,
                'to' => $email,
                'subject' => $subject,
                'headers' => $headers,
                'body' => $message,
            );
            echo "<pre>";
            //print_r($mail_vars);
            echo "</pre>";

注意:如果我通过简单的 mail() 函数发送它,我没有在这里提到 mail() 函数,它工作正常。但是,如果我使用 发送相同的邮件CURL,我不会收到 .ics 文件附件,而且邮件也没有格式化。简而言之,邮件看起来像这样

这是卷曲代码

first way :                      

    $ch = curl_init($posturl);
                            curl_setopt($ch, CURLOPT_POST,1);
                            curl_setopt($ch, CURLOPT_POSTFIELDS,$vars); 
                            curl_setopt($ch, CURLOPT_HEADER,0);  // DO NOT RETURN HTTP HEADERS
                            curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1);  // RETURN THE CONTENTS OF THE CALL
                            $Rec_Data = curl_exec($ch);
second way :
                $ch = curl_init($posturl);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $mailparams['headers']);
                curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
                curl_setopt($ch, CURLOPT_USERPWD, $userpwd);
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
                $Rec_Data = curl_exec($ch);

如果我使用第一种方式,我可以发送邮件,但是没有格式化。第二种方式,邮件不走。

请检查并让我知道。提前致谢!

4

2 回答 2

0

即使我也尝试使用 curl,但对我来说这是不可能的。所以,我终于使用了简单的邮件功能。它又快又容易。去吧。

于 2013-09-13T06:46:21.297 回答
0

"[...] but that is not formatted [...]"你这是什么意思?您发送的 HTML 中没有格式,因此发送正确。

会不会Content-Type: text/calendar有两次?尝试摆脱第一个(;charset=utf-8在那里),看看是否有区别。

另外,我看不出它应该如何产生影响,但请尝试删除 ical 字符串前面的空格。

电子邮件底部还缺少一个 mime 边界。如果您尝试添加它会发生什么?

于 2013-09-03T11:19:53.827 回答