Введіть ім'я домену:
.ua .com.ua .in.ua .org.ua
.ru .com .net .org
Показати всі домени

Як перевірити роботу вихідної пошти через SMTP

Відповіді на запитання від компанії "Український хостинг".

Перевірка роботи вихідної пошти через SMTP


Підміну адреси відправника, на тарифах звичайного хостінгу, заборонено. Відправником потрібно вказувати е-мейл, створений у домені, з якого налаштовуєте відправку


Для того, щоб перевірити роботу вихідної пошти через SMTP, необхідно в кореневій папці сайту створити файл SendMailSmtpClass.php, в якому розмістити наступний скрипт без будь-яких виправлень:

 smtp_username = $smtp_username; $this->smtp_password = $smtp_password; $this->smtp_host = $smtp_host; $this->smtp_port = $smtp_port; $this->smtp_charset = $smtp_charset; // разделитель файлов $this->boundary = "--".md5(uniqid(time())); $this->multipart = ""; } /** * Отправка письма * * @param string $mailTo - получатель письма * @param string $subject - тема письма * @param string $message - тело письма * @param string $smtp_from - отправитель. Массив с именем и e-mail * * @return bool|string В случаи отправки вернет true, иначе текст ошибки * */ function send($mailTo, $subject, $message, $smtp_from) { // подготовка содержимого письма к отправке $contentMail = $this->getContentMail($subject, $message, $smtp_from,$mailTo); 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, "EHLO $server_namern"); if(!$this->_parseServer($socket, "250")){ // если сервер не ответил на EHLO, то отправляем HELO fputs($socket, "HELO $server_namern"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: HELO'); } } fputs($socket, "AUTH LOGINrn"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error 1'); } fputs($socket, base64_encode($this->smtp_username) . "rn"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error 2'); } fputs($socket, base64_encode($this->smtp_password) . "rn"); if (!$this->_parseServer($socket, "235")) { fclose($socket); throw new Exception('Autorization error 3'); } fputs($socket, "MAIL FROM: <".$this->smtp_username.">rn"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: MAIL FROM'); } $mailTo = str_replace(" ", "", $mailTo); $emails_to_array = explode(',', $mailTo); foreach($emails_to_array as $email) { fputs($socket, "RCPT TO: <{$mailTo}>rn"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: RCPT TO'); } } fputs($socket, "DATArn"); if (!$this->_parseServer($socket, "354")) { fclose($socket); throw new Exception('Error of command sending: DATA'); } fputs($socket, $contentMail."rn.rn"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception("E-mail didn't sent"); } fputs($socket, "QUITrn"); fclose($socket); } catch (Exception $e) { return $e->getMessage(); } return true; } // добавление файла в письмо public function addFile($path){ $file = @fopen($path, "rb"); if(!$file) { throw new Exception("File `{$path}` didn't open"); } $data = fread($file, filesize( $path ) ); fclose($file); $filename = basename($path); $multipart .= "rn--{$this->boundary}rn"; $multipart .= "Content-Type: application/octet-stream; name="$filename"rn"; $multipart .= "Content-Transfer-Encoding: base64rn"; $multipart .= "Content-Disposition: attachment; filename="$filename"rn"; $multipart .= "rn"; $multipart .= chunk_split(base64_encode($data)); $this->multipart .= $multipart; $this->addFile = 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; } // подготовка содержимого письма private function getContentMail($subject, $message, $smtp_from,$mailTo){ // если кодировка windows-1251, то перекодируем тему if( strtolower($this->smtp_charset) == "windows-1251" ){ $subject = iconv('utf-8', 'windows-1251', $subject); } $contentMail = "Date: " . date("D, d MYH:i:s") . " UTrn"; $contentMail .= 'Subject: =?' . $this->smtp_charset . '?B?' . base64_encode($subject) . "=?=rn"; // заголовок письма $headers = "MIME-Version: 1.0rn"; // кодировка письма if($this->addFile){ // если есть файлы $headers .= "Content-Type: multipart/mixed; boundary="{$this->boundary}"rn"; }else{ $headers .= "Content-type: text/html; charset={$this->smtp_charset}rn"; } $headers .= "From: {$smtp_from[0]} <{$smtp_from[1]}>rn"; // от кого письмо $headers.= "To: ".$mailTo."rn"; $contentMail .= $headers . "rn"; if($this->addFile){ // если есть файлы $multipart = "--{$this->boundary}rn"; $multipart .= "Content-Type: text/html; charset=utf-8rn"; $multipart .= "Content-Transfer-Encoding: base64rn"; $multipart .= "rn"; $multipart .= chunk_split(base64_encode($message)); // файлы $multipart .= $this->multipart; $multipart .= "rn--{$this->boundary}--rn"; $contentMail .= $multipart; }else{ $contentMail .= $message ."rn"; } // если кодировка windows-1251, то все письмо перекодируем if( strtolower($this->smtp_charset) == "windows-1251" ){ $contentMail = iconv('utf-8', 'windows-1251', $contentMail); } return $contentMail; } } ?>  smtp_username = $smtp_username; $this->smtp_password = $smtp_password; $this->smtp_host = $smtp_host; $this->smtp_port = $smtp_port; $this->smtp_charset = $smtp_charset; // разделитель файлов $this->boundary = "--".md5(uniqid(time())); $this->multipart = ""; } /** * Отправка письма * * @param string $mailTo - получатель письма * @param string $subject - тема письма * @param string $message - тело письма * @param string $smtp_from - отправитель. Массив с именем и e-mail * * @return bool|string В случаи отправки вернет true, иначе текст ошибки * */ function send($mailTo, $subject, $message, $smtp_from) { // подготовка содержимого письма к отправке $contentMail = $this->getContentMail($subject, $message, $smtp_from,$mailTo); 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, "EHLO $server_namern"); if(!$this->_parseServer($socket, "250")){ // если сервер не ответил на EHLO, то отправляем HELO fputs($socket, "HELO $server_namern"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: HELO'); } } fputs($socket, "AUTH LOGINrn"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error 1'); } fputs($socket, base64_encode($this->smtp_username) . "rn"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error 2'); } fputs($socket, base64_encode($this->smtp_password) . "rn"); if (!$this->_parseServer($socket, "235")) { fclose($socket); throw new Exception('Autorization error 3'); } fputs($socket, "MAIL FROM: <".$this->smtp_username.">rn"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: MAIL FROM'); } $mailTo = str_replace(" ", "", $mailTo); $emails_to_array = explode(',', $mailTo); foreach($emails_to_array as $email) { fputs($socket, "RCPT TO: <{$mailTo}>rn"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: RCPT TO'); } } fputs($socket, "DATArn"); if (!$this->_parseServer($socket, "354")) { fclose($socket); throw new Exception('Error of command sending: DATA'); } fputs($socket, $contentMail."rn.rn"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception("E-mail didn't sent"); } fputs($socket, "QUITrn"); fclose($socket); } catch (Exception $e) { return $e->getMessage(); } return true; } // добавление файла в письмо public function addFile($path){ $file = @fopen($path, "rb"); if(!$file) { throw new Exception("File `{$path}` didn't open"); } $data = fread($file, filesize( $path ) ); fclose($file); $filename = basename($path); $multipart .= "rn--{$this->boundary}rn"; $multipart .= "Content-Type: application/octet-stream; name="$filename"rn"; $multipart .= "Content-Transfer-Encoding: base64rn"; $multipart .= "Content-Disposition: attachment; filename="$filename"rn"; $multipart .= "rn"; $multipart .= chunk_split(base64_encode($data)); $this->multipart .= $multipart; $this->addFile = 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; } // подготовка содержимого письма private function getContentMail($subject, $message, $smtp_from,$mailTo){ // если кодировка windows-1251, то перекодируем тему if( strtolower($this->smtp_charset) == "windows-1251" ){ $subject = iconv('utf-8', 'windows-1251', $subject); } $contentMail = "Date: " . date("D, d MYH:i:s") . " UTrn"; $contentMail .= 'Subject: =?' . $this->smtp_charset . '?B?' . base64_encode($subject) . "=?=rn"; // заголовок письма $headers = "MIME-Version: 1.0rn"; // кодировка письма if($this->addFile){ // если есть файлы $headers .= "Content-Type: multipart/mixed; boundary="{$this->boundary}"rn"; }else{ $headers .= "Content-type: text/html; charset={$this->smtp_charset}rn"; } $headers .= "From: {$smtp_from[0]} <{$smtp_from[1]}>rn"; // от кого письмо $headers.= "To: ".$mailTo."rn"; $contentMail .= $headers . "rn"; if($this->addFile){ // если есть файлы $multipart = "--{$this->boundary}rn"; $multipart .= "Content-Type: text/html; charset=utf-8rn"; $multipart .= "Content-Transfer-Encoding: base64rn"; $multipart .= "rn"; $multipart .= chunk_split(base64_encode($message)); // файлы $multipart .= $this->multipart; $multipart .= "rn--{$this->boundary}--rn"; $contentMail .= $multipart; }else{ $contentMail .= $message ."rn"; } // если кодировка windows-1251, то все письмо перекодируем if( strtolower($this->smtp_charset) == "windows-1251" ){ $contentMail = iconv('utf-8', 'windows-1251', $contentMail); } return $contentMail; } } ?>

Після цих дій необхідно в кореневій папці сайту створити ще один файл з розширенням php (наприклад, mail.php), в якому розмістити вказаний нижче скрипт, вказавши в ньому власні налаштування:

 send('poluchatel@gmail.com', 'Тема', 'Текст', $from); ?>  send('poluchatel@gmail.com', 'Тема', 'Текст', $from); ?>

У цьому скрипті необхідно змінити відправника (поштову скриньку відправника, пароль, SMTP сервер, порт), поштову скриньку одержувача, а також тему та текст листа.

Після внесення змін та їх збереження необхідно запустити скрипт (в даному випадку mail.php) у браузері, після чого на поштову скриньку одержувача буде відправлено листа.

Див. також:

Будь ласка, виберіть мову сайту за промовчанням: