Старая добрая функция для отправки писем посредством SMTP — с авторизацией. С большой вероятностью похожий код уже может встречаться на многих страницах блогов, и не только, т.к. ему не первый год, но всё же, он продолжает работать. А поэтому я решил, что ему быть тут. Отстраняясь от болтологии ближе к делу.
Основные параметры хранятся в виде констант, и при использовании в проектах, хорошо бы их переместить в конфигурационный файл. Надеюсь, вы понимаете, о чём я:
// Параметры почты define ("SMTP_USERNAME","example@href.kz"); // Имя почтового ящика define ("SMTP_PORT","25"); // Порт define ("SMTP_HOST","smtp.yornet.kz"); // Cервер отправки почты 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."\" <".SMTP_CHARSET.">\r\n"; $SEND .= "To: $mail_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 '<p>Не могу отправить HELO!</p>'; fclose($socket); return false; } fputs($socket, "AUTH LOGIN\r\n"); if (!server_parse($socket, "334", __LINE__)) { if (SMTP_DEBUG) echo '<p>Не могу найти ответ на запрос авторизаци.</p>'; fclose($socket); return false; } fputs($socket, base64_encode(SMTP_USERNAME) . "\r\n"); if (!server_parse($socket, "334", __LINE__)) { if (SMTP_DEBUG) echo '<p>Логин авторизации не был принят сервером!</p>'; fclose($socket); return false; } fputs($socket, base64_encode(SMTP_PASS) . "\r\n"); if (!server_parse($socket, "235", __LINE__)) { if (SMTP_DEBUG) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>'; fclose($socket); return false; } fputs($socket, "MAIL FROM: <".SMTP_USERNAME.">\r\n"); if (!server_parse($socket, "250", __LINE__)) { if (SMTP_DEBUG) echo '<p>Не могу отправить комманду MAIL FROM: </p>'; fclose($socket); return false; } fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n"); if (!server_parse($socket, "250", __LINE__)) { if (SMTP_DEBUG) echo '<p>Не могу отправить комманду RCPT TO: </p>'; fclose($socket); return false; } fputs($socket, "DATA\r\n"); if (!server_parse($socket, "354", __LINE__)) { if (SMTP_DEBUG) echo '<p>Не могу отправить комманду DATA</p>'; fclose($socket); return false; } fputs($socket, $SEND."\r\n.\r\n"); if (!server_parse($socket, "250", __LINE__)) { if (SMTP_DEBUG) echo '<p>Не смог отправить тело письма. Письмо не было отправленно!</p>'; 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 "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>"; return false; } } if (!(substr($server_response, 0, 3) == $response)) { if (SMTP_DEBUG) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>"; return false; } return true; }
Надеюсь пригодиться. Интегрируйте, переделывайте, пользуйте!
такой код отсылает письмо и в поле "кому" ставит скрытый пользователь. а письмо доходит только из-за того что получатель почему то прописывается в скрытую копию.
Есть идеи как решить проблему?