mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-08-28 21:46:10 +02:00
115 lines
2.9 KiB
PHP
115 lines
2.9 KiB
PHP
<?php
|
|
require_once 'Zend/Log/Writer/Abstract.php';
|
|
|
|
/**
|
|
* Sends an error message to an email.
|
|
*
|
|
* @see SS_Log for more information on using writers.
|
|
*
|
|
* @package framework
|
|
* @subpackage dev
|
|
*/
|
|
class SS_LogEmailWriter extends Zend_Log_Writer_Abstract {
|
|
|
|
/**
|
|
* @config
|
|
* @var $send_from Email address to send log information from
|
|
*/
|
|
private static $send_from = null;
|
|
|
|
protected $emailAddress;
|
|
|
|
protected $customSmtpServer;
|
|
|
|
public function __construct($emailAddress, $customSmtpServer = false) {
|
|
$this->emailAddress = $emailAddress;
|
|
$this->customSmtpServer = $customSmtpServer;
|
|
}
|
|
|
|
public static function factory($emailAddress, $customSmtpServer = false) {
|
|
return new SS_LogEmailWriter($emailAddress, $customSmtpServer);
|
|
}
|
|
|
|
/**
|
|
* @deprecated 4.0 Use the "SS_LogEmailWriter.send_from" config setting instead
|
|
*/
|
|
public static function set_send_from($address) {
|
|
Deprecation::notice('4.0', 'Use the "SS_LogEmailWriter.send_from" config setting instead');
|
|
Config::inst()->update('SS_LogEmailWriter', 'send_from', $address);
|
|
}
|
|
|
|
/**
|
|
* @deprecated 4.0 Use the "SS_LogEmailWriter.send_from" config setting instead
|
|
*/
|
|
public static function get_send_from() {
|
|
Deprecation::notice('4.0', 'Use the "SS_LogEmailWriter.send_from" config setting instead');
|
|
return Config::inst()->get('SS_LogEmailWriter', 'send_from');
|
|
}
|
|
|
|
/**
|
|
* Send an email to the email address set in
|
|
* this writer.
|
|
*/
|
|
public function _write($event) {
|
|
// If no formatter set up, use the default
|
|
if(!$this->_formatter) {
|
|
$formatter = new SS_LogErrorEmailFormatter();
|
|
$this->setFormatter($formatter);
|
|
}
|
|
|
|
$formattedData = $this->_formatter->format($event);
|
|
$subject = $formattedData['subject'];
|
|
$data = $formattedData['data'];
|
|
if (Email::config()->send_all_emails_from) {
|
|
$from = Email::config()->send_all_emails_from;
|
|
} else {
|
|
$from = Config::inst()->get('SS_LogEmailWriter', 'send_from') ?: Email::config()->admin_email;
|
|
}
|
|
|
|
// override the SMTP server with a custom one if required
|
|
$originalSMTP = ini_get('SMTP');
|
|
if($this->customSmtpServer) ini_set('SMTP', $this->customSmtpServer);
|
|
|
|
// Use plain mail() implementation to avoid complexity of Mailer implementation.
|
|
// Only use built-in mailer when we're in test mode (to allow introspection)
|
|
$mailer = Email::mailer();
|
|
|
|
$headers = "Content-type: text/html";
|
|
if ($from) {
|
|
$headers .= "\nFrom: " . $from;
|
|
}
|
|
|
|
if($mailer instanceof TestMailer) {
|
|
$mailer->sendHTML(
|
|
$this->emailAddress,
|
|
null,
|
|
$subject,
|
|
$data,
|
|
null,
|
|
$headers
|
|
);
|
|
} else {
|
|
// Try it with the -f option first, without if it fails - borrowed from Mailer
|
|
$result = mail(
|
|
$this->emailAddress,
|
|
$subject,
|
|
$data,
|
|
$headers,
|
|
escapeshellarg("-f$from")
|
|
);
|
|
if(!$result) {
|
|
mail(
|
|
$this->emailAddress,
|
|
$subject,
|
|
$data,
|
|
$headers
|
|
);
|
|
}
|
|
}
|
|
|
|
// reset the SMTP server to the original
|
|
if($this->customSmtpServer) ini_set('SMTP', $originalSMTP);
|
|
}
|
|
|
|
}
|