WeBinstruments

Инструментарий для веб-мастеров

 

на сайте на всех сайтах для веб разработчиков везде
 
 Скрипты
  PHP скрипты   
  Flash скрипты   
  Javascript скрипты   

 Софт
  Инструменты SEO   
  Разработка сайтов   
  Серверное ПО   

 Документация
  MySQL   
  PHP   
  HTML   
  Протоколы и сервисы Internet   

 Статьи
  PHP   
  MySQL   
  Сервер   
  еще...   

 Услуги и сервисы
  Домены   
  Хостинги   
  Блоки для сайта   

 Новости


 Контакты
  icq: 158325531
  email:
  все контакты: здесь




Atom все поступления
Раздел Файлы
Раздел Услуги и сервисы
Раздел Новости
Раздел Статьи
комментарии



 Партнеры


Главная / Статьи / PHP / Отправка писем через SMTP с авторизацией


email
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
там надо запланировать запуск службы или программы и написать определенные команды чтоб отправлялись письма в назначенное время.
Можете описать это на примере?


<<< 2 3 4 5 6 7 8 9 10

Добавить свой комментарий


Ваше имя(* обязательно)


Текст сообщения(* обязательно)









 
 
  запомнить

 
Copyright © 2003-2024 WeBi Constructor
Rambler's Top100