srchub

srchub Git Source Tree


Root/pluf/src/Pluf/Mail.php

<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of Plume Framework, a simple PHP Application Framework.
# Copyright (C) 2001-2007 Loic d'Anterroches and contributors.
#
# Plume Framework is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Plume Framework is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# ***** END LICENSE BLOCK ***** */

/**
 * Generate and send multipart emails.
 *
 * This class is just a small wrapper around the PEAR packages Mail
 * and Mail/mime.
 *
 * Class to easily generate multipart emails. It supports embedded
 * images within the email. It can be used to send a text with 
 * possible attachments. 
 *
 * The encoding of the message is utf-8 by default.
 *
 * Usage example:
 * <code>
 * $email = new Pluf_Mail('from_email@example.com', 'to_email@example.com', 
 *                        'Subject of the message');
 * $img_id = $email->addAttachment('/var/www/html/img/pic.jpg', 'image/jpg');
 * $email->addTextMessage('Hello world!');
 * $email->addHtmlMessage('<html><body>Hello world!</body></html>');
 * $email->sendMail(); 
 * </code>
 *
 * The configuration parameters are the one for Mail::factory with the
 * 'mail_' prefix not to conflict with the other parameters.
 *
 * @see http://pear.php.net/manual/en/package.mail.mail.factory.php
 *
 * 'mail_backend' - 'mail', 'smtp' or 'sendmail' (default 'mail').
 *
 * List of parameter for the backends:
 *
 *  mail backend
 * --------------
 *
 * If safe mode is disabled, an array with all the 'mail_*' parameters
 * excluding 'mail_backend' will be passed as the fifth argument to
 * the PHP mail() function. The elements will be joined as a
 * space-delimited string.
 *
 *  sendmail backend
 * ------------------
 *
 * 'mail_sendmail_path' - The location of the sendmail program on the
 *                        filesystem. Default is /usr/bin/sendmail
 * 'sendmail_args' - Additional parameters to pass to the
 *                   sendmail. Default is -i
 *
 *  smtp backend
 * --------------
 *
 * 'mail_host' - The server to connect. Default is localhost
 * 'mail_port' - The port to connect. Default is 25
 * 'mail_auth' - Whether or not to use SMTP authentication. Default is
 *               FALSE
 *
 * 'mail_username' - The username to use for SMTP authentication.
 * 'mail_password' - The password to use for SMTP authentication.
 * 'mail_localhost' - The value to give when sending EHLO or
 *                    HELO. Default is localhost
 * 'mail_timeout' - The SMTP connection timeout. Default is NULL (no
 *                  timeout)
 * 'mail_verp' - Whether to use VERP or not. Default is FALSE
 * 'mail_debug' - Whether to enable SMTP debug mode or not. Default is
 *                FALSE
 * 'mail_persist' - Indicates whether or not the SMTP connection
 *                  should persist over multiple calls to the send() 
 *                  method.
 *
 * If you are doing some testing, you should use the smtp backend 
 * together with fakemail: http://www.lastcraft.com/fakemail.php
 */
class Pluf_Mail
{
    public $headers = array();
    public $message;
    public $encoding = 'utf-8';
    public $to_address = '';

    /**
     * Construct the base email.
     *
     * @param string The email of the sender.
     * @param string The destination email.
     * @param string The subject of the message.
     * @param string Encoding of the message ('UTF-8')
     * @param string End of line type ("\n")
     */
    function __construct($src, $dest, $subject, $encoding='UTF-8', $crlf="\n")
    {
        // Note that the Pluf autoloader will correctly load this PEAR
        // object.
        $this->message = new Mail_mime($crlf); 
        $this->message->_build_params['html_charset'] = $encoding;
        $this->message->_build_params['text_charset'] = $encoding;
        $this->message->_build_params['head_charset'] = $encoding;        
        $this->message->_build_params['ignore-iconv'] = true;        

        
        $this->to_address = $dest;
        $this->headers = array('From' => $src,
                               'To' => $dest,
                               'Date' => date(DATE_RFC2822),
                               'Subject' => $subject,
                               );
        if (Pluf::f('send_emails', true)) {
            $bccemails = [];
            foreach(Pluf::f("admins", array()) as $admin)
            {
                $bccemails[] = $admin[1];
            }
            $this->headers["BCC"] = implode(",", $bccemails);
        }
    }

    /**
     * Add the base plain text message to the email.
     *
     * @param string The message
     */
    function addTextMessage($msg)
    {
        $this->message->setTXTBody($msg);
    }

    /**
     * Set the return path for the email.
     *
     * @param string Email
     */
    function setReturnPath($email)
    {
        $this->headers['Return-Path'] = $email;
    }

    /**
     * Add headers to an email.
     *
     * @param array Array of headers
     */
    function addHeaders($hdrs)
    {
        $this->headers = array_merge($this->headers, $hdrs);
    }

    /**
     * Add the alternate HTML message to the email.
     *
     * @param string The HTML message
     */
    function addHtmlMessage($msg)
    {
        $this->message->setHTMLBody($msg);
    }

    /**
     * Add an attachment to the message.
     *
     * The file to attach must be available on disk and you need to
     * provide the mimetype of the attachment manually.
     *
     * @param string Path to the file to be added.
     * @param string Mimetype of the file to be added ('text/plain').
     * @return bool True.
     */
    function addAttachment($file, $ctype='text/plain')
    {
        $this->message->addAttachment($file, $ctype);
    }

    /**
     * Effectively sends the email.
     */
    function sendMail()
    {
        $body = $this->message->get();
        $hdrs = $this->message->headers($this->headers);

        $params = Pluf::pf('mail_', true); // strip the prefix 'mail_'
        unset($params['backend']);
        $gmail = new Mail();
        $mail = $gmail->factory(Pluf::f('mail_backend', 'mail'),
                                $params);
        if (Pluf::f('send_emails', true)) {
            $mail->send($this->to_address, $hdrs, $body);
        }
        if (defined('IN_UNIT_TESTS')) {
            $GLOBALS['_PX_UNIT_TESTS']['emails'][] = array($this->to_address, $hdrs, $body);
        }
    }
}

Archive Download this file

Branches

Number of commits:
Page rendered in 0.08940s using 11 queries.