Typesetter/include/tool/Emailer.php
2021-09-08 19:52:21 +02:00

262 lines
5.8 KiB
PHP

<?php
namespace gp\tool{
defined('is_running') or die('Not an entry point...');
includeFile('thirdparty/PHPMailer/PHPMailerAutoload.php');
/**
* An extension of phpmailer
*
* @since 1.7
*
*/
class Emailer extends \PHPMailer{
function __construct(){
global $dataDir,$config;
parent::__construct();
$this->Reset();
$this->PluginDir = $dataDir.'/include/thirdparty/PHPMailer/';
$this->CharSet = 'utf-8';
$this->ContentType = 'text/html';
$mail_method = $this->Mail_Method();
switch($mail_method){
//smtp & smtpauth
case 'smtpauth':
$this->SMTPAuth = true;
$this->Username = \gp\tool::ConfigValue('smtp_user','');
$this->Password = \gp\tool::ConfigValue('smtp_pass','');
case 'smtp';
$this->IsSMTP();
$this->Host = \gp\tool::ConfigValue('smtp_hosts','');
break;
//sendmail
case 'sendmail':
$this->IsSendmail();
$this->Sendmail = $this->Sendmail_Path();
break;
//mail
default:
$this->IsMail();
$this->Mailer = 'mail';
break;
}
}
// Empty out the values that may be set
function Reset(){
$this->ClearAddresses();
$this->ClearAllRecipients();
$this->ClearAttachments();
$this->ClearBCCs();
$this->ClearCCs();
$this->ClearCustomHeaders();
$this->ClearReplyTos();
$this->From = $this->From_Address();
$this->FromName = $this->From_Name();
}
/**
*
* @param string|array $to Array or comma-separated list of email addresses to send message.
* @param string $subject Email subject
* @param string $message Message contents
* @return bool Whether the email contents were sent successfully.
*/
function SendEmail($to,$subject,$message){
//function SendEmail($to,$subject,$message,$headers=array()){
global $config;
// Set destination addresses
foreach( (array)$to as $recipient){
$recipient = $this->SplitNameAddress($recipient);
$this->AddAddress( $recipient['address'], $recipient['name'] );
}
// Set mail's subject and body
$this->Subject = $subject;
$this->Body = $message;
// Send!
$result = @$this->Send();
$this->Reset();
return $result;
}
/**
* Clean and prepare variables before calling \phpMailer::Send();
*
*/
function Send(){
$this->CleanAddresses( 'to' );
$this->CleanAddresses( 'cc' );
$this->CleanAddresses( 'bcc' );
$this->CleanAddresses( 'ReplyTo' );
$this->Subject = $this->CleanSubject( $this->Subject );
$this->Body = $this->CleanText( $this->Body );
$this->AltBody = $this->CleanText( $this->AltBody );
return parent::Send();
}
/**
* Overrides the default from address for the current email. Similar to phpmailer's AddAddress() method
* @param string $address
* @param string $name
* @return void
*/
public function SetFrom($address, $name = '', $auto = 1) {
$this->From = $this->CleanLine( $address );
$this->FromName = $this->CleanLine( $name );
}
function SplitNameAddress($address){
$address_name = '';
if ( strpos($address, '<' ) !== false ) {
$address_name = substr( $address, 0, strpos( $address, '<' ) - 1 );
$address_name = str_replace( '"', '', $address_name );
$address_name = trim( $address_name );
$address = substr( $address, strpos( $address, '<' ) + 1 );
$address = str_replace( '>', '', $address );
$address = trim( $address );
} else {
$address = trim( $address );
}
return array('name'=>$address_name,'address'=>$address);
}
function From_Address(){
global $config;
if( !empty($config['from_address']) ){
return $config['from_address'];
}
$from = ini_get('sendmail_from');
if( !empty($sendmail_from) ){
return $from;
}
$server = \gp\tool::ServerName(true);
if( $server === false ){
$server = 'localhost';
}
$pos = strpos($server,':');
if( $pos > 0 ){
$port = substr($server,$pos+1);
if( is_numeric($port) ){
$server = substr($server,0,$pos);
}
}
return 'AutomatedSender@'.$server;
}
function From_Name(){
return \gp\tool::ConfigValue('from_name','Automated Sender');
}
function Mail_Method(){
return \gp\tool::ConfigValue('mail_method','mail');
}
function Sendmail_Path(){
//get value set in php.ini, remove arguments
$default = ini_get('sendmail_path');
$pos = strpos($default,' ');
if( $pos !== false ){
$default = substr($default,0,$pos);
}
if( empty($default) ){
$default = '/usr/sbin/sendmail';
}
return \gp\tool::ConfigValue('sendmail_path',$default);
}
/**
* Clean all addresses by removing newlines
*
*/
function CleanAddresses($array){
$temp =& $this->$array;
foreach($temp as $i => $name_addr){
$temp[$i][0] = $this->CleanLine( $temp[$i][0] );
$temp[$i][1] = $this->CleanLine( $temp[$i][1] );
}
}
/**
* Cleans multi-line inputs.
* From Joomla
* @param string $value Multi-line string to be cleaned.
* @return string Cleaned multi-line string.
*/
function CleanText($value){
return trim(preg_replace('/(%0A|%0D|\n+|\r+)(content-type:|to:|cc:|bcc:)/i', '', $value));
}
/**
* Cleans single line inputs.
* From Joomla
* @param string $value String to be cleaned.
* @return string Cleaned string.
*/
function CleanLine($value){
return trim(preg_replace('/(%0A|%0D|\n+|\r+)/i', '', $value));
}
/**
* Cleans any injected headers from the subject string.
* From Joomla
* @param string $subject email subject string.
* @return string Cleaned email subject string.
*/
function CleanSubject($subject){
return preg_replace("/((From:|To:|Cc:|Bcc:|Content-type:) ([\S]+))/", "", $subject);
}
}
}
namespace{
class gp_phpmailer extends \gp\tool\Emailer{}
global $gp_mailer;
if( !is_object( $gp_mailer ) || !is_a( $gp_mailer, 'gp_phpmailer' ) ){
$gp_mailer = new gp_phpmailer();
}
}