X-Git-Url: https://git-public.kairo.at/?p=php-utility-classes.git;a=blobdiff_plain;f=include%2Fclasses%2Femail.php-class;h=2de9ca4e67015145c556ca14cf81ca081fa38bf3;hp=8f72c30abf0f6117afc5033e756f786cf3329d61;hb=43bc07b3ee51f7d3f5ecd783b8195da26cc43f03;hpb=3077a4f6d97917f3876109a9a36840293427faf0;ds=sidebyside diff --git a/include/classes/email.php-class b/include/classes/email.php-class old mode 100755 new mode 100644 index 8f72c30..2de9ca4 --- a/include/classes/email.php-class +++ b/include/classes/email.php-class @@ -93,18 +93,29 @@ class email { // public function addHeader($hname, [$hcontent]) // add a header to the mail // + // public function addHeaderAddress($hname, $email, [$name]) + // add an address header to the mail, possibly with both name and mail parts + // // public function addMailText($textpart) // add some text to the mail // // public function addAttachment($aname, $acontent, [$atype]) // add an attachment to the mail, use given file name, content and MIME type (defaults to application/octet-stream) // + // public function getAddresses([$addrtype]) + // returns an array of all addresses this mail gets sent to + // fields: email, name, addrtype + // addrtype is one of to/cc/bcc + // the $addrtype parameter is a comma-separated list of such types, default: all of them + // // public function send() // really send the mail // - // private function mimeencode($fieldtext) + // private function mimeencode($fieldtext, [$stringescape]) // helper function: - // encode given field text, ready to be placed into an e-mail MIME header + // encode given field text, ready to be placed into an e-mail MIME header + // if the boolean $stringescape is true, make sure this is sent as a single word in RFC2822 context (e.g. for names) + // see http://www.ietf.org/rfc/rfc2822.txt for the RFC in question private $debug_toSingleAddress = ''; private $subject; @@ -147,39 +158,89 @@ class email { $this->headers[] = array('name' => $hname, 'content' => $hcontent); } + public function addHeaderAddress($hname, $email, $name = '') { + if (strlen($name)) { $hcontent = $this->mimeencode($name, true).' <'.$email.'>'; } + else { $hcontent = $email; } + $this->headers[] = array('name' => $hname, 'content' => $hcontent); + } + public function addMailText($textpart) { $this->mailtext .= $textpart; } public function addAttachment($aname, $acontent, $atype = 'application/octet-stream') { $this->attachments[] = array('name' => $aname, 'content' => $acontent, 'type' => $atype); } + public function getAddresses($addrtype = null) { + // returns all addresses this mail gets sent to + if (!is_array($addrtype)) { + if (strlen($addrtype)) { $addrtype = explode(',', strtolower($addrtype)); } + else { $addrtype = array('to','cc','bcc'); } + } + $mailaddresses = array(); + + if (in_array('to', $addrtype)) { + foreach ($this->recipients as $address) { + if (strlen(@$address['mail'])) { + $mailaddresses[] = array('mail'=>$address['mail'], + 'name'=>strlen($address['name'])?$address['name']:'', + 'addrtype'=>'to'); + } + } + } + if (in_array('cc', $addrtype)) { + foreach ($this->cc as $address) { + if (strlen(@$address['mail'])) { + $mailaddresses[] = array('mail'=>$address['mail'], + 'name'=>strlen($address['name'])?$address['name']:'', + 'addrtype'=>'cc'); + } + } + } + if (in_array('bcc', $addrtype)) { + foreach ($this->bcc as $address) { + if (strlen(@$address['mail'])) { + $mailaddresses[] = array('mail'=>$address['mail'], + 'name'=>strlen($address['name'])?$address['name']:'', + 'addrtype'=>'bcc'); + } + } + } + + return $mailaddresses; + } + public function send() { global $util; $mtxt = ''; $hdrs = 'MIME-Version: 1.0'."\n"; $subj = $this->mimeencode($this->subject); if (strlen($this->sender['name'])) { - $hdrs .= 'From: '.$this->mimeencode($this->sender['name']).' <'.$this->sender['mail'].'>'."\n"; + $hdrs .= 'From: '.$this->mimeencode($this->sender['name'], true).' <'.$this->sender['mail'].'>'."\n"; } else { $hdrs .= 'From: '.$this->sender['mail']."\n"; } if (count($this->replyto)) { if (strlen($this->replyto['name'])) { - $hdrs .= 'Reply-to: '.$this->mimeencode($this->replyto['name']).' <'.$this->replyto['mail'].'>'."\n"; + $hdrs .= 'Reply-to: '.$this->mimeencode($this->replyto['name'], true).' <'.$this->replyto['mail'].'>'."\n"; } else { $hdrs .= 'Reply-to: '.$this->replyto['mail']."\n"; } } if (count($this->recipients)) { $recpt = ''; foreach ($this->recipients as $address) { - if (strlen($address['name'])) { $recpt .= $this->mimeencode($address['name']).' <'.$address['mail'].'>,'; } - else { $recpt .= $address['mail'].','; } + if (strlen(@$address['mail'])) { + if (strlen($address['name'])) { $recpt .= $this->mimeencode($address['name'], true).' <'.$address['mail'].'>,'; } + else { $recpt .= $address['mail'].','; } + } } $recpt = preg_replace('/,$/', '', $recpt); } + if (!strlen($recpt)) { + return null; + } if (count($this->cc)) { $adrs = ''; foreach ($this->cc as $address) { - if (strlen($address['name'])) { $adrs .= $this->mimeencode($address['name']).' <'.$address['mail'].'>,'; } + if (strlen($address['name'])) { $adrs .= $this->mimeencode($address['name'], true).' <'.$address['mail'].'>,'; } else { $adrs .= $address['mail'].','; } } $adrs = preg_replace('/,$/', '', $adrs); @@ -188,7 +249,7 @@ class email { if (count($this->bcc)) { $adrs = ''; foreach ($this->bcc as $address) { - if (strlen($address['name'])) { $adrs .= $this->mimeencode($address['name']).' <'.$address['mail'].'>,'; } + if (strlen($address['name'])) { $adrs .= $this->mimeencode($address['name'], true).' <'.$address['mail'].'>,'; } else { $adrs .= $address['mail'].','; } } $adrs = preg_replace('/,$/', '', $adrs); @@ -236,12 +297,20 @@ class email { foreach ($this->attachments as $attach) { $mtxt .= "\n".'--'.$boundary."\n"; $mtxt .= 'Content-Type: '.$attach['type'].'; name="'.$attach['name'].'";'."\n"; - $mtxt .= 'Content-Transfer-Encoding: base64'."\n"; - $mtxt .= 'Content-Disposition: attachment'."\n\n"; - $mtxt .= rtrim(chunk_split(base64_encode($attach['content']), 76)); ; - $mtxt .= "\n"; + if (preg_match('/^(text|message)\//', $attach['type'])) { + $mtxt .= 'Content-Transfer-Encoding: 8bit'."\n"; + $mtxt .= 'Content-Disposition: attachment'."\n\n"; + $mtxt .= $attach['content']; + $mtxt .= "\n"; + } + else { + $mtxt .= 'Content-Transfer-Encoding: base64'."\n"; + $mtxt .= 'Content-Disposition: attachment'."\n\n"; + $mtxt .= rtrim(chunk_split(base64_encode($attach['content']), 76)); ; + $mtxt .= "\n"; + } } - $mtext .= '--'.$boundary.'--'."\n"; + $mtxt .= '--'.$boundary.'--'."\n"; } if (strlen($this->debug_toSingleAddress)) { @@ -256,16 +325,18 @@ class email { return mail($recpt, $subj, $mtxt, $hdrs); } - private function mimeencode($fieldtext) { + private function mimeencode($fieldtext, $stringescape = false) { $mText = imap_8bit($fieldtext); - if ($mText != $fieldtext) { - $trans = array('_' => '=5F', ' ' => '_', '?' => '=3F'); - $mText = strtr($mText, $trans); + $is_qpformat = ($mText != $fieldtext); + if ($stringescape && preg_match('/[^\w !#$%&\'*+\/=?^`{|}~-]/', $mText)) { + // if needed, make this a quoted-string instead of an atom (to speak in RFC2822 language) + $mText = '"'.strtr($mText, array('"' => '\"', '\\' => '\\\\')).'"'; + } + if ($is_qpformat) { + $mText = strtr($mText, array('_' => '=5F', ' ' => '_', '?' => '=3F')); $mText = '=?'.strtoupper($this->charset).'?Q?'.$mText.'?='; } return $mText; } - - } ?>