-
-
Save pistol88/5c787149251d03133bb0ec95715adc7f to your computer and use it in GitHub Desktop.
SendMailSmtpClass
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SendMailSmtpClass { | |
/** | |
* | |
* @var string $smtp_username - логин | |
* @var string $smtp_password - пароль | |
* @var string $smtp_host - хост | |
* @var string $smtp_from - от кого | |
* @var integer $smtp_port - порт | |
* @var string $smtp_charset - кодировка | |
* | |
*/ | |
public $smtp_username; | |
public $smtp_password; | |
public $smtp_host; | |
public $smtp_from; | |
public $smtp_port; | |
public $smtp_charset; | |
public function __construct($smtp_username, $smtp_password, $smtp_host, $smtp_from, $smtp_port = 25, $smtp_charset = "utf-8") { | |
$this->smtp_username = $smtp_username; | |
$this->smtp_password = $smtp_password; | |
$this->smtp_host = $smtp_host; | |
$this->smtp_from = $smtp_from; | |
$this->smtp_port = $smtp_port; | |
$this->smtp_charset = $smtp_charset; | |
} | |
/** | |
* Отправка письма | |
* | |
* @param string $mailTo - получатель письма | |
* @param string $subject - тема письма | |
* @param string $message - тело письма | |
* @param string $headers - заголовки письма | |
* | |
* @return bool|string В случаи отправки вернет true, иначе текст ошибки * | |
*/ | |
function send($mailTo, $subject, $message, $headers) { | |
$contentMail = "Date: " . date("D, d M Y H:i:s") . " UT\r\n"; | |
$contentMail .= 'Subject: =?' . $this->smtp_charset . '?B?' . base64_encode($subject) . "=?=\r\n"; | |
$contentMail .= $headers . "\r\n"; | |
$contentMail .= $message . "\r\n"; | |
try { | |
if(!$socket = @fsockopen($this->smtp_host, $this->smtp_port, $errorNumber, $errorDescription, 30)){ | |
throw new Exception($errorNumber.".".$errorDescription); | |
} | |
if (!$this->_parseServer($socket, "220")){ | |
throw new Exception('Connection error'); | |
} | |
$server_name = $_SERVER["SERVER_NAME"]; | |
fputs($socket, "HELO $server_name\r\n"); | |
if (!$this->_parseServer($socket, "250")) { | |
fclose($socket); | |
throw new Exception('Error of command sending: HELO'); | |
} | |
fputs($socket, "AUTH LOGIN\r\n"); | |
if (!$this->_parseServer($socket, "334")) { | |
fclose($socket); | |
throw new Exception('Autorization error'); | |
} | |
fputs($socket, base64_encode($this->smtp_username) . "\r\n"); | |
if (!$this->_parseServer($socket, "334")) { | |
fclose($socket); | |
throw new Exception('Autorization error'); | |
} | |
fputs($socket, base64_encode($this->smtp_password) . "\r\n"); | |
if (!$this->_parseServer($socket, "235")) { | |
fclose($socket); | |
throw new Exception('Autorization error'); | |
} | |
fputs($socket, "MAIL FROM: <".$this->smtp_username.">\r\n"); | |
if (!$this->_parseServer($socket, "250")) { | |
fclose($socket); | |
throw new Exception('Error of command sending: MAIL FROM'); | |
} | |
$mailTo = ltrim($mailTo, '<'); | |
$mailTo = rtrim($mailTo, '>'); | |
fputs($socket, "RCPT TO: <" . $mailTo . ">\r\n"); | |
if (!$this->_parseServer($socket, "250")) { | |
fclose($socket); | |
throw new Exception('Error of command sending: RCPT TO'); | |
} | |
fputs($socket, "DATA\r\n"); | |
if (!$this->_parseServer($socket, "354")) { | |
fclose($socket); | |
throw new Exception('Error of command sending: DATA'); | |
} | |
fputs($socket, $contentMail."\r\n.\r\n"); | |
if (!$this->_parseServer($socket, "250")) { | |
fclose($socket); | |
throw new Exception("E-mail didn't sent"); | |
} | |
fputs($socket, "QUIT\r\n"); | |
fclose($socket); | |
} catch (Exception $e) { | |
return $e->getMessage(); | |
} | |
return true; | |
} | |
private function _parseServer($socket, $response) { | |
while (@substr($responseServer, 3, 1) != ' ') { | |
if (!($responseServer = fgets($socket, 256))) { | |
return false; | |
} | |
} | |
if (!(substr($responseServer, 0, 3) == $response)) { | |
return false; | |
} | |
return true; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment