Почему не отправляется письмо на gmail с локального сервера (используя sendmail)

384
12 августа 2017, 04:31

На будущем сайте будет реализована система отправки сообщений на почту пользователей. Пока тестирую на OpenServer.
На почту mail.ru отправляется без проблем. На яндекс-почту тоже. Проблема в том, что на gmail вообще ничего не приходит, хотя, судя по логам sendmail, все прекрасно отправляется. Сообщения отправляю со своего ящика mail.ru с шифрованием SSL

Answer 1

Файл класса

<?php

/** * SendMailSmtpClass * * Класс для отправки писем через SMTP с авторизацией * Может работать через SSL протокол * Тестировалось на почтовых серверах yandex.ru, mail.ru и gmail.com * * @author Ipatov Evgeniy * @version 1.0 */ 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;
}
}

В файле обработки

require_once "SendMailSmtpClass.php";
    $mailSMTP = new SendMailSmtpClass('yourmail@gmail.com', 'password', 'ssl://smtp.gmail.com', 'From', 465);
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: From<yourmail@gmail.com>\r\n";
    $result =  $mailSMTP->send('yourmail@gmail.com', 'Subject', "Text", $headers);
READ ALSO
Как правильно удалять данные с 2-х таблиц?

Как правильно удалять данные с 2-х таблиц?

Есть 2 таблицыProduct(сам продукт) и images(id,хранится product_id и путь к картинке)

264
Не получается вызвать в клиенте метод веб-сервиса

Не получается вызвать в клиенте метод веб-сервиса

Решил попробовать сделать простенький клиент-сервер с использованием SOAP и WSDLВсе делал на локальном сервере, все файлы лежат в корне сайта

311
Как найти переменную экземпляра класса?

Как найти переменную экземпляра класса?

В классе есть нужный мне методНепонятно объект уже создан или надо его мне создать

227
Смена версии php в Ubuntu

Смена версии php в Ubuntu

Привет Нужно поменять версию php с 7 на 56 на Ubuntu

364