безкоштовно з міських телефонів України
Київ | 044 392-73-56 |
Харків | 057 728-49-18 |
Дніпро | 056 790-86-00 |
Одеса | 048 734-56-54 |
Львів | 032 229-58-50 |
Миколаїв | 051 270-12-63 |
Полтава | 053 262-53-74 |
Запоріжжя | 061 228-69-91 |
Підміну адреси відправника, на тарифах звичайного хостінгу, заборонено. Відправником потрібно вказувати е-мейл, створений у домені, з якого налаштовуєте відправку
Для того, щоб перевірити роботу вихідної пошти через 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) у браузері, після чого на поштову скриньку одержувача буде відправлено листа.
Див. також:
Як перевірити роботу вихідної пошти через SMTP