Стара добра функція для відправки листів допомогою SMTP — з авторизацією. З великою ймовірністю схожий код вже може зустрічатися на багатьох сторінках блогів, і не тільки, оскільки йому не перший рік, але все ж, він продовжує працювати. А тому я вирішив, що йому бути тут. Відсторонюючись від балачок ближче до справи.

Основні параметри зберігаються у вигляді констант, і при використанні в проектах, добре б їх перемістити в конфігураційний файл. Сподіваюся, ви розумієте, про що я:

// Параметри пошти
define (“SMTP_USERNAME”,”[email protected]”); // Ім’я поштової скриньки
define (“SMTP_PORT”,”25″); // Порт
define (“SMTP_HOST”,”smtp.yornet.kz”); // Сервер відправки пошти
define (“SMTP_PASS”,”w599o55w4a55″); // Пароль від пошти
define (“SMTP_DEBUG”,false); // Показ повідомлень про помилки
define (“SMTP_CHARSET”,”UTF-8″); // Кодування листа
define (“SMTP_FROM”,”Блог про веб-розробки”); // поле “Від кого”

При первинній настройці і налагодження, швидше за все, доведеться змінити значення константи SMTP_DEBUG на true. Тим самим ми будемо бачити повідомлення про помилки при відправленні листа. Після успішного налагодження, значення повідомлення про помилки варто відключити, щоб не кошмарити відвідувачів сайту.

Власне основний код:

function smtpmail($mail_to, $subject, $message, $headers=”) {
// global $config;
$SEND = “Date: “.date (D, d M Y H:i:s”) . “UT\r\n”;
$SEND .= ‘Subject: =?’.SMTP_CHARSET.’?B?’.base64_encode($subject).”=?=\r\n”;
if ($headers) $SEND .= $headers.”\r\n\r\n”;
else {
$SEND .= “Reply-To: “.SMTP_USERNAME.”\r\n”;
$SEND .= “MIME-Version: 1.0\r\n”;
$SEND .= “Content-Type: text/plain; charset=\””.SMTP_CHARSET.”\”\r\n”;
$SEND .= “Content-Transfer-Encoding: 8bit\r\n”;
$SEND .= “From: \””.SMTP_FROM.”\” \r\n”;
$SEND .= “To: $mail_to \r\n”;
$SEND .= “X-Priority: 3\r\n\r\n”;
}
$SEND .= $message.”\r\n”;
if( !$socket = fsockopen(SMTP_HOST, SMTP_PORT, $errno, $errstr, 30) ) {
if (SMTP_DEBUG) echo $errno.”<br>”.$errstr;
return false;
}
if (!server_parse($socket, “220”, __LINE__)) return false;
fputs($socket, “EHLO” . SMTP_HOST . “\r\n”);
if (!server_parse($socket, “250”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Не можу відправити HELO!

‘;
fclose($socket);
return false;
}
fputs($socket, “AUTH LOGIN\r\n”);
if (!server_parse($socket, “334”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Не можу знайти відповідь на запит авторизації.

‘;
fclose($socket);
return false;
}
fputs($socket, base64_encode(SMTP_USERNAME) . “\r\n”);
if (!server_parse($socket, “334”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Логін авторизації не був прийнятий сервером!

‘;
fclose($socket);
return false;
}
fputs($socket, base64_encode(SMTP_PASS) . “\r\n”);
if (!server_parse($socket, “235”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Пароль не був прийнятий сервером як вірний! Помилка авторизації!

‘;
fclose($socket);
return false;
}
fputs($socket, “MAIL FROM: \r\n”);
if (!server_parse($socket, “250”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Не можу відправити комманду MAIL FROM:

‘;
fclose($socket);
return false;
}
fputs($socket, “RCPT TO: \r\n”);
if (!server_parse($socket, “250”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Не можу відправити комманду RCPT TO:

‘;
fclose($socket);
return false;
}
fputs($socket, “DATA\r\n”);
if (!server_parse($socket, “354”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Не можу відправити комманду DATA

‘;
fclose($socket);
return false;
}
fputs($socket, $SEND.”\r\n.\r\n”);
if (!server_parse($socket, “250”, __LINE__)) {
if (SMTP_DEBUG) echo ‘

Не зміг відправити тіло листа. Лист не було надіслане!

‘;
fclose($socket);
return false;
}
fputs($socket, “QUIT\r\n”);
fclose($socket);
return TRUE;
}
function server_parse($socket, $response, $line = __LINE__) {
$server_response = “;
while (substr($server_response, 3, 1) != ”) {
if (!($server_response = fgets($socket, 256))) {
if (SMTP_DEBUG) echo “

Проблеми з відправкою пошти!

$response
$line
“;
return false;
}
}
if (!(substr($server_response, 0, 3) == $response)) {
if (SMTP_DEBUG) echo “

Проблеми з відправкою пошти!

$response
$line
“;
return false;
}
return true;
}

Сподіваюся стати в нагоді. Інтегруйте, переробляйте, товуйте!

Додав: htmaker, 26.04.2013 р.
(Ще не оцінили)

Завантаження…

Діліться з друзями:

См. також:


Пісочниця для PHP
Рубрика: PHP, Інструменти

Конфіг файли
Рубрика: PHP

Установка XCache в Linux CentOS
Рубрика: Linux, PHP

Використання SOAP в PHP
Рубрика: PHP

Встановлення PHP Soap на CentOS
Рубрика: Linux, PHP

Обсяг даних в зручному форматі на PHP
Рубрика: PHP

Транслітерація символів на PHP
Рубрика: PHP

Як перетворити URL-рядок в масив?
Рубрика: PHP

Добірка шаблонів регулярних виразів
Рубрика: PHP

Коментарі

  • Владислав пише:
    04.06.2018 в 22:31

    такий код відсилає лист в полі «кому» ставить прихований користувач. а лист доходить тільки із-за того що одержувач чомусь прописується в приховану копію.

    Є ідеї як вирішити проблему?

    Відповісти