Отправка писем через SMTP с авторизацией

В этой заметке рассмотрим как отправлять почту через SMTP с авторизацией с помощью PHP. Рассматривать будем вариант отправки именно с авторизацией, так как SMTP-сервер без авторизации — находка для спаммеров. Потому практически на всех серверах существует обязательная авторизация на исходящие сообщения.

Для начала нам необходим почтовый ящик, зарегистрированный на каком-либо сервере, например mail.ru или yandex.ru и, соответственно логин и пароль от этого ящика. Именно с этого адреса будем отправлять сообщение.

Для отправки письма через SMTP будем использовать сокеты.

<?php
$smtp_server = "smtp.mail.ru";
$port = 25;
$mydomain = "myserver.com";
$username = "user";
$password = "password";
$sender = "me@myserver.com";
$recipient = "joe@company.com";
$subject = "test";
$content = "test";

// Initiate connection with the SMTP server
$handle = fsockopen($smtp_server, $port);
fputs($handle, "EHLO $mydomain\r\n");

// SMTP authorization
fputs($handle, "AUTH LOGIN\r\n");
fputs($handle, base64_encode($username)."\r\n");
fputs($handle, base64_encode($password)."\r\n");

// Send out the e-mail
fputs($handle, "MAIL FROM:<$sender>\r\n");
fputs($handle, "RCPT TO:<$recipient>\r\n");
fputs($handle, "DATA\r\n");
fputs($handle, "To: $recipient\r\n");
fputs($handle, "Subject: $subject\r\n");
fputs($handle, "$content\r\n");
fputs($handle, ".\r\n");

// Close connection to SMTP server
fputs($handle, "QUIT\r\n");
?>

Ссылки по теме:

Комментариев: 4

  1. IMAM:

    Спасибо, помогли решить проблему.
    В своем скрипте не вписал RCPT TO

  2. ksandr:

    огромное спасибо! перепробовал штук 10 разных скриптов, помог только ваш!

  3. Siddhartha:

    а у меня не хочет этот скрипт ничего отправлять ((( помог вот этот вариант: http://www.rucable.net/We-send-mail-with-smtp-auth.html

  4. trinitron:

    Скрипт полностью рабочий, не надо на него бочку гнать! (проверено telnet’ом) А у кого вылезает ошибка типа SMTP synchronization error или вообще письма не отправляет, то модернизируем скрипт следующим образом:
    после автторизации и команды DATA строчкой ниже печатаем команду sleep(5); //ну это самый банальный вариант решения всех проблем))

Оставьте свой отзыв