2015-12-15 144 views
0

代码的目标是通过使用PHP发送约会和阻止人日历。发送Outlook日历邀请PHP

我这里有两页: test.php的

<?php 
    include ("iCal.php"); 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>iCal Test</title> 
</head> 

<body> 
<?php 

    //$firstname is the first name of target 
    //$lastname is the last name of target 
    //$email is the targets email address 
    //$meeting_date is straight from a DATETIME mysql field and assumes UTC. 
    //$meeting_name is the name of your meeting 
    //$meeting_duretion is the duration of your meeting in seconds (3600 = 1 hour) 
    $firstname = "John"; 
    $lastname = "Smith"; 
    $email = "[email protected]"; 
    $meeting_date = "2010-07-06 13:40:00"; //mysql format 
    $meeting_name = "Hello"; 
    $meeting_duration = 3600; 

    //returns true or false 
    $result = sendIcalEmail($firstname,$lastname,$email,$meeting_date,$meeting_name,$meeting_duration); 

    //display result 
    if($result) { 
     echo "Email sent successfully."; 
    } else { 
     echo "A problem occured sending email"; 
    } 

?> 
</body> 
</html> 

iCal.php

<?php 

//$firstname is the first name of target 
//$lastname is the last name of target 
//$email is the targets email address 
//$meeting_date is straight from a DATETIME mysql field and assumes UTC. 
//$meeting_name is the name of your meeting 
//$meeting_duretion is the duration of your meeting in seconds (3600 = 1 hour) 

function sendIcalEmail($firstname,$lastname,$email,$meeting_date,$meeting_name,$meeting_duration) { 

    $from_name = "My Name"; 
    $from_address = "[email protected]"; 
    $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 = "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;    

    //SEND MAIL 
    $mail_sent = @mail($email, $subject, $message, $headers); 

    if($mail_sent)  { 
     return true; 
    } else { 
     return false; 
    } 

} 


?> 

但随着

时发生问题发送电子邮件

的输出中显示错误
+0

最好的方法是首先测试产生的。所以请在浏览器中下载文件或将其写入文件并在Outlook中进行测试。 如果这个方法可行,你可以提出一个关于如何用附件发送电子邮件的新问题 – brandelizer

+1

删除mail()函数前面的@,你可能会得到一个实际的错误信息,告诉你什么是错误的,而不是你自己的无用错误信息。 –

回答

-1
<?php 
function sendIcalEvent($from_name, $from_address, $to_name, $to_address, $startTime, $endTime, $subject, $description, $location) 
{ 
$domain = 'exchangecore.com'; 

//Create Email Headers 
$mime_boundary = "----Meeting Booking----".MD5(TIME()); 

$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\r\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 '.$to_name.',</p>'; 
$message .= '<p>'.$description.'</p>'; 
$message .= "</body>\n"; 
$message .= "</html>\n"; 
$message .= "--$mime_boundary\r\n"; 

$ical = 'BEGIN:VCALENDAR' . "\r\n" . 
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" . 
'VERSION:2.0' . "\r\n" . 
'METHOD:REQUEST' . "\r\n" . 
'BEGIN:VTIMEZONE' . "\r\n" . 
'TZID:Eastern Time' . "\r\n" . 
'BEGIN:STANDARD' . "\r\n" . 
'DTSTART:20091101T020000' . "\r\n" . 
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" . 
'TZOFFSETFROM:-0400' . "\r\n" . 
'TZOFFSETTO:-0500' . "\r\n" . 
'TZNAME:EST' . "\r\n" . 
'END:STANDARD' . "\r\n" . 
'BEGIN:DAYLIGHT' . "\r\n" . 
'DTSTART:20090301T020000' . "\r\n" . 
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" . 
'TZOFFSETFROM:-0500' . "\r\n" . 
'TZOFFSETTO:-0400' . "\r\n" . 
'TZNAME:EDST' . "\r\n" . 
'END:DAYLIGHT' . "\r\n" . 
'END:VTIMEZONE' . "\r\n" . 
'BEGIN:VEVENT' . "\r\n" . 
'ORGANIZER;CN="'.$from_name.'":MAILTO:'.$from_address. "\r\n" . 
'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" . 
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" . 
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."@".$domain."\r\n" . 
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" . 
'DTSTART;TZID="Eastern Time":'.date("Ymd\THis", strtotime($startTime)). "\r\n" . 
'DTEND;TZID="Eastern Time":'.date("Ymd\THis", strtotime($endTime)). "\r\n" . 
'TRANSP:OPAQUE'. "\r\n" . 
'SEQUENCE:1'. "\r\n" . 
'SUMMARY:' . $subject . "\r\n" . 
'LOCATION:' . $location . "\r\n" . 
'CLASS:PUBLIC'. "\r\n" . 
'PRIORITY:5'. "\r\n" . 
'BEGIN:VALARM' . "\r\n" . 
'TRIGGER:-PT15M' . "\r\n" . 
'ACTION:DISPLAY' . "\r\n" . 
'DESCRIPTION:Reminder' . "\r\n" . 
'END:VALARM' . "\r\n" . 
'END:VEVENT'. "\r\n" . 
'END:VCALENDAR'. "\r\n"; 
$message .= 'Content-Type: text/calendar;name="meeting.ics";method=REQUEST'."\n"; 
$message .= "Content-Transfer-Encoding: 8bit\n\n"; 
$message .= $ical; 

$mailsent = mail($to_address, $subject, $message, $headers); 

return ($mailsent)?(true):(false); 
} 
+1

您应该添加您更改的内容以“解决”问题。 –

+0

我只发布了我在这里使用(和工作)的代码。它的一个单一的功能:-D – brandelizer

+0

嗨@GeraldSchneider,我测试了代码,但是当我触发页面时,没有任何事情发生。你介意分享如何使它工作? –

0

我已经通过我自己解决了这个问题。主题已关闭。

<?php 
require 'PHPMailerAutoload.php'; 


$mail = new PHPMailer; 
$mail->isSMTP();          // Set mailer to use SMTP 
$mail->Host = 'xxx.xx.com';      // Specify main and backup server 
$mail->SetFrom('[email protected]', 'xx xxx'); 
$mail->SMTPAuth = false;        // Enable SMTP authentication 
$mail->Username = '';     // SMTP username 
$mail->Password = '';    // SMTP password 
//$mail->SMTPSecure = 'tls';       // Enable encryption, 'ssl' also accepted 
$mail->Port = 25;         //Set the SMTP port number - 587 for authenticated TLS 
$mail->addAddress('[email protected]'); // Add a recipient 
//$mail->addCC($manlv4); 
//$mail->addBCC('[email protected]'); 
$mail->WordWrap = 50;         // Set word wrap to 50 characters 
$mail->isHTML(true);         // Set email format to HTML 

$location   = "Stardestroyer-013"; 
    $date    = '20151216'; 
    $startTime   = '0800'; 
    $endTime   = '0900'; 
    $subject   = 'Millennium Falcon'; 
    $desc    = 'This email is a reminder for you. Please accept!'; 

$organizer   = 'Darth Vader'; 

    $organizer_email = '[email protected]'; 
    $participant_name_1 = 'Kelvin'; 
    $participant_email_1= '[email protected]'; 

    $text = "BEGIN:VCALENDAR\r\n 
    VERSION:2.0\r\n 
    PRODID:-//Deathstar-mailer//theforce/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:".$date."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 = "From: Sender\n"; 
$headers .= 'Content-Type:text/calendar; Content-Disposition: inline; charset=utf-8;\r\n'; 
$headers .= "Content-Type: text/plain;charset=\"utf-8\"\r\n"; #EDIT: TYPO 
$mail->Subject = $subject; 
$mail->Body = $desc; 
$mail->AltBody = $text; // in your case once more the $text string 
$mail->Ical = $text; // ical format, in your case $text string 


if(!$mail->send()) { 
    echo 'Message could not be sent.'; 
    echo 'Mailer Error: ' . $mail->ErrorInfo; 
    exit; 
} 

echo 'Message has been sent'; 
?>