Простой но полезный класс для отправки писем с вложениями на php.
Php class для отправки писем через SMTP используя phpmailer
21.02.2019
Для работы нужно проинсталировать phpmailer
composer require phpmailer/phpmailer
Пример вызова:
index.php (Download)
<?php error_reporting(E_ALL); ini_set('display_errors', 'On'); require_once('vendor/autoload.php'); require_once ('mailer.php'); $oMailer = new \SOLib\mailer\mailer([ 'SMTPDebug' => 1, 'SMTPSecure' => 'ssl', // tls 'Host' => 'smtp.yandex.ru', 'Port' => 465, // 587 'Username' => 'no@oddler.ru', 'Password' => 'PASS', 'CharSet' => 'UTF-8' ]); $bRet = $oMailer->send('oddler@oddler.ru,test@oddler.ru', 'My ТЕСТ 1', '<h1>Тест!</h1><p>123</p>', [ 'attachments' => [ __DIR__.'/media/Doc.docx', __DIR__.'/media/Тест2.docx' ] ] ); if ($bRet){ echo 'Ok'; } else { echo $oMailer->printDebugOutput(); } echo "\n\r<br />"; var_dump($bRet);
Код класса:
mailer.php (Download)
<?php namespace SOLib\mailer; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; class mailer { /** * Config * * @var array */ protected $_aConfig = []; /** * Debug message buffer * * @var array */ protected $_aDebugOutput = []; /** * Log File * * @var string */ protected $_sLogFile = 'log.txt'; /** * mailer constructor. * @param array $aConfig */ public function __construct($aConfig){ $this->_aConfig = $aConfig; } /** * Return data from config * * @param string $key * @param mixed $default * @return mixed */ protected function _configGet($key, $default){ return isset($this->_aConfig[$key])?$this->_aConfig[$key]:$default; } /** * Adds debug information to the buffer. * @param string $str * @param int $level */ protected function _addDebugOutput($str, $level){ $this->_aDebugOutput[] = $level.': '.$str; } /** * Returns an error messages. * * @return array */ public function getDebugOutput(){ return $this->_aDebugOutput; } /** * Generates output error message. * @return string */ public function printDebugOutput(){ $sBR = PHP_SAPI == 'cli'?"\n\r":'<br />'; $sRet = '<pre>'; if (count($this->_aDebugOutput)){ foreach ($this->_aDebugOutput as $sLine){ $sRet .= htmlspecialchars($sLine).$sBR; } } else { $sRet .= '-'; } return $sRet.'</pre>'; } /** * Add text 2 log * @param string $sText * * @return void */ protected function _add2Log($sText) { $sFile = $this->_sLogFile; $sDate = date('Y/m/d h:i:s'); $sRet = file_get_contents($sFile) ."\r\n----------\r\n". $sDate.' '.$sText; file_put_contents($sFile, $sRet); } /** * Sends email messages * * @param string $sEmails * @param string$sSubject * @param string $sBody * @param array $aOptions * * @return bool */ public function send($sEmails, $sSubject, $sBody, $aOptions = []){ $mail = new PHPMailer(); try { $mail->IsSMTP(); $mail->SMTPAuth = true; $mail->SMTPKeepAlive = true; $mail->SMTPDebug = $this->_configGet('SMTPDebug', 1); $mail->SMTPSecure = $this->_configGet('SMTPSecure', 'ssl'); $mail->Host = $this->_configGet('Host', 'smtp.yandex.ru'); $mail->Port = $this->_configGet('Port', 465); $mail->Username = $this->_configGet('Username', ''); $mail->Password = $this->_configGet('Password', ''); $mail->CharSet = $this->_configGet('CharSet', 'UTF-8'); // 'Windows-1251' $mail->Debugoutput = function($str, $level) { $this->_addDebugOutput($str, $level); }; $mail->SetFrom($this->_configGet('SetFrom', $mail->Username)); $aEmails = explode(',', $sEmails); foreach($aEmails as $sEmail) { $mail->AddAddress(trim($sEmail)); } if (isset($aOptions['attachments'])){ if(is_array($aOptions['attachments'])) { foreach($aOptions['attachments'] as $fname) { $mail->AddAttachment($fname); } } else { $mail->AddAttachment($aOptions['attachments']); } } $mail->Subject = $sSubject; $mail->MsgHTML($sBody); if(!$mail->Send()) { $bRet = FALSE; } else { $bRet = TRUE; } $mail->ClearAddresses(); $mail->ClearAttachments(); return $bRet; } catch (Exception $e) { die('Message could not be sent. Mailer Error: '. $mail->ErrorInfo); } } }