Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > SMTP клиент, транзакции не проходят |
Автор: neosapient 14.10.2006, 11:35 | ||
(http://forum.vingrad.ru/index.php?act=ST&f=38&t=114508&st=15) Нашел в рунете пример работы SMTP клиента. Настроил на себя, а он вот что дает:
554 - транзакции не проходят, так как 503 - неверная последовательность команд Помогите разобраться, что не так делаю! ![]() Программа записывает в файле "c:\\socket.log" весь лог работ И еще, что за wsnet.ru такой, я ж его не вызываю? |
Автор: ptr 14.10.2006, 15:21 | ||
А что же ты делаешь? Ты же к нему подключаешься (wsnet.ru - 212.96.192.1) :
Всё уже написано: 554 <[email protected]>: Recipient address rejected: Relay access denied |
Автор: neosapient 14.10.2006, 16:14 |
1) А можно пояснить про работу WSAAsyncGetHostByName? Почему ассинхроная отсылка сообщеня окну? 2) Есть ли синхроная функция, чтоб приложение зависло на некоторое время на этой функции, но зато вернула в консоль только IP (очень не хочется радикально модифицировать этот пример). Для этого подойдет gethostbyname? |
Автор: ptr 14.10.2006, 16:25 | ||
|
Автор: neosapient 14.10.2006, 16:49 |
Спасибо, буду знать про gethostbyname(). А теперь супер бонусный вопрос ![]() Если дебагером пробежаться, то сразу после connect(), вызывается recv(), но данные в сокет не приходят и приложение уходит в бесконечное ожидание. |
Автор: ptr 14.10.2006, 17:10 | ||
Сервер - smtp.mail.ru, а не mail.ru. И какова глубина вложенности "супер"? |
Автор: neosapient 14.10.2006, 17:56 | ||||
[off topic]
"вложеность" №2 ![]() [/off topic] ------------
А теперь супер-пупер вопрос ("вложеность" №3) ![]() ------------ Ну и наконец вопрос на засыпку ("вложеность" №4) ![]() ![]() Я в переменной hostname заменил значение с "mail.ru" на "smtp.mail.ru" Но это не помогло (смотри в прилогаемом архиве лог-файл: socket1.log) Тогда я заменил первую переменную массива строк MailMessage с "HELO mail.ru\r\n" на "HELO smtp.mail.ru\r\n" Но это не помогло (смотри в прилогаемом архиве лог-файл: socket2.log) Как то начинаю путаться. ![]() почему не работает ![]() ------------ И еще бонусный вопрос (как можно было догадаться "вложеность" №1) : В массиве строк MailMessage есть добавки из "\r" и "\n". Зачем они здесь нужны, в смысле обезательны ли? ------------ [off topic] Хочу предупредить встречный вопрос, есть ли еще типы "вложености" реторический - (-1) - не требует ответа обычный - (0) - простой, обычный, заурядный на сон грядущий - (5) - не имеет однозначного ответа; задается только врагам, чтоб всю ночь не спали и мучались в поисках ответов... ![]() [/off topic] |
Автор: neosapient 14.10.2006, 18:24 |
А можно прокоментировать http://forum.vingrad.ru/index.php?showtopic=37110 Там где речь идет про mail.ru Может я вообще не на тех "кошках" тренеруюсь ![]() |
Автор: neosapient 14.10.2006, 22:02 |
Может кто-нибудь предоставить простой, но работающий пример передачи почты по расширеному SMTP-протоколу, т.е. по стандарту RFC 1427. На ящики: mail.ru, yandex.ru, rambler.ru Пытался по протоколу RFC 821, но не нашел ни одного известного мне ящика, чтобы отправка проходила успешно по старой технологии. |
Автор: ptr 15.10.2006, 13:44 | ||
Я своих людей не выдаю ![]() ![]()
"\r\n" - перевод строки. Они обязательны. Что-то я такого не припомню. Может быть RFC2821. Вообще-то вместо smtp.mail.ru надо слать свой адрес. Потому что неправильно написана ![]() Что конкретно тебе прокомментировать? |
Автор: neosapient 15.10.2006, 15:29 | ||||||
Что-то я приболел и слабо соображаю ![]()
А какой у моей машины адрес... ![]() как узнать ![]() IP посмотрел -> 192.168.1.2
Там, где свои мысли высказывает oleg1973. |
Автор: neosapient 15.10.2006, 19:36 |
Вот часть статьи: http://rsdn.ru/article/qna/inet/email.xml#EEG ![]() Так в командной строке вызываю "telnet" Далее "open smtp.mail.ru 25" Затем "HELO mail.ru" Получаю "ОК" "MAIL FROM:<[email protected]>" Получаю "ОК" И наконец "RCPT TO:<[email protected]>" выдает ошибку 550 - почтовый ящик не доступен, что за баг ![]() ---- По поводу telnet создал еще одну http://forum.vingrad.ru/index.php?showtopic=116611 |
Автор: tnt17 16.10.2006, 10:49 |
smtp.mail.ru 25 не везде проходит, так как некоторые провы блокируют 25 порт.На мейлру есть альтернативный 2525 .Почтовик узнает об этом просто авторизировавшись по протоколу pop3. Вобщем это все хорошо, но на mail.ru нужна авторизация. Есть статья по этой теме: http://wasm.ru/article.php?article=simplesmtp ![]() |
Автор: neosapient 16.10.2006, 13:36 |
tnt17, спасибо. Статья очень интерестная. ---- Только в MSDN не тот формат переменных для функций Base64Encode Base64Decode Бонусный вопрос: что инклудить, чтоб у функций был тот же формат передачи парамертров, как и в статье http://wasm.ru/article.php?article=simplesmtp Где в MSDN для функций описан такой же формат передачи параметров. |
Автор: neosapient 16.10.2006, 14:47 | ||
Ответ http://rusfaq.ru/info/question/50233 А самостоятельная реализация http://www.sources.ru/cpp/uu_base64encode.zip |
Автор: neosapient 16.10.2006, 15:22 | ||
Люди подскажите, в чем проблема.
Мне на экране выводиться: dGVzdF9fXzAwMDAzAA== А в http://wasm.ru/article.php?article=simplesmtp dGVzdF9fXzAwMDAz Похоже, но не то. Как определить конец возвращаемой строки. Ведь в переменную возвращается число 20, т.е. включая хвост AA== Ну, что я на этот раз делаю не так. ![]() ![]() |
Автор: neosapient 16.10.2006, 16:06 | ||
Понял - кодируется символ конца строки - '\0' Надо так
Хоть бы это были последние грабли... ![]() |
Автор: tnt17 16.10.2006, 16:12 |
У тебя проблема с этим: invoke socket,2,1,0 на языке С это будет выглядеть так socket(2,1,0). Что озаначают цифры,смотри в h файле с прототипом этой функции описание констант. И сравнивай это все с мсдн. Например: MSDN: SOCKET socket( int af, int type, int protocol ); winsocket2.h. & мсдн: 1) #define AF_INET 2 2) SOCK_STREAM ? SOCK_DGRAM #define SOCK_STREAM 1 : #define SOCK_DGRAM 2 3) протокол = 0. К документации. Пример программы на fasm-e: http://forum.sources.ru/index.php?showtopic=103983 Добавлено @ 16:14 В статье ошибка,посмотри коментарии. ;) http://www.adp-gmbh.ch/cpp/common/base64.html |
Автор: neosapient 16.10.2006, 16:36 |
УРА А кукарача, а кукарача ... дальше не помню ... а ча-ча-ча ПОЛУЧИЛОСЬ ПИСЬМО ШЛЕТСЯ... ![]() ![]() ![]() Люди, остался маленький баг. Использую функцию для копирования строки strdup() Но она оставляет мусор. Поправьте кто может, я иссяк. Все пошел лечить свой грип... |
Автор: tnt17 16.10.2006, 16:48 |
lstrcpy юзай. ![]() Добавлено @ 16:58 После каждого приема данных от сервера,нужно чистить буффер.Меняем: #define getmessage(str) {sprintf(buffer,"get:\n %s",str); printf(buffer);fputs(buffer,file);} На: #define getmessage(str) {sprintf(buffer,"get:\n %s",str); printf(buffer);fputs(buffer,file);memset(&buffer, 0,1024);} 1024 размер твоего буффера. |
Автор: neosapient 16.10.2006, 20:20 |
Нет, не то. Есть глобальный buffer и локальный buffer В общем надо один из них переименовать (скажем глобальный), и компилятор перестанет ругаться. ![]() ![]() Но я думаю утечка памяти идет, и идет она в функции strdup() |
Автор: neosapient 17.10.2006, 18:02 |
Люди еще вопросик. Вот я шлю на mail.ru кому-то письмо ([email protected]) В инструкции по отправке сказано - пишите на smtp.mail.ru, порт 25 Теперь я шлю на rambler.ru кому-то письмо ([email protected]) В инструкции по отправке сказано - пишите на maild.rambler.ru, порт 25 Но тут у меня закрались сомнения. Как почтовая программа определяет "префикс" (smtp. или скажем maild.)? 1) Допустим в почтовом клиенте есть некая база данных с полными путями. Но тогда я не верю что она полная, врядли наш производитель софта из села Гадюкино включит в свою базу данных все почтовые ящики в каком-нибудь Занзебаре. Эту версию я отметаю. 2) Дотустим есть некая глобальная база данных в инете. Но тогда управляющий этой базой данных врядли будет беспокоиться, о включении самопального почтового ящика нашего программиста из села Гадюкино. И если наш программист не знает о существовании такой базы данных, то на его почтовый ящик не будут приходить письма. Мне такой расклад не нравиться - отвергаю. 3) Возможно есть некий стандартный сервис - я спрашиваю у mail.ru: "А здесь есть почта, можно точный адресок?" В ответ: "Да есть - smtp.mail.ru" или " Нет, нету" Эта идея имеет право на жизнь, но может оказаться проблематичной в реализации. И все же если так и есть - Подскажите так ли это? И что можно почитать? 4) Для всех почтовиков справедливо - smtp.somehost.org Я попробовал через telnet так подключиться: - на rambler.ru - open smtp.rambler.ru 25 -> меня перекинуло на maild.rambler.ru (ура) - на e-mail.ru - open smtp.e-mail.ru 25 -> клинит (плохо) Такой вариант тоже может подойти, но почему то не для всех. Прав ли я что такой метод используется? Возможно есть другой стандартный префикс? ... |
Автор: ptr 18.10.2006, 05:36 | ||
Ты сам задаёшь ей какой smtp сервер использовать. |
Автор: neosapient 18.10.2006, 21:58 | ||
Нет, я отсылаю письмо на [email protected] скажем через The bat. Я пользователь и не представляю как там все работает, в частности какой префикс брать. За меня все продумано и написано сторонними программистами. Вопрос, как эти сторонние программисты определяют префикс? |
Автор: dumb 18.10.2006, 22:07 |
ЩАЗ. ![]() если ты ни разу не настраивал почтовую программу, это вовсе не означает, что она "сама все делает". видел когда-нибудь волосато-бородатого дядьку с синими кругами под глазами и перманентным пивным духаном?.. |
Автор: neosapient 18.10.2006, 22:14 | ||
Мой вопрос из паралельной ветки.
По подробнее, как это посмотреть через telnet. Ну допустим я хочу отправить письмо через на [email protected] То есть мне надо узнать програмно что я должен коннектиться через 25 порт к smtp.mail.ru По логике мне надо сначала обратиться к mail.ru Т.е. я подключаюсь через какой то порт к mail.ru Через какой порт я должен подключаться, чтоб в дальнешем получить нужную мне информацию? Какова дальнешая последовательность действий? Скажите для приема почты (POP3) все тот же префикс или он может быть иной? Если иной какая методика его получения? Часики тикают, ответы нужны к затрашнему вечеру (четвергу). |
Автор: neosapient 19.10.2006, 10:57 | ||
Ну это вообще не ответ. Я пользуюсь web интерфейсом, предоставляемым mail.ru, на котором рассположен мой почтовый ящик. Чтобы отправить письмо другу, я пишу его почтовый ящик. Далее пишу текст письма и нажимаю кнопку "отправить". Ну ведь все за меня делает web-интерфейс, в том числе определяет точный почтовый сервер получателя (префикс.somemailhost.ru) Как он это определяет??? Надеюсь теперь вопрос понятен. Дайте "разжеванный" ответ. |
Автор: ptr 20.10.2006, 06:55 | ||||||||
Префикса может вообще не быть.
Он ничего за тебя не делает. Он лишь отправляет письмо на тот сервер, чей веб-интерфейс ![]()
Сервер - тот через который будет отправлена почта.
А это что тогда? (см. картинку) |
Автор: neosapient 20.10.2006, 17:15 | ||||||||||||
Это я догадываюсь. -------------------------------------------------
Да, а как сервер определяет куда правильно отправить почту. Предположим я отправляю письмо с [email protected] на [email protected] И так сервак-rambrel должен произвести соединение с smtp.mail.ru. Откуда сервак-rambrel`а знает про существование префикса smtp.mail.ru, ведь единственное что он знает это mail.ru как часть письма адреса получателя [email protected] Это просто текстовое вычленение. ------------------------------------------------
Люди, вы меня не можете понять. Слушайте внимательно мою мысль. Есть два способа для программиста организовать отправку почты: 1) "Ленивый". Тот о чем вы все мне пытаетесь объяснить. Этот способ реализован и в примере, что стаким трудом, но вместе удалось запустить. Письмо отправляется на сервер-почтовик, на котором расположен почтовый ящик отправителя. А затем этот сервак перенаправляет почту по месту назначения, возможно на другой сервер-почтовик. 2) "Геморойный" (потому что ответа не найти, извените ![]() - xxx.ru - smtp.xxx.ru - mail.xxx.ru - еще что то Вопрос понятен? -------------------------------------------------------
Гляжу внимательно - внутри обведенной рамки, в строке SMTP address в скобках "smtp.domain.tdl" <-- видете префикс А ниже вводим то самое domain.tdl Почему такой префикс? Возможно тут подходит идея:
Но для e-mail.ru префиксом выбран mail. Но несбрасываю со счетов версию про сервис
|
Автор: ptr 20.10.2006, 18:15 | ||||||||||||
Видишь перед этим e.g. ![]()
Не подходит.
Ты не ищешь лёгких путей ![]()
Тебе уже сказали как всё работает:
Почтовый сервер обращается к DNS серверу и ищет все MX (Mail Exchanger) записи для сервера получателя. Далее он перебирает все найденные записи в порядке приоритета и отсылает через подходящую запись письмо. Подробнее можешь почитать например http://info.nic.ru/st/8/out_265.shtml. Список MX записей можешь посмотреть так (из командной строки ![]()
В программе же это можно сделать с использование gethostbyname(). |
Автор: dumb 22.10.2006, 03:19 |
neosapient, повторюсь: можешь расслабиться на тему прямой засылки - не пустят тебя практически нигде. |
Автор: neosapient 22.10.2006, 14:59 |
PTR, спасибо за статью, интерестная. Ладно, основное для чего делалась ветка форума уже доведено до конца. http://neosapient.narod.ru/univer/socket/SMTP.rar Всем спасибо. Для ptr + к репутации Добавлено @ 15:06 закрываю |