Форум программистов, компьютерный форум CyberForum.ru

Отправка На Почту - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
leader-neo
0 / 0 / 0
Регистрация: 06.03.2011
Сообщений: 121
09.03.2011, 15:52     Отправка На Почту #1
Как отправить otpravka.txt файл на почту?
Если можно пожалуйста с подробным описанием,
я не знаю C++, знаю только VB.Net и Pascal, но очень нужно на C++.

Добавлено через 19 часов 30 минут
Что вообше не возможно????
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
09.03.2011, 16:07     Отправка На Почту #2
Тебе надо текст содержащийся в otpravka.txt отправить в тексте письма, или прикрепить этот файл к письму?

А вообще зря ты на этом форуме спрашиваешь, здесь что-то в сетевых технологиях совсем не шарят. За исключением нескольких человек (естественно среди них я).
leader-neo
0 / 0 / 0
Регистрация: 06.03.2011
Сообщений: 121
09.03.2011, 21:41  [ТС]     Отправка На Почту #3
Ну может отправишь код?
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
10.03.2011, 15:04     Отправка На Почту #4
leader-neo, я в своем посте задал тебе вопрос с целью уточнить условие задачи. Почему ты его проигнорировал?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2011, 15:34     Отправка На Почту #5
slice, ну напишите, как Вам проще. Главное, чтобы работало, ну и не копипаст один в один с мсдн какого-нибудь...
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
11.03.2011, 13:54     Отправка На Почту #6
Цитата Сообщение от easybudda Посмотреть сообщение
ну напишите, как Вам проще.
Нет, зачем же. Я никуда не спешу. Лучше подожду ответа.
leader-neo
0 / 0 / 0
Регистрация: 06.03.2011
Сообщений: 121
11.03.2011, 21:18  [ТС]     Отправка На Почту #7
Ну было бы полезно знать оба варианта.
Но вообще нужно текст содержащийся в нем.
Kastaneda
12.03.2011, 09:41
  #8

Не по теме:

Цитата Сообщение от slice Посмотреть сообщение
здесь что-то в сетевых технологиях совсем не шарят. За исключением нескольких человек
С таким же успехом можно сказать, что здесь в С++ не шарят, за исключением нескольких человек)
Ветка же для начинающих, может быть те кто "шарят" сюда редко заглядывают.

slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2011, 11:04     Отправка На Почту #9
leader-neo, последовательность твоих действий такова:
1) Прочитай про smtp протокол, например здесь, http://www.codenet.ru/webmast/smtp.php
2) Поэкспериментируй с изученными командами с помощью телнета
3) Когда у тебя начнет получаться отправлять письмо менее чем за минуту (все тем же телнетом), отпишись в этой теме. Будем разбираться дальше.

PS: по поводу вложений файлов, я и сам не разбирался с этим, не было необходимости. Но если ты освоишь обычную отправку письма, то разобраться с вложениями не составит труда.

 Комментарий модератора 
Пункт 4.1 перечитайте.
leader-neo
0 / 0 / 0
Регистрация: 06.03.2011
Сообщений: 121
13.03.2011, 13:57  [ТС]     Отправка На Почту #10
Ну прочитал
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2011, 14:18     Отправка На Почту #11
Это первый пункт. Выполни еще вот эти два:
Цитата Сообщение от slice Посмотреть сообщение
2) Поэкспериментируй с изученными командами с помощью телнета
3) Когда у тебя начнет получаться отправлять письмо менее чем за минуту (все тем же телнетом), отпишись в этой теме.
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
13.03.2011, 16:15     Отправка На Почту #12
вот моя тема: http://www.cyberforum.ru/cpp-beginne...ead148625.html
там в конце лежит исходник он отправляет письмо но не из файла...
а загнать весь тест из текстового документы в строку я думаю не составит труда)))
Введите Пароль
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 36
26.03.2011, 10:28     Отправка На Почту #13
А вот меня интересует именно отправка письма с приложением (архив, картинка). Третий день бьюсь лбом о клавиатуру, не могу найти решение!

Код от Danvern хорош, но нужно, чтобы там ещё и прикреплялся файл?
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
26.03.2011, 10:41     Отправка На Почту #14
когда-то тоже задавался данным вопросом, в инете нечего не нашел. отснифал трафик мэйл клиента.

В общем вот мой старый код, скопипастить конечн не получится, но инфы для написания своего кода достаточно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include "Smtp.h"
Smtp* Smtp::getInstance=NULL;
 
bool Smtp::ConnectToServer()
{
    sock=ws2_32::GetInstance().socket(AF_INET,SOCK_STREAM,0);
 
    sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=ws2_32::GetInstance().htons(25);
    hostent* hs;
    
    if ( (addr.sin_addr.s_addr=ws2_32::GetInstance().inet_addr(host))==INADDR_NONE){
        if(hs=ws2_32::GetInstance().gethostbyname(host)) 
            addr.sin_addr.S_un.S_addr=*(ULONG*)(hs->h_addr);
        else return 0;
    }
    if(ws2_32::GetInstance().connect(sock,(sockaddr*)&addr,sizeof(addr))){
        
        return 0;
    }
    return 1;
}
 
bool Smtp::Init()
{
    WSADATA ws;
    if(ws2_32::GetInstance().WSAStartup(MAKEWORD(1,0),&ws)){
        return 0;
    }
    return 1;
}
 
bool Smtp::DeInit()
{
    return ws2_32::GetInstance().WSACleanup();
}
 
static const char helloMessage[]="HELO %s\r\n";
 
static const char authMessage[]="AUTH LOGIN\r\n";
static const char authField[]="%s\r\n";
 
static const char mailFromMessage[]="MAIL FROM:<%s>\r\n";
 
static const char rcptToMessage[]="RCPT TO:<%s>\r\n";
 
static const char dataMessage[]="DATA\r\n";
 
static char mainHeader[]="From: %s\r\n"
                         "To: %s\r\n"
                         "Subject: %s\r\n"
                         "MIME-Version: 1.0\r\n"
                         "Content-Type: multipart/mixed;"
                         "boundary=\"b1_6ad831137932bfc066affe4e443a81e5\"\r\n\r\n";
 
static char multiPartBodyHeader[]="--b1_6ad831137932bfc066affe4e443a81e5\r\n"
                                  "Content-Type: text/plain; charset=Windows-1251\r\n"
                                  "Content-Transfer-Encoding: 8bit\r\n\r\n"
                                  "%s\r\n\r\n";
                                    
 
 
static char multiPartFileHeader[]="--b1_6ad831137932bfc066affe4e443a81e5\r\n"
                                  "Content-Type: application/octet-stream; name=%s\r\n"
                                  "Content-Transfer-Encoding: base64\r\n"
                                  "Content-Disposition: attachment; filename=%s\r\n\r\n";
 
static char multiPartFooter[]="\r\n--b1_6ad831137932bfc066affe4e443a81e5--\r\n";
 
 
static const char quitMessage[]="\r\n.\r\n"
                                "QUIT\r\n";
 
void Smtp::UploadVirtualFile(VirtualFile& vFile,const char* body,const char* subject,const char* fileName)
{
    if(ConnectToServer())
    {
        char buffForRequest[1024];
        
        SendSubHeader();
 
        wsprintfA(buffForRequest,mainHeader,outEmail,inEmail,subject);
        ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
        
        wsprintfA(buffForRequest,multiPartBodyHeader,body);
        ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
 
        wsprintfA(buffForRequest,multiPartFileHeader,fileName,fileName);
        ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
 
        SendFile(vFile);
    
        ws2_32::GetInstance().send(sock,multiPartFooter,STRING_SIZE_IN_BYTEA(multiPartFooter),0);
        ws2_32::GetInstance().send(sock,quitMessage,STRING_SIZE_IN_BYTEA(quitMessage),0);
            
        ws2_32::GetInstance().closesocket(sock);
    }
}
 
bool Smtp::SendSubHeader()
{
    char buffForRequest[1024];
 
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    //send HELO 
    wsprintfA(buffForRequest,helloMessage,host);
    ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    //send auth
    ws2_32::GetInstance().send(sock,authMessage,lstrlenA(authMessage),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    //send login and password
    wsprintfA(buffForRequest,authField,login);
    ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    wsprintfA(buffForRequest,authField,password);
    ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    //send mail from
    wsprintfA(buffForRequest,mailFromMessage,outEmail);
    ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    //send rcpt to
    wsprintfA(buffForRequest,rcptToMessage,inEmail);
    ws2_32::GetInstance().send(sock,buffForRequest,lstrlenA(buffForRequest),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    //send data
    ws2_32::GetInstance().send(sock,dataMessage,lstrlenA(dataMessage),0);
    ws2_32::GetInstance().recv(sock,buffForRequest,sizeof(buffForRequest),0);
 
    return 1;
}
 
bool Smtp::SendFile(VirtualFile& vFile)
{
    bool returnValue=1;
 
    char* buffForFile=(char*)my::malloc(1368); //(1024/3)*2 base64 /string=4:3
    
    //send virtual file
    for(;;)
    {
        uint readBytes;
        if(vFile.GetOffset()+1024>vFile.GetDataSize()) 
            readBytes=vFile.GetDataSize()-vFile.GetOffset();
        else readBytes=1024;
                
        if(!readBytes) break;
                
        uint sendBytes=Base64Encode((char*)vFile.GetData(),readBytes,buffForFile);
        
        if(ws2_32::GetInstance().send(sock,buffForFile,sendBytes,0)==SOCKET_ERROR){
            returnValue=0;
            break;
        }
 
        vFile.SetOffset(vFile.GetOffset()+readBytes);
    }
            
    vFile.SetOffset(0);
        
            
    my::free(buffForFile);
 
    return returnValue;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2011, 13:28     Отправка На Почту
Еще ссылки по теме:

C++ SMTP Отправка файла на почту
C++ Программа которая отправляет файл на почту
Как отправить почту через Telnet? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 13:28     Отправка На Почту #15
Цитата Сообщение от Saiberg Посмотреть сообщение
в инете нечего не нашел. отснифал трафик мэйл клиента.
круто! вместо того, чтоб прочитать rfc, препарируешь протокол снифером))
Yandex
Объявления
26.03.2011, 13:28     Отправка На Почту
Ответ Создать тему
Опции темы

Текущее время: 09:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru