Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > SMTP-аутентификация


Автор: rarelang 4.7.2004, 23:41
Всем привет

Помогите мне пожалуйста с решением следующей проблемы,

У меня есть простое приложение использующее SMTP протокол для отсылки почты. Алгоритм ядра приложения простой и состоит из следующих этапов:

(тут описываются действия и обмен данными)
1 Соединение с сервером на 25-м протоколе (WinSock/socket соединение)
2 HELO microsoft.com (в качестве примера)
3 MAIL FROM:<bgates@microsoft.com>
4 RCPT TO:<testuser@test.com>
5 DATA
6 Привет
7 .
8 QUIT
9 Разрыв соединения (closesocket/close и.т.д.)

Проблема возникает в том, что многие сервера (в частности те с которыми приложение должно работать) требуют аутентификацию и на попытку послать сообщение пользователю, чей ящик располагается на хосте различном от того с чьим SMTP сервисом я работаю (к примеру, при попытке отослать с host1 на host2 выдается ошибка, тогда как с того же хоста на тот же хост все проходит нормально) выдают мне следующую ошибку (на шаге 4-м вышеизложенного листинга):

473 asfgrg@blabla.com relaying prohibited. You should authenticate first

Насколько я понимаю, требуемая аутентификация это не POP-before-SMTP метод (т.е. когда надо залогониться на POP3 для последующей работы с SMTP) (он у меня так и не сработал когда я тестил mail-сервер через telnet), а использование расширений SMTP согласно RFC1651 и в частности RFC2554, и насколько я понимаю здесь имеется в виду использование AUTH.

Если кто-то из вас уже использовал SMTP-аутентификацию то просьба приведите мне пожалуйста пример диалога с сервером, т.е. листинг запросов которые мне ему нужно посылать для аутентификации.

Заранее спасибо за любой ответ.

Автор: DENNN 5.7.2004, 09:49
Нет. Судя по ответу сервера он как раз требует сначала произвести POP-аутентификацию и только после этого тебе будет открыт релей на другие домены с этого почтового сервера.
Почтовик коннектится нормально? Твоя прога POP выкачивает? Какие настройки в работающем почтовике?
Трафик снифить не пробовал?

Автор: rarelang 5.7.2004, 14:49
Так я точно уверен что там именно чрез AUTH LOGIN нужно, с POP не работает

Автор: Royan 5.7.2004, 19:06
Возможно подойдет альтернативное предложение- воспользоваться CDONTS компонентами вот, например, код демонстрирующий basic аутентификацию как раз подходящую в большинстве случаев:

Цитата
  CoInitialize(NULL);
  {
    IMessagePtr IMsg(
__uuidof(Message));
    IConfigurationPtr iConfig(
__uuidof(Configuration));

    FieldsPtr Flds;
    FieldPtr Fld;
    Flds = iConfig->Fields;

   
// The full strings for field names are used to elucidate the process.
    // The cdosys.h header file contains BSTR constants that
    // can be used to avoid typos, and so on.

   
Flds->Item["http://schemas.microsoft.com/cdo/configuration/smtpserver"]->Value
      = _variant_t("some.smtp.net") ;
    Flds->Item["http://schemas.microsoft.com/cdo/configuration/smtpserverport"]->Value
      = _variant_t((
long)25) ;
    Flds->Item["http://schemas.microsoft.com/cdo/configuration/sendusing"]->Value
      = _variant_t((
long)cdoSendUsingPort) ; // this value is 2
   
Flds->Item["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"]->Value
      = _variant_t("Твое имя") ;
    Flds->Item["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"]->Value
      = _variant_t("\"Твое Имя\" <myemail@someserver.net>") ;
    Flds->Item["http://schemas.microsoft.com/cdo/configuration/smtpuserreplyemailaddress"]->Value
      = _variant_t("\"Reply Имя\" <myemail@someserver.net>") ;
    Flds->Item[_variant_t("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")]->Value
      = _variant_t((
long)cdoBasic) ;
    Flds->Item[_variant_t("http://schemas.microsoft.com/cdo/configuration/sendusername")]->Value
      = _variant_t("Username") ;
    Flds->Item[_variant_t("http://schemas.microsoft.com/cdo/configuration/sendpassword")]->Value
      = _variant_t("very_secret_password") ;
    Flds->Update();

    IMessage* pIMsg = NULL;

    pIMsg->Configuration = iConfig;
    pIMsg->put_To(_bstr_t("\"Roman Yankin\" <roman@intermedia.net>"));
//Куда
   
pIMsg->put_From(_bstr_t("\"ThirdPerson\" <support@intermedia.net>"));//Кому
   
pIMsg->put_Sender(_bstr_t("\"Finally\" <ryankin@intermedia.net>"));//
   
pIMsg->put_Subject(_bstr_t("Приветствие"));// sunject
   
pIMsg->put_TextBody(_bstr_t("Ну и содержание письма. \r\n"));



   
// ... compose message; add attachments, and so on.

   
pIMsg->Send();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)