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

Як правильно налаштувати відправку пошти з сайту?

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

Налаштування PHP mail – надсилання пошти скриптом

З метою боротьби зі спам активністю та підробкою відправника, багато хостінгових компаній на даний момент встановлюють обмеження на відправку листів за допомогою функції mail(), що забороняють відправлення листів з поштових скриньок, не створених в обліковому записі і явно не вказаних у функції mail() як відправника, а також не вказані в налаштуваннях PHP для sendmail_path. У зв'язку з цим, при налаштуванні надсилання пошти з сайту необхідно враховувати дані обмеження. Після створення поштової скриньки потрібно вказати його у функції надсилання листів як відправника, а також у налаштуваннях PHP для параметра sendmail_path. Зазвичай значення параметра sendmail_path задається у файлі php.ini або через панель керування хостінгом. Після встановлення значення параметра sendmail_path необхідно перевірити чи застосовалися зміни. Це можна зробити, створивши в кореневій папці сайту файл з розширенням php (для прикладу info.php) і вказавши в даному файлі код:

 <?php phpinfo(); ?>

Потім потрібно відкрити створений файл у браузері, прописавши в адресному рядку браузера URL сайту та шлях до файлу (наприклад http://mysite.com.ua/info.php).

У вікні з'явиться список налаштувань PHP, серед яких буде також параметр sendmail_path:

Якщо у параметрі sendmail_path вказано створену поштову скриньку, налаштування застосовувалися і можна тестувати надсилання листів із сайту. Нижче вказаний робочий скрипт надсилання листів із сайту за допомогою функції mail():

 <?php /* Получатель (Указываем почтовый ящик получателя письма) */ $to = "poluchatel@gmail.com"; /* Тема (Указываем тему письма) */ $subject = "Тема"; /* Тема (Указываем текст письма) */ $message = 'Текст'; /* Заголовки */ $headers= "MIME-Version: 1.0
"; $headers .= "Content-type: text/html; charset=iso-8859-1
"; /* Отправитель (Указываем отправителя письма) */ $headers .= "From: info@mysite.com.ua
"; /* Отправка */ mail($to, $subject, $message, $headers); ?>

Також надсилання листів із сайту можна налаштувати за допомогою SMTP авторизації. У цьому випадку параметри sendmail_path не потрібно виконувати, оскільки всі дані підключення до поштової скриньки, такі як SMTP сервер, порт, поштова скринька та пароль від поштової скриньки, будуть вказані у функції надсилання листів.

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

Код файлу SendMailSmtpClass.php:

 <?php 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 $boundary; public $addFile = false; public $multipart; public function __construct($smtp_username, $smtp_password, $smtp_host, $smtp_port = 25, $smtp_charset = "utf-8") { $this->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_name
"); if(!$this->_parseServer($socket, "250")){ // если сервер не ответил на EHLO, то отправляем HELO fputs($socket, "HELO $server_name
"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: HELO'); } } fputs($socket, "AUTH LOGIN
"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error 1'); } fputs($socket, base64_encode($this->smtp_username) . "
"); if (!$this->_parseServer($socket, "334")) { fclose($socket); throw new Exception('Autorization error 2'); } fputs($socket, base64_encode($this->smtp_password) . "
"); if (!$this->_parseServer($socket, "235")) { fclose($socket); throw new Exception('Autorization error 3'); } fputs($socket, "MAIL FROM: <".$this->smtp_username.">
"); 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}>
"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception('Error of command sending: RCPT TO'); } } fputs($socket, "DATA
"); if (!$this->_parseServer($socket, "354")) { fclose($socket); throw new Exception('Error of command sending: DATA'); } fputs($socket, $contentMail."
.
"); if (!$this->_parseServer($socket, "250")) { fclose($socket); throw new Exception("E-mail didn't sent"); } fputs($socket, "QUIT
"); 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 .= "
--{$this->boundary}
"; $multipart .= "Content-Type: application/octet-stream; name="$filename"
"; $multipart .= "Content-Transfer-Encoding: base64
"; $multipart .= "Content-Disposition: attachment; filename="$filename"
"; $multipart .= "
"; $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") . " UT
"; $contentMail .= 'Subject: =?' . $this->smtp_charset . '?B?' . base64_encode($subject) . "=?=
"; // заголовок письма $headers = "MIME-Version: 1.0
"; // кодировка письма if($this->addFile){ // если есть файлы $headers .= "Content-Type: multipart/mixed; boundary="{$this->boundary}"
"; }else{ $headers .= "Content-type: text/html; charset={$this->smtp_charset}
"; } $headers .= "From: {$smtp_from[0]} <{$smtp_from[1]}>
"; // от кого письмо $headers.= "To: ".$mailTo."
"; $contentMail .= $headers . "
"; if($this->addFile){ // если есть файлы $multipart = "--{$this->boundary}
"; $multipart .= "Content-Type: text/html; charset=utf-8
"; $multipart .= "Content-Transfer-Encoding: base64
"; $multipart .= "
"; $multipart .= chunk_split(base64_encode($message)); // файлы $multipart .= $this->multipart; $multipart .= "
--{$this->boundary}--
"; $contentMail .= $multipart; }else{ $contentMail .= $message ."
"; } // если кодировка windows-1251, то все письмо перекодируем if( strtolower($this->smtp_charset) == "windows-1251" ){ $contentMail = iconv('utf-8', 'windows-1251', $contentMail); } return $contentMail; } } ?>

Код файлу mail.php:

 <?php /* Подключение класса */ require_once "SendMailSmtpClass.php"; /* Подключение к SMTP серверу (Указываем почтовый ящик отправителя, пароль, SMTP сервер, порт и кодировку) */ $mailSMTP = new SendMailSmtpClass('info@mysite.com.ua', 'Password', 'mail.mysite.com.ua ', 25, "UTF-8"); /* Отправитель (Указываем имя отправителя и почтовый ящик отправителя) */ $from = array("Имя отправителя", "info@mysite.com.ua"); /* Отправка (Указываем почтовый ящик получателя, тему письмо и текст письма) */ $result = $mailSMTP->send('poluchatel@gmail.com', 'Тема', 'Текст', $from); ?>

Див. також:

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