Стара добра функція для відправки листів допомогою 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
такий код відсилає лист в полі «кому» ставить прихований користувач. а лист доходить тільки із-за того що одержувач чомусь прописується в приховану копію.
Є ідеї як вирішити проблему?
Відповісти