Отправка E-mail из программы на Vc++

Тема в разделе "MS Visual C++", создана пользователем Alex_Bamuner, 5 окт 2006.

Статус темы:
Закрыта.
  1. Alex_Bamuner

    Alex_Bamuner Гость

    Всем привет.
    Стоит задача - отправить письмо по электронной почте из приложения, написанного на VC++. Написал я следующее:

    #define SMTP_PORT 25 //порт почтового сервера
    #define SMTP_ADDR "..........." //Айпишник почтового сервера - я пытался на yandex

    SOCKET nSMTPServerSocket;
    struct sockaddr_in smtp_address;
    int nConnect;
    int iLength;
    int iMsg = 0;
    int iEnd = 0;
    BYTE sBuf[4096];

    char *MailMessage[] =
    {
    "HELO domain.ru\r\n",
    "MAIL FROM:<",
    "RCPT TO:<vasya@pupkin.ru>\r\n",
    "DATA\r\n",
    "",
    "QUIT\r\n",
    NULL
    };

    lstrcat(MailMessage[1], "vasja@pupkin.ru>\r\n");
    lstrcat(MailMessage[4],"Hello world\r\n\r\n.\r\n");

    nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);

    if(nSMTPServerSocket != INVALID_SOCKET) {
    smtp_address.sin_family = AF_INET;
    smtp_address.sin_addr.s_addr = inet_addr(SMTP_ADDR);
    smtp_address.sin_port = htons(SMTP_PORT);

    nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address, sizeof(smtp_address));

    if(nConnect) { }
    else {
    do {
    iLength = recv(nSMTPServerSocket, (LPSTR)sBuf+iEnd, sizeof(sBuf)-iEnd, 0);
    iEnd += iLength;
    sBuf[iEnd] = '\0';
    send(nSMTPServerSocket, (LPSTR)MailMessage[iMsg], strlen(MailMessage[iMsg]), 0);
    iMsg++;
    } while(MailMessage[iMsg]);
    }

    closesocket(nSMTPServerSocket);
    }


    Требуется авторизация - это ответ с сервера. Я почитал о протоколе - там черт ногу сломит, особенно когда я добрался до 64-coding. Тут я решил уже обратиться за помощью сюда... Благодарю за любые советы и комментарии.
    С уважением,
    Александр.
     
  2. zubr

    zubr Гость

    Чтобы не заморачиваться с протоколом, посмотри лог какой нибудь почтовой программы, к примеру Outlook, в логе будет протокол обмена с почтовым сервером. Естественно подразумевается, что Outlook настроен на соединение с интересующим почтовым сервером.
     
  3. Alex_Bamuner

    Alex_Bamuner Гость

    Идея неплохая, спасибо... Но я никлгда такими вещами прежде не интересовался - подскажи, а где этот лог найти? В папке Outlook Express я такового не нашел... =(
     
  4. zubr

    zubr Гость

    Для Outlook ищи (для NT-систем) в каталоге Documents and Settings\...\... файл по имени Smtp.log
     
  5. Alex_Bamuner

    Alex_Bamuner Гость

    Ага, поищу. Спасибо. А вообще, странное дело - я подключился к smtp серверу на mail.ru. И он безо всякой авторизации дал мне отправить письмо с первого попавшегося вымышленного адреса. С существующих - не даёт, а с левых - пожалуйста!
     
  6. Alex_Bamuner

    Alex_Bamuner Гость

    хм... smtp.log не создаётся.... короче говоря, у меня его нету... =( Если у кого-нить есть такой - вышлите, если не сложно - bamuner@yandex.ru. А если у кого-нить есть алгоритм шифрования Base64 - тоже будет очень кстати. Логин и пароль серверу надо посылать в Base64 кодировке.
     
  7. zubr

    zubr Гость

    Для: Alex_Bamuner
    В настройках Outlook есть возможность включить ведение лога, по видимому у тебя эти возможности отключены. Смотрим Сервис->Параметры, вкладку Обслуживание. А присылать тебе свой лог с авторизацией, извини, как то не хочется.
    Насчет алгоритма шифрования Base64 у меня есть функция, но на Delphi, переводить в C нет времени, если устроит, могу прислать.
     
  8. Alex_Bamuner

    Alex_Bamuner Гость

    Я так думаю, что разницы большой нет - из Delphi сделать C не так уж и запарно. Так что буду весьма благодарен за функцию. а Outlook проверю - что там с ведением лога... Спасибо!
     
  9. zubr

    zubr Гость

    Вот функция:
    Код (Text):
    procedure SmtpJoin(Name:string; Stream:TStream; Count:integer;
    var outstr:string);
    var
    s:string[76];
    size:integer;
    u:string;
    ss:integer;
    c1,c2:byte;
    x:integer;
    begin
    try
    outstr:='begin 600 '+Name;
    size:=45;
    while Count>0 do begin
    if size>Count then size:=count;
    dec(count,size);
    Stream.Read(s[1],size);
    u:=uchr(size);
    ss:=2;
    c2:=0;
    for x:=1 to size do begin
    c1:=ord(s[x]);
    u:=u+uchr(c2 or (c1 shr ss));
    c2:=(c1 shl (6-ss)) and 63;
    ss:=(ss+2) and 7;
    if ss=0 then begin
    ss:=2;
    u:=u+uchr(c2);
    c2:=0;
    end;
    end;
    if (ss>2) then begin
    u:=u+uchr(c2)+#96;
    if ss=4 then u:=u+#96;
    end;
    outstr:=outstr+#13+#10+u;
    end;
    outstr:=outstr+#13+#10+'end';
    except
    end;
    end;
    Функция переводит данные потока в кодировку BASE64, для дальнейшей отправки в виде аттача по SMTP. Здесь Name - имя файла, который будет в аттаче, Stream - поток, Count - размер потока, outstr - результат перевода.
     
  10. Alex_Bamuner

    Alex_Bamuner Гость

    Ага, спасибо... погляжу на досуге... :) Сейчас всё-таки сделал аутлуковский лог, выдрал оттуда логин и пароль и в итоге авторизация пошла как по маслу. Правда письмо отсылается как-то странно - при отсылке на yandex приходит пустое письмо от анонима, а на mail - приходит письмо с моего аккаунта, но в теле письма кроме того, что я напечатал, присылается вся-вся история блуждания письма по серверам... такие вот дела. Кстати, вообще задача стоит - отсылка аттачментов. На эту тему есть идеи - как подключать аттачменты к письмам?
     
  11. zubr

    zubr Гость

    Ну так в чем проблема, та функция, что я выложил как раз это и делает, по крайней мере у меня она как раз для такой задачи и использовалась.
     
Загрузка...
Похожие Темы - Отправка mail из
  1. Реник
    Ответов:
    2
    Просмотров:
    1.389
  2. bolahg
    Ответов:
    0
    Просмотров:
    2.236
  3. Supermaximus
    Ответов:
    4
    Просмотров:
    2.548
  4. Supermaximus
    Ответов:
    1
    Просмотров:
    2.230
  5. k85
    Ответов:
    4
    Просмотров:
    111
Статус темы:
Закрыта.

Поделиться этой страницей