| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > SMTP отправка почты через сокет. Цикл |
| Автор: BlackRu 4.7.2014, 16:01 | ||||
| Доброго дня. Изучаю код для отправки почты через сокеты. Не могу понять, зачем в функции цикл. Так ли он необходим? Правильно ли я понимаю, что цикл тут нужен для ожидания ответа сервера? Т.е. на случай, если сервер ответит не сразу. Я задал тот же вопрос на том сайте, где нашел статью, два дня прошло, ответов нет. Интересно, как работет fget. Изначальный код из статьи приведен ниже. Могу ли я сделать так? Т.е. без цикла.
Изначальный код из статьи:
Извиняюсь за количество кода, могу сократить после ответа. (Для практических целей использую Sendmail, понять хочу для себя(в учебных целях). |
| Автор: polls 8.7.2014, 11:01 |
| прошлое десятилетие, отправляй почту через gmail из php http://stackoverflow.com/questions/712392/send-email-using-the-gmail-smtp-server-from-a-php-pagehttp://ctrlq.org/code/19589-send-mail-php в сутки с одного gmail акка можно отправить 500 писем, если ограничение не изменилось. |
| Автор: _zorn_ 9.7.2014, 05:03 | ||
Так то оно так, но там нужно 3 первых символа - поэтому особого смысла в цикле нет. И да, можно заюзать fread вместо fgets, но здесь все равно без разницы. И цикл там все равно не правильный. Что будет если встретится стока состоящая из одного символа "0" ? |
| Автор: krundetz 9.7.2014, 10:29 | ||||||
вот пример обмена сообщениями
а теперь вопрос, как быть если нужно узнать SIZE? Там не цикл неправильный, а функция извлечения кода ответа, а если быть точнее то ошибка в проектирование, которая будет мешать расширяемости в дальнейшем. Я сделал хотя бы так:
так как могут понадобиться и другие данные из ответа. Не совсем понял имеется в виду нуль символ или строка из нуля? ИМХО, программист который создавал код, взятый за основу BlackRu, либо не до конца понимает что он делает и на чем, либо делал времянку для чего то. Вот поэтому и код такой же. |
| Автор: _zorn_ 10.7.2014, 05:29 | ||||
Я имел ввиду что то типа такого
Понимаю что в данном случае такое вряд ли встретится, однако...
|
| Автор: krundetz 10.7.2014, 10:35 | ||||
| _zorn_, нет, ваш вариант: 1. не обработает ситуацию когда в ответ возвращаются неправильные данные 2. не имеет смысла, так как fgets() всегда возвращает строку Если надо обработать правильность входящих данных, то как то так:
Не совсем уверен, что правильно будут обработаны несколько строк. Надо еще подумать. Или можно пойти дальше извлекая только данные соответствующие шаблону:
P.S. Данный код совсем не оптимален приведен как отправная точка для дальнейших размышлений. |
| Автор: BlackRu 10.7.2014, 23:11 |
| Спасибо, krundetz, _zorn_ Уже не ожидал ответа, поэтому пропал. Ага, этот 4 (получается по счету) символ - пробел, по которому происходит выход из цикла, может оказаться в ответе сервера и не пробелом. Если я не ошибаюсь. |
| Автор: _zorn_ 11.7.2014, 02:50 | ||||
Вы забываете одну "приятную" особенность ПХП - динамические типы данных.
http://ideone.com/8svgZ2 |
| Автор: BlackRu 11.7.2014, 08:54 |
Т.е. суммируя вышесказанное, если я правильно понимаю:
Интересно, какова вероятность, что код ответа будет не вначале, а где-нибудь в середине или конце строки? Т.е., получается, получив строку ответа, желательно проверить наличие в ней трехзначного кода? Если данные неправильные (по каким-то причинам), то следует повторить последний запрос? |
| Автор: krundetz 11.7.2014, 09:58 | ||||||
Да, желательно получать весь ответ сервера, который может состоять из нескольких строк. И только после этого с ним работать. Да, необходимо найти код ответа сервера который должен стоять в начале каждой строки. От него и переданных на сервер данных будет зависеть дальнейшее поведение программы.
Да.
Вероятность должна стремиться к 0, но это не значит, что входящие данные не нужно проверять на корректность. Так как по идее имея собственный "почтовый сервер" с которым ваша программа будет общаться можно вести исследование на проникновение, на ваш сервер.
Нет. Если ответ сервера не предусмотрен сценарием работы программы, то повтор запроса бессмыслен, следует просто прекратить обработку отправки этого письма на этот сервер и записать информацию об этом в лог. |
| Автор: krundetz 11.7.2014, 10:42 | ||||||||||
да вы правы, не учел.
Понял несколько моментов который меня смущали. 1. В моём коде нет проверки на начало строки поэтому такая строка:
тоже подпадет под него. Хотя на нее надо выводить ошибку. 2. Также нет проверки на то что между строками ответа может затесаться неправильная строка, вот так например:
|
| Автор: krundetz 11.7.2014, 12:42 | ||
немного допилил getData()
http://ideone.com/Phqy1b |
| Автор: BlackRu 11.7.2014, 14:05 |
| krundetz, спасибо огромное за подробные ответы и пример кода. Начинаю вникать. |