From: Chuck Hagenbuch Date: Wed, 25 Oct 2000 17:16:08 +0000 (+0000) Subject: add Mail:: interface and supporting classes. X-Git-Tag: php-4.0.4RC3~540 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=167c0a0277f37295961cc7209398839182099f8b;p=php add Mail:: interface and supporting classes. --- diff --git a/pear/Mail.php b/pear/Mail.php new file mode 100644 index 0000000000..e17492eec2 --- /dev/null +++ b/pear/Mail.php @@ -0,0 +1,169 @@ + | +// +----------------------------------------------------------------------+ + +require_once 'PEAR.php'; + +/** + * PEAR's Mail:: interface. Defines the interface for implementing + * mailers under the PEAR hierarchy, and provides supporting functions + * useful in multiple mailer backends. + */ +class Mail extends PEAR { + + /** + * Provides an interface for generating Mail:: objects of various + * types + * + * @param string The kind of Mail:: object to instantiate. + * @param array The parameters to pass to the Mail:: object. + * @access public + */ + function factory($mailer_type, $params = array()) + { + $mailer_type = strtolower($mailer_type); + $classfile = PEAR_INSTALL_DIR . '/Mail/' . $mailer_type . '.php'; + if (@is_readable($classfile)) { + include_once $classfile; + $class = 'Mail_' . $mailer_type; + return new $class($params); + } else { + return new PEAR_Error('unable to find classfile: ' . $classfile); + } + } + + /** + * Implements Mail::send() function using php's built-in mail() + * command. + * + * @param mixed Either a comma-seperated list of recipients + * (RFC822 compliant), or an array of recipients, + * each RFC822 valid. This may contain recipients not + * specified in the headers, for Bcc:, resending + * messages, etc. + * + * @param array The array of headers to send with the mail, in an + * associative array, where the array key is the + * header name (ie, 'Subject'), and the array value + * is the header value (ie, 'test'). The header + * produced from those values would be 'Subject: + * test'. + * + * @param string The full text of the message body, including any + * Mime parts, etc. + * + * @return mixed Returns true on success, or a PEAR_Error + * containing a descriptive error message on + * failure. + * @access public + */ + function send($recipients, $headers, $body) + { + // if we're passed an array of recipients, implode it. + if (is_array($recipients)) { + $recipients = implode(', ', $recipients); + } + + // get the Subject out of the headers array so that we can + // pass it as a seperate argument to mail(). + $subject = ''; + if (isset($headers['Subject'])) { + $subject = $headers['Subject']; + unset($headers['Subject']); + } + + // flatten the headers out. + list(,$text_headers) = Mail::prepareHeaders($headers); + + return mail($recipients, $subject, $body, $text_headers); + } + + /** + * Take an array of mail headers and return a string containing + * text usable in sending a message. + * + * @param array The array of headers to prepare, in an associative + * array, where the array key is the header name (ie, + * 'Subject'), and the array value is the header + * value (ie, 'test'). The header produced from those + * values would be 'Subject: test'. + * + * @return mixed Returns false if it encounters a bad address, + * otherwise returns an array containing two + * elements: Any From: address found in the headers, + * and the plain text version of the headers. + * @access protected + */ + function prepareHeaders($headers) + { + // Look out for the From: value to use along the way. + $text_headers = ''; // text representation of headers + $from = null; + + foreach ($headers as $key => $val) { + if ($key == 'From') { + $from_arr = imap_rfc822_parse_adrlist($val, 'localhost'); + $from = $from_arr[0]->mailbox . '@' . $from_arr[0]->host; + if (strstr($from, ' ')) { + // Reject outright envelope From addresses with spaces. + return false; + } + $text_headers .= $key . ': ' . $val . "\n"; + } else { + $text_headers .= $key . ': ' . $val . "\n"; + } + } + + return array($from, $text_headers); + } + + /** + * Take a set of recipients and parse them, returning an array of + * bare addresses (forward paths) that can be passed to sendmail + * or an smtp server with the rcpt to: command. + * + * @param mixed Either a comma-seperated list of recipients + * (RFC822 compliant), or an array of recipients, + * each RFC822 valid. + * + * @return array An array of forward paths (bare addresses). + * @access protected + */ + function parseRecipients($recipients) + { + // if we're passed an array, assume addresses are valid and + // implode them before parsing. + if (is_array($recipients)) { + $recipients = implode(', ', $recipients); + } + + // Parse recipients, leaving out all personal info. This is + // for smtp recipients, etc. All relevant personal information + // should already be in the headers. + $addresses = imap_rfc822_parse_adrlist($recipients, 'localhost'); + $recipients = array(); + if (is_array($addresses)) { + foreach ($addresses as $ob) { + $recipients[] = $ob->mailbox . '@' . $ob->host . ' '; + } + } + + return $recipients; + } + +} +?>