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

Я пытаюсь отправить электронное письмо со следующей функцией в качестве тестовой функции:

function SendEmail($to, $subject, $body, $headers)
{
    ini_set("SMTP", "smtp.myexistingdomain.com");
    mail($to, $subject, $body, $headers);
}

и я получаю эту ошибку:

Предупреждение: mail() [function.mail]: не удалось подключиться к почтовому серверу через порт 25 "smtp.myexistingdomain.com", проверьте настройки "SMTP" и "smtp_port" в php.ini или используйте ini_set()


person james    schedule 25.07.2011    source источник
comment
это ваш реальный код? или вы используете другой сервер для отправки почты.   -  person rabudde    schedule 25.07.2011
comment
Слишком частое обращение к этой функции (например, при массовой рассылке) может вызвать эту ошибку. Сервер провайдера отказывается от соединения.   -  person François Breton    schedule 12.02.2013


Ответы (3)


PHP не реализует протокол SMTP. PHP mail() - оборачивает бинарный файл sendmail. Отлично работает на юникс/линукс. Но в Windows (из руководства PHP.net):

Реализация mail() в Windows во многом отличается от реализации в Unix. Во-первых, он не использует локальный двоичный файл для составления сообщений, а работает только с прямыми сокетами, что означает, что MTA необходим для прослушивания сетевого сокета (который может быть как на локальном хосте, так и на удаленной машине).

Итак - мораль истории - вам нужно установить почтовый сервер.

Если вы предпочитаете отправлять электронные письма без установки собственного почтового сервера (что может быть проблемой для *ss), вы должны использовать библиотеку, которая фактически реализует протокол SMTP и, таким образом, позволяет вам подключаться к другому SMTP-серверу. На сегодняшний день наиболее популярны:

  1. PHPmailer (скачать)
  2. Swiftmailer
  3. Zend_Mail

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

/*******************************************************************
  Example of sending email using gmail.com SMTP server and phpmailer
*******************************************************************/
$mail = new PHPMailer();  // create a new object
$mail->IsSMTP(); // enable SMTP
$mail->SMTPDebug = 0;  // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true;  // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465; 
$mail->Username = GUSER;  
$mail->Password = GPWD;           
$mail->SetFrom($from, $from_name);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AddAddress($to);
if(!$mail->Send()) {
    $error = 'Mail error: '.$mail->ErrorInfo; 
    return false;
} else {
    $error = 'Message sent!';
    return true;
}
person ThatGuy    schedule 27.07.2011
comment
Где определены GUSER и GPWD? - person Marvin; 13.10.2019

вы уверены, что этот домен работает и smtp-сервер активен на порту 25? безопасный smtp-трафик использует другой порт, Google может сказать вам, какой через секунду :)

вы можете попробовать это, если на вашем компьютере установлен telnet:

откройте командную строку, введите: telnet smtp.myexistingdomain.com 25 когда он подключится, вы можете быть уверены, что домен работает и имеет прослушивающий smtp-сервер. если это не удается, сервер smtp, вероятно, недоступен или использует другой порт.

Еще одна вещь, которую вы можете проверить, это то, что если в файле php.ini установлены правильные учетные данные, большинство smtp-серверов требуют аутентификации.

person Thomas    schedule 25.07.2011
comment
Если бы это была проблема с учетными данными, он бы так и сказал. Это абсолютная ошибка, из-за которой даже не может быть получена ошибка исходного TCP-соединения. - person Marc B; 25.07.2011
comment
ОК, ребята, я новичок во всем этом. Итак, что я сделал на данный момент, так это купил домен в OVH. Домен активирован, я могу отправлять файлы по ftp для хост-сервера (общий) и еще один для небольшого выделенного сервера sql. В полученном электронном письме с подтверждением мне сообщают, что у меня есть smtp.mydomain.com -- или ns0.ovh.net. Я уже создал 2 письма на своем домене ([email protected], [email protected]), я ввел оба, это просто работает. теперь я понятия не имею, как изменить порты и где находится php.ini. Также электронное письмо, которое они присылают мне, говорит мне, что мне нужно идентифицировать через POP. Спасибо за помощь - person james; 25.07.2011

Настройка SMTP доступна только в Windows. Можете ли вы напрямую подключиться к этому хосту/порту через telnet? Если что-то внешнее по отношению к PHP, но работающее на хосте, также не может подключиться, то либо это неправильное имя хоста, либо он не прослушивает порт 25, и/или есть проблема с брандмауэром.

person Marc B    schedule 25.07.2011