smtp php
Отправка писем через SMTP с авторизацией13.08.2007 сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиКак отправить почту с помощью php через SMTP сервер используя сокеты. Рассматривается отправка почты с прикрепленными файлами и просто текста.
Комментарии
RSS комментарии
23.01.2011 satiate
было бы хорошо если бы вы объяснили немного про то что делается в функции get_data. У меня она выглядит так: (делал по вашему образцу)
function GetData($connect){$data="";
while($ans=fgets($connect, 512)){
$data.=$ans;
if(substr($ans,3,1)==" ")break;
}return $data;
}
почему идёт такая проверка:
if(substr($ans,3,1)==" ")break;
?
23.01.2011 админ
satiate, эта проверка ловит пробел, после третьего символа.
каждый ответ сервера сначала выдает трехзначный код, затем уже пошло сообщение.
если сервер планирует выдать больше одного ответа за раз, то после кода пробела не будет, например
250-mx30.mail.ru Hello mail.ru [80.64.80.192]
250-SIZE 10485760
250-8BITMIME
250-AUTH PLAIN LOGIN
250 PIPELINING
Как видите, здесь сервер выдал сразу несколько ответов и лишь у последнего стоит пробел после кода.
Вот такой пробел и ловит это условие и значит это последний ответ от сервера и можно заканчивать цикл.
Я уже не помню почему я сделал именно такой алгоритм поиска последнего ответа, может просто для демонстрации по быстрому сляпал и все, а может по специфике протокола именно так и должно быть-именно последний ответ отделяется пробелом от трехзначного кода.
25.01.2011 satiate
аа. понятно ..а что, весьма надежный способ.)
сеньк за ответ)
07.02.2011 Михаил
Присоединяюсь ко всем поблагодарившим.
Отлично и доходчиво разжованный пример.
Очень помогло!!!! СПАСИБО!!!!
20.03.2011 bvn13
Супер!
Огромное спасибо!
06.04.2011 norge
Автор, так написать это просто талант, зная только С++ и Си и вообще 0 в ПХП я все понял с твоей статьи, спасибо огромное!!!
23.04.2011 Михаил
$header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
D, j M Y G:i:s - здесь ничего не напутано?
Все письма приходят с таким полем
23.04.2011 13:41
а письма отправленные Вашим скриптом
с таким: 10:08 (только время), и время почему-то неправильное. Может быть поэтому письма приходят не на все ящики?
В чем может быть проблема?
25.04.2011 админ
Михаил, нет, здесь ничего не напутано.
По стандарту заголовок с датой пишется так
Wed, 20 Apr 2011 18:32:10 +0700
+0700 в данном случае поправка часового пояса по гринвичу.
Подберите свою поправку и время будет отображаться как нужно.
Какую поправку нужно ставить, все зависит от времени на сервере.
Примеры поправки +0700, +0400, +1100, -0100.... И т.д.
То что вы привели в пример даты, с которыми приходят письма, это даты, которые показывает почтовая программа, дата в заголовках письма совсем другая.
Обычно, если письмо отправлено сегодняшней датой, почтовая программа сама отбрасывает дату и оставляет только время, поэтому если почтовик показывает только время, без даты, то значит письмо отправлено сегодня, завтра это письтмо будет показываться уже с датой.
Поэтому не надо смотреть на поля с датой, которые показывает почтовая программа, смотрите исходник письма и смотрите как там указана дата.
13.05.2011 Юрик
Спасибо огромное за столь подробную и понятную статью!
Но у меня даже не получается начать авторизацию на mail.hot.ee, хотя на другом SMTP всё работает. Тут как я понял другой тип авторизации инициализируется. Ваш код его не поддерживает?
Вот что выдаёт скрипт:
Показывает исходный текст письма:
220 hot.ee HOT-Relayhost1.estpak.ee
Я: EHLO info
250-HOT-Relayhost1.estpak.ee
250-PIPELINING
250-SIZE 36909875
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
Я: AUTH LOGIN
504 5.5.4 Encryption required for requested authentication mechanism
сервер не разрешил начать авторизацию
15.05.2011 виктор
Юрик, на сколько я понял, тут нужно по защищенному соединению коннектиться. ssl.
в сам низу статьи об этом написано
13.06.2011 Семен
Мало знать предмет, нужно еще уметь подать его для "особо одаренных"
Снимаю шляпу перед автором.
У меня следующая проблема:
На хостинг залил скрипт.
Если использую в первой команде smtp-сервер хостинга
$smtp_conn = fsockopen($smtp_server, 25,$errno, $errstr, 10); - все работает отлично!
если пишу smtp.mail.ru(yandex, rambler...),
$smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10);
то пишет;
"соединение с серверов не прошло"
Где собака порылась?
15.06.2011 Виктор
Семен, возможно на вашем хостинге закрыт 25 порт, чтобы не спамили.
С smtp хостинга соедениться получается, потому что идет локальный коннект и внешний 25 порт не используется.
15.06.2011 Семен
Спасибо Виктор за ответ!
Можно еще пару вопросов:
1. А как из скрипта определить определить закрыт 25 порт или открыт. И по результатам проверки выбрать какой smtp-сервер использовать?
2. Если отправлять через smtp-сервер, то будет ли распространяться ограничения хостера на отправку писем в час(при использовании mail() - стоит ограничение 300 писем в час, а у меня база 4000+ подписчиков.Значит письма будут рассылаться очень долго)
15.06.2011 Семен
Еще вопрос:
e-mail при соединении с smtp-сервером и e-mail в поле from заголовка обязательно должны совпадать?
Хочу чтобы мои подписчики видели мой e-mail на gmail, при том что при соединении будет указываться e-mail на хостинге при закрытом 25 порту
Спасибо за разъяснения
25.06.2011 Виктор
Семен, задержался я с ответами, но лучше поздно, чем никогда...
1. Определить скриптом закрыт ли 25 порт наверное нельзя, но можно реагировать на ошибку коннекта. Если коннект с сервером не удался, по любой причине, то пробовать отправку другим способом.
2. На счет ограничений у хостера нужно уточнить у хостера. Иногда ограничения на mail() не распрастраняются на SMTP и могут быть другие ограничения. Нужно узнать у хостера.
И на счет поля from. Теоретически можно в поле from поставить ящик другой, не тот через который идет отправка и письмо дойдет, но дальше начинается работа антиспама. Антиспам заметит подмену адреса и может отправить письмо в спам.
30.06.2011 vov
У меня такая ситуация, что письмо отправляется только на тот же почтовый ящик, к которому я подсоединился и с которого отправил письмо. То есть, если MAIL FROM:<почтовый ящик@mail.ru> и RCPT TO:<почтовый ящик@mail.ru> одинкавы, то получается отправить письмо самому себе. При указаниии другого почтового адреса в RCPT TO, письмо не доходит. В чем может быть проблема? Спасибо заранее.
16.07.2011 Arsen
Сначала пытался все делать через командную строку.Делаю все как вы говорите,но после того,как пишу пароль,выдает следующее - 535 Incorrect authentication data.Помогите...
17.07.2011 Arsen
Ну вот,ту же ошибку выдает когда пишу через php.Что делать???
22.08.2011 ellada
помогите пожалуста мне нужно через смтп отавить подряд несколько писем после 5 не отсылает! у нас сайт на котором выбераеш альбом или штучно фотки затем они архивируються по 10 мб и отправляются через 1или 2 мин на адресс компании! проблема в том что если альбом из 44 фоток он делает 8 архивов и начинает по одному отсылать так вот после 5 письмя не шлет что делать? помогите
26.08.2011 Сергей
Спасибо за хорошую статью.
Скажите а можно запланировать отправку сообщений через планировщик заданий который входит в состав Windows
там надо запланировать запуск службы или программы и написать определенные команды чтоб отправлялись письма в назначенное время.
Можете описать это на примере?
Добавить свой комментарий
|