From time to time it is handy to be able quickly set special options when sending mails using Zend_Mail, such as automatically adding footer text or toggling between HTML and plaintext mails. In order to satisfy these needs I wrote the following simple abstraction class as a wrapper around Zend_Mail.
/**
* An abstraction class for Zend_Mail.
* @author matthias.kerstner
*/
class Custom_Plugin_Mailer {
/**
* Assembles $mail but does not send it.
* @param array $to
* @param string $subject
* @param string $body
* @param array? $from
* @param bool? $html
* @param bool? $appendSignature
* @param bool? $archive
* @param string? $encoding
* @param Zend_Locale? $locale
* @return bool|Zend_Mail
*/
public static function assemble($to, $subject, $body, $from = null, $html = false, $appendSignature = true, $archive = true, $encoding = 'UTF-8', $locale = null) {
return self::send($to, $subject, $body, $from, $html, $appendSignature, $archive, $encoding, false, $locale);
}
/**
* Sends mail.
* @param array $to [0=email, 1=name]
* @param string $subject
* @param string $body
* @param array? $from [0=email, 1=name]
* @param bool? $html
* @param bool? $appendSignature
* @param bool? $archive
* @param string? $encoding
* @param bool? $sendDirectly
* @param Zend_Locale? $locale
* @param array? $toBCC [0=email, 1=name]
* @return bool|Zend_Mail true on success, false on error, Zend_Mail
* if $sendDirectly is false
*/
public static function send($to, $subject, $body, $from = null, $html = false, $appendSignature = true, $archive = true, $encoding = 'UTF-8', $sendDirectly = true, $locale = null, $toBCC = null) {
$config = Zend_Registry::get('Zend_Config');
$translate = Zend_Registry::get('Zend_Translate');
$_locale = $locale instanceof Zend_Locale ? $locale : Zend_Registry::get('Zend_Locale');
$mail = new Zend_Mail($encoding);
if (APPLICATION_ENV !== 'production') { // DEBUG MODE
$mail->setFrom($config->email->noreply->email, $config->email->noreply->sender);
$mail->addTo($config->email->debug->email, $config->email->debug->sender);
} else { // PRODUCTION MODE
if ($from === null) {
$mail->setFrom($config->email->noreply->email, $config->email->noreply->sender);
} else {
if (is_array($from) && count($from) == 2) {
$mail->setFrom($from[0], $from[1]);
} else {
throw new Exception('Failed to send email');
}
}
if (is_array($to) && count($to) == 2) {
$mail->addTo($to[0], $to[1]);
} else {
throw new Exception('Failed to send email');
}
}
$mail->setSubject($subject);
if ($appendSignature) {
$br = $html ? "<br>" : "\n";
$body .= $br . $br
. $translate->_('DEFAULT.MAIL.SIGNATURE', $_locale);
}
if ($html) {
$mail->setBodyHtml($body);
} else {
$mail->setBodyText($body);
}
if ($archive) {
$mail->addBcc($config->email->archive->email, $config->email->archive->sender);
}
// BCC
if (is_array($toBCC) && count($toBCC) == 2) {
$mailBCC = new Zend_Mail($encoding);
$mailBCC->setFrom($config->email->noreply->email, $config->email->noreply->sender);
$mailBCC->addTo($toBCC[0], $toBCC[1]);
$mailBCC->setSubject("BCC: " . $subject);
if ($html) {
$mailBCC->setBodyHtml("BCC:<br />" . $body);
} else {
$mailBCC->setBodyText("BCC:\n" . $body);
}
$mailBCC->send();
}
if (!$sendDirectly) {
return $mail;
}
try {
if (!$mail->send()) {
throw new Exception('Failed to send mail to "'
. $to[0] . '" with subject "' . $subject . '"');
}
} catch (Exception $e) {
return false;
}
return true;
}
}
