За последние 24 часа нас посетили 17068 программистов и 1617 роботов. Сейчас ищет 1151 программист ...

Осуществить отправку писем (SMTP) только при некотором условии

Тема в разделе "Работа с почтой", создана пользователем petyann, 28 мар 2022.

Метки:
  1. petyann

    petyann Активный пользователь

    С нами с:
    8 июл 2015
    Сообщения:
    30
    Симпатии:
    0
    Есть такой вот большущий код для отправки писем по SMTP:

    <?php
    header('Content-Type: text/plain;'); error_reporting(E_ALL ^ E_WARNING); ob_implicit_flush();
    $address = 'localhost'; // адрес smtp-сервера
    $port = 25; // порт (стандартный smtp - 25)
    $login = 'info@site.ru'; // логин к ящику
    $pwd = '1111111'; // пароль к ящику
    $from = 'info@site.ru'; // адрес отправителя
    $to = 'vasyapupkin@mail.ru'; // адрес получателя
    $subject = 'Message subject'; // тема сообщения
    $message1 = 'Message text'; // текст сообщения

    try {

    // Создаем сокет
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket < 0) {
    throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
    }

    // Соединяем сокет к серверу
    echo 'Connect to \''.$address.':'.$port.'\' ... ';
    $result = socket_connect($socket, $address, $port);
    if ($result === false) {
    throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
    } else {
    echo "OK\n";
    }

    // Читаем информацию о сервере
    read_smtp_answer($socket);

    // Приветствуем сервер
    write_smtp_response($socket, 'EHLO '.$address);
    read_smtp_answer($socket); // ответ сервера

    echo 'Authentication ... ';

    // Делаем запрос авторизации
    write_smtp_response($socket, 'AUTH LOGIN');
    read_smtp_answer($socket); // ответ сервера

    // Отравляем логин
    write_smtp_response($socket, base64_encode($login));
    read_smtp_answer($socket); // ответ сервера

    // Отравляем пароль
    write_smtp_response($socket, base64_encode($pwd));
    read_smtp_answer($socket); // ответ сервера

    echo "OK\n";
    echo "Check sender address ... ";

    // Задаем адрес отправителя
    write_smtp_response($socket, 'MAIL FROM:<'.$from.'>');
    read_smtp_answer($socket); // ответ сервера

    echo "OK\n";
    echo "Check recipient address ... ";

    // Задаем адрес получателя
    write_smtp_response($socket, 'RCPT TO:<'.$to.'>');
    read_smtp_answer($socket); // ответ сервера

    echo "OK\n";
    echo "Send message text ... ";

    // Готовим сервер к приему данных
    write_smtp_response($socket, 'DATA');
    read_smtp_answer($socket); // ответ сервера

    // Отправляем данные
    $message = "To: $to\r\n".$message1; // добавляем заголовок сообщения "адрес получателя"
    $message = "Subject: $subject\r\n".$message1; // заголовок "тема сообщения"
    write_smtp_response($socket, $message."\r\n.");
    read_smtp_answer($socket); // ответ сервера

    echo "OK\n";
    echo 'Close connection ... ';

    // Отсоединяемся от сервера
    write_smtp_response($socket, 'QUIT');
    read_smtp_answer($socket); // ответ сервера

    echo "OK\n";

    } // Закончился try

    catch (Exception $e) {
    echo "\nError: ".$e->getMessage();
    }

    if (isset($socket)) {
    socket_close($socket);
    }

    // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки
    function read_smtp_answer($socket) {
    $read = socket_read($socket, 1024);

    if ($read{0} != '2' && $read{0} != '3') {
    if (!empty($read)) {
    throw new Exception('SMTP failed: '.$read."\n");
    } else {
    throw new Exception('Unknown error'."\n");
    }
    }
    }

    // Функция для отправки запроса серверу
    function write_smtp_response($socket, $msg) {
    $msg = $msg."\r\n";
    socket_write($socket, $msg, strlen($msg));
    }
    echo"$address, $port, $login, $pwd, $from, $to, $subject, $message";
    $result = smtp_mail ($address, $port, $login, $pwd, $from, $to, $subject, $message);

    if($result == true){
    echo "Письмо успешно отправлено";
    }else{
    echo "Письмо не отправлено. Ошибка: " . $result;
    }

    $mail = new PHPMailer();
    $mail->IsSMTP();// отсылать используя SMTP
    $mail->Host = "localhost"; // SMTP сервер
    $mail->SMTPAuth = true; // включить SMTP аутентификацию
    $mail->Username = "info@site.ru"; // пропишите Ваш почтовый адрес
    $mail->Password = "1111111"; // введите пароль на указанный ящик
    $mail->From = "info@site.ru"; // укажите от кого письмо
    $mail->FromName = "site"; // имя отправителя
    $mail->AddAddress("vasyapupkin@mail.ru","Vasya Pupkin"); // е-маил кому отправлять и на какое имя
    $mail->WordWrap = 50;// set word wrap
    $mail->IsHTML(true);// отправить в HTML формате
    $mail->Subject = "Подтверждение Регистрации"; // тема письма
    $mail->Body = "$message"; // тело письма в html формате
    $mail->AltBody = "$message"; // тело письма текстовое
    $mail->Send();
    }

    ?>

    В общем, код рабочий, письма отправляются.
    Но мне необходимо осуществлять отправку писем только при некотором условии (допустим, если a=1).
    Но если заключить весь этот код в условие if:
    if (a==1) {
    Тут весь вышеупомянутый код
    }


    То он, почему-то, тормозится на подключении к серверу. Хотя, по логике, всё должно работать. Выдаёт только строку:

    Connect to 'localhost:25' ... OK

    И всё, на этом останавливается.
    Подскажите, что тут может быть не так, в чём загвоздка и как можно задать условие для выполнения данного кода?