Phpmailer ошибка 405

I’m trying to use PHPMailer to send emails from a contact form. Once submitted, the server doesn’t respond for more than 5 minutes, then results in ERROR 405 Not Allowed - ngnix.

I’m using SMTP Auth from webmaster@mydomain.com, and the SMTP server is located at voyager.websitewelcome.com. I thought, «Could it be because of the cross-domain submission, even though this isn’t AJAX and is all PHP?»

Nope, see answer below:

mail = new PHPMailer;

$mail->isSMTP();
$mail->Host = 'voyager.websitewelcome.com';
$mail->SMTPAuth = true;
$mail->Username = 'webmaster@mydomain.com';
$mail->Password = 'mypassword';
$mail->SMTPSecure = 'tls'; //<---- THIS is the problem
$mail->Port = 465;

$mail->setFrom('webmaster@mydomain', 'My Company Kiosk');
$mail->addAddress('me@mydomain.com', 'My Name');

$mail->isHTML(true);

$mail->Subject = 'New Lead from My Company';
$mail->Body    = '<b>test</b> html'; //$body;
$mail->AltBody = 'test text';


try {
  $mail->send();
  //echo $output;
}
catch (phpmailerException $e) {
  echo $e->errorMessage();
} catch (Exception $e) {
  $e->getMessage();
}

asked Feb 1, 2016 at 6:32

Dexter's user avatar

DexterDexter

7952 gold badges12 silver badges27 bronze badges

It’s not that the server doesn’t allow TLS, it’s that you’re trying to use explicit SSL (SMTP+STARTTLS == 'tls' in PHPMailer) on a port expecting implicit SSL (SMTPS). You could also have fixed it (in a way not deprecated since 1998) by setting $mail->Port = 587;, which is what the documentation suggests (look under «using encryption»).

Incidentally your error trapping will not work because PHPMailer does not throw exceptions by default, you need to pass true to the constructor to enable them, like this:

$mail = new PHPMailer(true);

answered Feb 1, 2016 at 7:33

Synchro's user avatar

SynchroSynchro

35.1k15 gold badges81 silver badges103 bronze badges

1

In the middle of writing this question, «TLS» caught my eye. I never thought to change this, and my SMTP server does not allow TLS!

I’ve read through so many posts trying to figure this out. I thought someone ought to post a possible answer!

$mail->SMTPSecure = 'ssl';

answered Feb 1, 2016 at 6:32

Dexter's user avatar

DexterDexter

7952 gold badges12 silver badges27 bronze badges

Я пытаюсь использовать PHPMailer для отправки писем из контактной формы. После отправки сервер не отвечает более 5 минут, после чего ERROR 405 Not Allowed - ngnix,

Я использую аутентификацию SMTP от webmaster@mydomain.com, а SMTP-сервер находится по адресу voyager.websitewelcome.com. Я подумал: «Может ли это быть из-за междоменной регистрации, хотя это не AJAX и все это PHP?»

Нет, см. Ответ ниже:

mail = new PHPMailer;

$mail->isSMTP();
$mail->Host = 'voyager.websitewelcome.com';
$mail->SMTPAuth = true;
$mail->Username = 'webmaster@mydomain.com';
$mail->Password = 'mypassword';
$mail->SMTPSecure = 'tls'; //<---- THIS is the problem
$mail->Port = 465;

$mail->setFrom('webmaster@mydomain', 'My Company Kiosk');
$mail->addAddress('me@mydomain.com', 'My Name');

$mail->isHTML(true);

$mail->Subject = 'New Lead from My Company';
$mail->Body    = '<b>test</b> html'; //$body;
$mail->AltBody = 'test text';try {
$mail->send();
//echo $output;
}
catch (phpmailerException $e) {
echo $e->errorMessage();
} catch (Exception $e) {
$e->getMessage();
}

1

Решение

Дело не в том, что сервер не поддерживает TLS, а в том, что вы пытаетесь использовать явный SSL (SMTP+STARTTLS == 'tls' в PHPMailer) на порт, ожидающий неявный SSL (SMTPS). Вы также можете исправить это (не осуждая с 1998 года), установив $mail->Port = 587;, который является то, что документация предлагает (смотрите в разделе «Использование шифрования»).

Кстати, ваш перехват ошибок не будет работать, потому что PHPMailer не генерирует исключения по умолчанию, вам нужно передать true в конструктор, чтобы включить их, как это:

$mail = new PHPMailer(true);

2

Другие решения

В середине написания этого вопроса, «TLS» попался на глаза. Я никогда не думал об этом, и мой SMTP-сервер не поддерживает TLS!

Я прочитал так много постов, пытаясь понять это. Я думал, что кто-то должен опубликовать возможный ответ!

$mail->SMTPSecure = 'ssl';

0

I am facing the persistent “405 Method Not Allowed”» on a MVC PHPMailer within an environment.

I spent more than 10 hours, trying to fix the bug. I have been searching this case at Stack Overflow, but no luck. I assumed it was some PHPMailer config in the files Mail.php and .env, but all the config are correct. It also can the other files App/routes.php or public/index.php.

  • root/composer.json:
{
    "name": "lucas/simple-mvc",
    "authors": [
        {
            "name": "Lucas Ayabe",
            "email": "lucas.akira@gmail.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "App\": "App/",
            "Core\": "Core/"
        },
        "files": [
            "App/Helpers/view.php",
            "App/Helpers/partial.php"
        ]
    },
    "require": {
        "nikic/fast-route": "^1.3",
        "vlucas/phpdotenv": "^5.2",
        "phpmailer/phpmailer": "^6.1",
        "league/oauth2-google": "^3.0",
        "psr/log": "^1.1"
    }
}
  • root/.env:
MAIL_HOST="br726.hostgator.com.br"
MAIL_PORT=465
MAIL_USER="sacc@thproducoes.com"
MAIL_PASSWORD="mypassword"
MAIL_FROM_NAME="Thiago Silva"
MAIL_FROM_EMAIL="sacc@thproducoes.com"
  • root/App/Helpers/Mail.php:
<?php
namespace AppHelpers;

use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
use Exception;
use stdClass;

class Mail
{
    private PHPMailer $mail;
    private stdClass $data;
    private Exception $error;

    public function __construct(string $lang = "br")
    {
        $this->mail = new PHPMailer(true);
        $this->data = new stdClass();
        
        $this->mail->isSMTP();
        $this->mail->SMTPAuth = true;
        $this->mail->Host = $_ENV["MAIL_HOST"];
        $this->mail->Port = $_ENV["MAIL_PORT"];
        $this->mail->SMTPSecure = "ssl";
        $this->mail->Username = $_ENV['MAIL_USER'];
        $this->mail->Password = $_ENV['MAIL_PASSWORD'];

        $this->mail->isHTML(true);
        $this->mail->CharSet = "utf-8";
        $this->mail->setLanguage($lang);
    }

    public function add(
        string $subject,
        string $body,
        string $recipientName,
        string $recipientEmail
    ): self 
    {
        $this->data->subject = $subject;
        $this->data->body = $body;
        $this->data->recipientName = $recipientName;
        $this->data->recipientEmail = $recipientEmail;

        return $this;
    }

    public function attach(string $path, string $filename): self
    {
        $this->data->attach[$path] = $filename;
        return $this;
    }

    public function send(string $fromName = "", string $fromEmail = ""): bool
    {
        $fromName = $fromName !== "" ? $fromName : $_ENV['MAIL_FROM_NAME'];
        $fromEmail = $fromEmail !== "" ? $fromEmail : $_ENV['MAIL_FROM_EMAIL'];

        try {
            $this->mail->Subject = $this->data->subject;
            $this->mail->msgHTML($this->data->body);
            $this->mail->addAddress("sac@thproducoes.com");
            $this->mail->addAddress($this->data->recipientEmail, $this->data->recipientName);

            $this->mail->setFrom($fromEmail, $fromName);

            if (!empty($this->data->attach)) 
            {
                foreach ($this->data->attach as $path => $name) 
                {
                    $this->mail->addAttachment($path, $name);
                }
            }

            $this->mail->send();
            return true;
        } 
        
        catch (Exception $exception) 
        {
            $this->error = $exception;
            return false;
        }
    }

    public function getError(): ?Exception
    {
        return $this->error;
    }
}
  • root/App/Views/mail.php:
<?= partial("templates/header.php") ?>
<form action="mail" method="post">
    <div>
        <label for="email">E-mail</label>
        <input type="email" name="email" id="email">
    </div>

    <div>
        <label for="message">Mensagem</label>
        <textarea name="message" id="message"></textarea>
    </div>

    <button>Enviar</button>
</form>
<?= partial("templates/footer.php")
?>
  • root/App/routes.php:
<?php
namespace Sourceroutes;

use AppControllersMailController;
use AppControllersPagesController;
use FastRouteRouteCollector;

return function (RouteCollector $routes) 
{
        $routes->get('/', [PagesController::class => "index"]);
        $routes->get('/mail', [MailController::class => "index"]);
        $routes->get('/send', [MailController::class => "send"]);
};
  • root/Core/App.php:
<?php
namespace Core;

use FastRouteDispatcher as Dispatcher;

class App
{
    private Dispatcher $dispatcher;

    public function __construct(Dispatcher $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    public function run()
    {
        // Fetch method and URI from somewhere
        $httpMethod = $_SERVER['REQUEST_METHOD'];
        $uri = $_SERVER["REQUEST_URI"];

        $routeInfo = $this->dispatcher->dispatch($httpMethod, $uri);

        switch ($routeInfo[0]) {
            case Dispatcher::NOT_FOUND:
                echo 'NOT FOUND';
                break;
            case Dispatcher::METHOD_NOT_ALLOWED:
                $allowedMethods = $routeInfo[1];
                echo '405 Method Not Allowed';
                break;
            case Dispatcher::FOUND:
                $controller = array_key_first($routeInfo[1]);
                $action = end($routeInfo[1]);

                (new $controller())->$action($routeInfo[2]);
                break;
            default:
                break;
        }
    }
}
  • root/Core/Controller.php:
<?php
namespace Core;

abstract class Controller
{
    public function redirect(string $route)
    {
        header("Location: {$_ENV['BASE_URL']}/$route");
        exit();
    }
}
  • root/Core/View.php:
<?php
namespace Core;

class View
{
    private array $vars = [];
    private const FORBIDDEN_VAR = "viewTemplaFile";

    public function __get($name)
    {
        return $this->vars[$name];
    }

    public function __set($name, $value)
    {
        if ($name === self::FORBIDDEN_VAR) {
            throw new Exception(
                "Cannot bind variable named '" . self::FORBIDDEN_VAR . "'"
            );
        }

        $this->vars[$name] = $value;
    }

    public function load(string $viewTemplateFile)
    {
        if (array_key_exists(self::FORBIDDEN_VAR, $this->vars)) {
            throw new Exception(
                "Cannot bind variable named '" . self::FORBIDDEN_VAR . "'"
            );
        }

        extract($this->vars);
        ob_start();
        include __DIR__ . "/../App/Views/$viewTemplateFile";
        return ob_get_clean();
    }

    public function render(string $viewTemplateFile)
    {
        echo $this->load($viewTemplateFile);
    }
}
  • root/public/index.php:
<?php
use CoreApp;

require_once __DIR__ . '/../vendor/autoload.php';

$dotenv = DotenvDotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();

$routes = require __DIR__ . "/../App/routes.php";

$app = new App(FastRoutesimpleDispatcher($routes));
$app->run();

And .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php?path=$1 [QSA,L]

Я пытаюсь использовать PHPMailer для отправки писем из контактной формы. После отправки сервер не отвечает более 5 минут, а затем приводит к ERROR 405 Not Allowed - ngnix.

Я использую SMTP Auth из [email protected], а SMTP-сервер находится по адресу voyager.websitewelcome.com. Я подумал: «Может быть, из-за перекрестного подчинения, хотя это не AJAX и все PHP?»

Нет, см. Ответ ниже:

mail = new PHPMailer;

$mail->isSMTP();
$mail->Host = 'voyager.websitewelcome.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'mypassword';
$mail->SMTPSecure = 'tls'; //<---- THIS is the problem
$mail->Port = 465;

$mail->setFrom('[email protected]', 'My Company Kiosk');
$mail->addAddress('[email protected]', 'My Name');

$mail->isHTML(true);

$mail->Subject = 'New Lead from My Company';
$mail->Body    = '<b>test</b> html'; //$body;
$mail->AltBody = 'test text';


try {
  $mail->send();
  //echo $output;
}
catch (phpmailerException $e) {
  echo $e->errorMessage();
} catch (Exception $e) {
  $e->getMessage();
}

01 фев. 2016, в 08:23

Поделиться

Источник

2 ответа

Это не значит, что сервер не разрешает TLS, он пытается использовать явный SSL (SMTP+STARTTLS == 'tls' в PHPMailer) на порту, ожидающем неявного SSL (SMTPS). Вы также могли бы зафиксировать его (таким образом, чтобы он не устарел с 1998 года), установив $mail->Port = 587; , что и предлагает документация (см. раздел «Использование шифрования»).

Кстати, ваша ловушка ошибок не будет работать, потому что PHPMailer не генерирует исключения по умолчанию, вам нужно передать true конструктору, чтобы включить их, например:

$mail = new PHPMailer(true);

Synchro
01 фев. 2016, в 05:46

Поделиться

В середине написания этого вопроса «TLS» привлек мое внимание. Я никогда не думал изменить это, и мой SMTP-сервер не разрешает TLS!

Я прочитал так много сообщений, пытаясь понять это. Я думал, что кто-то должен опубликовать возможный ответ!

$mail->SMTPSecure = 'ssl';

Dexter
01 фев. 2016, в 05:31

Поделиться

Ещё вопросы

  • 1Проблема с WebView на сайте Youtube в Android?
  • 1Какой массив / объект коллекции наиболее эффективен для функции «содержит»?
  • 0Может получить доступ к Joomla через IP, но не через домен (Внимание: ошибка require_once)
  • 1Горячая клавиша для закрытия блока кода с помощью фигурных скобок в Eclipse
  • 0Показать / скрыть без использования CSS
  • 0Почему HTML 5 Canvas не рисует содержимое изображения?
  • 1Обработка полиморфизма с помощью DataContractSerializer
  • 1Счетчик кликов мыши tkinter не выйдет из моего цикла обратного отсчета
  • 0Как очистить список, если ответ ложный
  • 0как получить значение атрибута свойства ‘width’
  • 0Combobox не применяется в поле выбора
  • 0Набор символов Liquibase MySQL для изменения таблицы
  • 0Событие FocusChanged в платформе Firebreath
  • 1Реализация гибридного шифрования?
  • 1как получить значения строки, когда флажок установлен в gridview
  • 1Java: удаление компонента Runnable Canvas
  • 1Увеличение идентификатора в корзине покупок
  • 1C # заблокирован функционирует как механизм блокировки?
  • 0PHPStorm «Доступ к членам класса при создании экземпляра» phpDoc
  • 1Сбой приложения после активности в фоновом режиме
  • 1ASP.NET не может выполнить операцию над файлом, поскольку он используется другим процессом?
  • 0Гиперссылки в TextBox / ListBox ASP.NET
  • 0Разница между SELECT COUNT (*) и SELECT true при поиске конкретной строки в таблице миллиардов строк
  • 1Найти в Хроме работает зажигание или коленвал
  • 0Сортировать массив по указанным идентификаторам?
  • 0Показать данные, которых нет в другой таблице, с кодом codeigniter соединения
  • 0Специальная функция в сообщении об ошибке
  • 0Неправильная фильтрация списка, созданного с помощью ng-repeat (AngularJS)
  • 1Синтаксис JPQL LIKE со строками
  • 1Я имею IllegalArgumentException в моем бобе
  • 1Проблема с анимацией Java Swing
  • 0Добавить или удалить класс Css, когда входное значение равно нулю или не равно нулю
  • 0Проблемы создания матриц из пользовательского ввода в C ++
  • 0Как установить приоритет для таблиц?
  • 0Сравнение двух массивов объектов с использованием AngularJS
  • 0Руководство Angular.js по запуску теста e2e с использованием транспортира
  • 0Каталоги поиска из исходников кода
  • 0Извлечение SEO URL с использованием pre_mattch_all
  • 0Мышление по-угловому
  • 0Использование углового сервиса внутри друг друга
  • 1Как получить имя кластера Cassandra, используя драйвер Python?
  • 1Как программно изменить изображение-макет пользовательского предпочтения?
  • 0MySQL не запускается в панели управления Xampp в Windows 8.1
  • 0OpenGL шейдер направленного света зеркальное отражение увеличивается с расстоянием
  • 0mysqldump ошибка 1728 при автоматическом выполнении резервного копирования
  • 0PHP — Explode / substr / Filename
  • 1Создание линии с помощью кнопок TicTacToe
  • 0Создать массив из файла CSV, выбранного по типу файла ввода
  • 1Графический интерфейс Java, отображающий предыдущее окно
  • 1Меню Eclipse RCP

Сообщество Overcoder

Вот не было особо проблем, понадобилась форма с отправкой данных на почту и проблемы сразу появились.
Вот такой код у меня, в чем ошибка?

const formTest = () => fetch('form.php', {
  method: 'POST',
  body: JSON.stringify({
    email: 'email@email.ru',
    text: 'test'
  })
})

<?php

use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->IsHTML(true);

$mail->setFrom('test@yandex.ru', 'GGG');
$mail->addAddress('ccc@yandex.ru');
$mail->Subject = 'TTT';

$body = '<h1>bffbvdvbhbfv</h1>';

$body = $_POST['email'];
$body = $_POST['text'];

$mail->Body = $body;
if(!$mail->send()) {
  $message = 'ooooo';
} else {
  $message = 'qqqqq';
}
$response = ['message' => $message];
header('Content-type: application/json');
echo json_encode($response);
?>

6054d1bb6a4c0477031733.png

Понравилась статья? Поделить с друзьями:
  • Php показывать только ошибки
  • Php показывать ошибки display errors
  • Php показывать все ошибки и предупреждения
  • Php показать ошибку
  • Php подавление вывода ошибок