* Calendar Notification: handle calendar requests correctly as multipart/alternative; adding AltExtended to phpmailer; beware parts of multipartAlternative must be in decreasing order of preference (text/calendar as the last part)

This commit is contained in:
Klaus Leithoff 2011-05-26 13:26:09 +00:00
parent 561c650c29
commit 89a1d1d419
2 changed files with 43 additions and 18 deletions

View File

@ -99,12 +99,10 @@ class notifications_email implements notifications_iface {
//error_log(__METHOD__.__LINE__.array2string($_attachments)); //error_log(__METHOD__.__LINE__.array2string($_attachments));
if ($_attachments && stripos($_attachments[0]->type,"text/calendar; method=")!==false) if ($_attachments && stripos($_attachments[0]->type,"text/calendar; method=")!==false)
{ {
$this->mail->Body = $body_plain; $this->mail->AltExtended = $_attachments[0]->string;
$this->mail->AltBody = $_attachments[0]->string; $this->mail->AltExtendedContentType = $_attachments[0]->type;
$this->mail->AltBodyContentType = $_attachments[0]->type; unset($_attachments[0]);
} }
else
{
$this->mail->IsHTML(true); $this->mail->IsHTML(true);
$this->mail->Body = $body_html; $this->mail->Body = $body_html;
$this->mail->AltBody = $body_plain; $this->mail->AltBody = $body_plain;
@ -113,7 +111,6 @@ class notifications_email implements notifications_iface {
$this->mail->AddStringAttachment($attachment->string, $attachment->filename, $attachment->encoding, $attachment->type); $this->mail->AddStringAttachment($attachment->string, $attachment->filename, $attachment->encoding, $attachment->type);
} }
} }
}
if(!$error=$this->mail->Send()) { if(!$error=$this->mail->Send()) {
throw new Exception("Failed sending notification message via email.$error".print_r($this->mail->ErrorInfo,true)); throw new Exception("Failed sending notification message via email.$error".print_r($this->mail->ErrorInfo,true));
} }

View File

@ -136,6 +136,21 @@ class PHPMailer {
*/ */
public $AltBody = ''; public $AltBody = '';
/**
* Sets the ContentType of the AltExtended; default is text/plain
* usually used by text/calendar Invitations/Metting requests
* @var string
*/
public $AltExtendedContentType = 'text/plain';
/**
* Sets the text-only body of the message. This automatically sets the
* email to multipart/alternative. This is used to send calendar meeting requests as
* Outlook does. It adds an 3rd alternative part to multipart/alternative
* @var string
*/
public $AltExtended = '';
/** /**
* Sets word wrapping on the body of the message to a given number of * Sets word wrapping on the body of the message to a given number of
* characters. * characters.
@ -598,7 +613,7 @@ class PHPMailer {
} }
// Set whether the message is multipart/alternative // Set whether the message is multipart/alternative
if(!empty($this->AltBody)) { if(!empty($this->AltBody) || !empty($this->AltExtended)) {
$this->ContentType = 'multipart/alternative'; $this->ContentType = 'multipart/alternative';
} }
@ -1112,6 +1127,7 @@ class PHPMailer {
case 'alt': case 'alt':
case 'alt_attachments': case 'alt_attachments':
$this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
if (!empty($this->AltExtended)) $this->AltExtended = $this->WrapText($this->AltExtended, $this->WordWrap);
break; break;
default: default:
$this->Body = $this->WrapText($this->Body, $this->WordWrap); $this->Body = $this->WrapText($this->Body, $this->WordWrap);
@ -1258,6 +1274,12 @@ class PHPMailer {
$body .= $this->GetBoundary($this->boundary[1], '', $this->BodyContentType, ''); //is dependent on IsHTML $body .= $this->GetBoundary($this->boundary[1], '', $this->BodyContentType, ''); //is dependent on IsHTML
$body .= $this->EncodeString($this->Body, $this->Encoding); $body .= $this->EncodeString($this->Body, $this->Encoding);
$body .= $this->LE.$this->LE; $body .= $this->LE.$this->LE;
if (!empty($this->AltExtended))
{
$body .= $this->GetBoundary($this->boundary[1], '', $this->AltExtendedContentType, ''); // may be set by client, defaults to text/plain
$body .= $this->EncodeString($this->AltExtended, $this->Encoding);
$body .= $this->LE.$this->LE;
}
$body .= $this->EndBoundary($this->boundary[1]); $body .= $this->EndBoundary($this->boundary[1]);
break; break;
case 'plain': case 'plain':
@ -1278,6 +1300,12 @@ class PHPMailer {
$body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body
$body .= $this->EncodeString($this->Body, $this->Encoding); $body .= $this->EncodeString($this->Body, $this->Encoding);
$body .= $this->LE.$this->LE; $body .= $this->LE.$this->LE;
if (!empty($this->AltExtended))
{
$body .= $this->GetBoundary($this->boundary[2], '', $this->AltExtendedContentType, ''); // may be set by client, defaults to text/plain
$body .= $this->EncodeString($this->AltExtended, $this->Encoding);
$body .= $this->LE.$this->LE;
}
$body .= $this->EndBoundary($this->boundary[2]); $body .= $this->EndBoundary($this->boundary[2]);
$body .= $this->AttachAll(); $body .= $this->AttachAll();
break; break;
@ -1365,10 +1393,10 @@ class PHPMailer {
if(count($this->attachment) > 0) { if(count($this->attachment) > 0) {
$this->message_type = 'attachments'; $this->message_type = 'attachments';
} }
if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) { if((strlen($this->AltBody) > 0 || strlen($this->AltExtended) > 0 ) && count($this->attachment) < 1) {
$this->message_type = 'alt'; $this->message_type = 'alt';
} }
if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) { if((strlen($this->AltBody) > 0 || strlen($this->AltExtended) > 0 ) && count($this->attachment) > 0) {
$this->message_type = 'alt_attachments'; $this->message_type = 'alt_attachments';
} }
} }
@ -2005,7 +2033,7 @@ class PHPMailer {
public function getMessageHeader() { public function getMessageHeader() {
if(!isset($this->sentHeader)) { if(!isset($this->sentHeader)) {
// Set whether the message is multipart/alternative // Set whether the message is multipart/alternative
if(!empty($this->AltBody)) $this->ContentType = "multipart/alternative"; if(!empty($this->AltBody) || !empty($this->AltExtended)) $this->ContentType = "multipart/alternative";
$this->SetMessageType(); $this->SetMessageType();
$header = $this->CreateHeader(); $header = $this->CreateHeader();
@ -2018,7 +2046,7 @@ class PHPMailer {
public function getMessageBody() { public function getMessageBody() {
if(!isset($this->sentBody)) { if(!isset($this->sentBody)) {
// Set whether the message is multipart/alternative // Set whether the message is multipart/alternative
if(!empty($this->AltBody)) $this->ContentType = "multipart/alternative"; if(!empty($this->AltBody) || !empty($this->AltExtended)) $this->ContentType = "multipart/alternative";
$this->SetMessageType(); $this->SetMessageType();
$body = $this->CreateBody(); $body = $this->CreateBody();