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

Отправка файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 5.00
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
23.06.2011, 18:24     Отправка файла #1
Как отправить файл по email используя WinAPI или Qt.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
24.06.2011, 02:45     Отправка файла #2
протокол SMTP и сокеты юзать надо. Погугли, должна быть масса примеров
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.06.2011, 02:55     Отправка файла #3
да, мануал говорит
Класс QTcpSocket предоставляет интерфейс для TCP. Вы можете использовать QTcpSocket для создания стандартных сетевых протоколов таких как POP3, SMTP и NNTP, и для других.
Добавлено через 37 секунд
дальше какието готовые решения искать
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.06.2011, 07:35     Отправка файла #4
В WinAPI это сокеты, в Borland C++ Builder есть всё для отрпавки по SMTP протоколу по MAPI.

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
        TMapiMessage MapiMessage;
        TMapiRecipDesc SenderDesc;
        TMapiRecipDesc RecipDesc;
        TMapiFileDesc  Files;
 
        memset((void*)&SenderDesc,'\0',sizeof(SenderDesc));
 
        SenderDesc.ulRecipClass = MAPI_ORIG;
        RecipDesc.ulReserved = 0;
        RecipDesc.ulRecipClass = MAPI_TO;
        RecipDesc.lpszName = "Алексею";
        RecipDesc.lpszAddress ="SMTP:pupkin@example.com";  // адрес получателя
        RecipDesc.ulEIDSize = 0;
        RecipDesc.lpEntryID = NULL;
 
        Files.ulReserved = 0;
        Files.flFlags = 0;
        Files.nPosition = -1;
        Files.lpszPathName = "X:\\lesson.doc";    // путь к файлу для отрпавки
        Files.lpszFileName = "lesson.doc";  // тут имя файла без пути
        Files.lpFileType = NULL;
 
        MapiMessage.ulReserved = 0;
        MapiMessage.lpszSubject = "Название тема сообщения";
        MapiMessage.lpszNoteText = "Текст соощения";
        MapiMessage.lpszMessageType = NULL;
        MapiMessage.lpszDateReceived = NULL;
        MapiMessage.lpszConversationID = NULL;
        MapiMessage.flFlags = 0;
        MapiMessage.lpOriginator = &SenderDesc;
        MapiMessage.nRecipCount = 1;
        MapiMessage.lpRecips = &RecipDesc;
        MapiMessage.nFileCount = 1;
        MapiMessage.lpFiles = &Files;
 
        MapiSendMail(0, (ULONG)Application->Handle, MapiMessage, MAPI_DIALOG | MAPI_LOGON_UI |  MAPI_NEW_SESSION, 0);
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
24.06.2011, 11:09  [ТС]     Отправка файла #5
xAtom, а как сделать при помощи сокетов?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
24.06.2011, 19:24     Отправка файла #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Юзайте лучше boost. Вот отправка с прикреплённым файлом.
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
#include <iostream>
#include <ostream>
#include <string>
#include <fstream>
#include <iterator>
#include <windows.h> // CharToOem
#include <boost/asio.hpp>
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
namespace iters=boost::archive::iterators;
typedef boost::asio::ip::tcp tcp;
typedef iters::base64_from_binary<iters::transform_width<std::string::const_iterator, 6, 8>>
    base64_t;
 
boost::asio::streambuf reqBuf, respBuf;
std::ostream reqStream(&reqBuf);
tcp::socket* psock;
 
void SendRequest(std::string s){
    reqStream<<s<<"\r\n";
    boost::asio::write(*psock, reqBuf);
}
 
std::size_t PrintResponse(){
    std::size_t len=boost::asio::read_until(*psock, respBuf, "\r\n");
    std::cout<<&respBuf;
    return len;
}
 
std::string Encode(const std::string& s){
    return std::string(base64_t(s.begin()), base64_t(s.end()));
}
 
int main(){
    try{
        std::ifstream ifs("1.txt"); // прикреплённый файл
        if(!ifs){std::cerr<<"File not found\n"; return 1;}
        std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()), encStr(Encode(str));
        ifs.close();
        // авторизация на ящик отправителя
        std::string login="name1", encLogin(Encode((login))); //имя
        std::string passw="passw1", encPassw(Encode(passw));  //пароль
        std::string host="smtp.mail.ru"; // почтовый сервер
        boost::asio::io_service io;
        tcp::resolver resolver(io);
        tcp::resolver::query query(host, "25"); //default smtp port
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
        tcp::socket sock(io);
        psock=&sock;
        boost::system::error_code error = boost::asio::error::host_not_found;
        while (error && endpoint_iterator != end){
            sock.close();
            sock.connect(*endpoint_iterator++, error);
        }
        if (error) throw boost::system::system_error(error);
        PrintResponse();
        SendRequest("ehlo myhost");
        PrintResponse();
        SendRequest("auth login");//выбираем авторизацию по login
        PrintResponse();
        SendRequest(encLogin);
        PrintResponse();
        SendRequest(encPassw);
        PrintResponse();
        SendRequest("mail from:<name1@mail.ru>");//ящик отправителя
        PrintResponse();
        SendRequest("rcpt to:<name2@yandex.ru>");// ящик получателя
        PrintResponse();
        SendRequest("data");
        PrintResponse();
        SendRequest("from:<name1@mail.ru>");  //это
        SendRequest("to:<name2@yandex.ru>"); //не
        SendRequest("subject: Some subject"); //спам
        SendRequest("Mime-Version: 1.0");
        SendRequest("Content-Type: multipart/mixed; boundary=bound");
        SendRequest("\r\n--bound");
        SendRequest("Content-type: text/plain; charset=windows-1251");
        SendRequest("Content-Transfer-Encoding: quoted-printable\r\n");
        SendRequest("It's letter's text\r\nThis letter has attaching file.");//текст письма
        SendRequest("\r\n--bound");
        SendRequest("Content-Type: text/plain; name=file.txt");
        SendRequest("Content-Transfer-Encoding: base64");
        SendRequest("Content-Disposition: attachment\r\n");
        SendRequest(encStr);
        SendRequest("\r\n--bound--\r\n.");
        PrintResponse();
        SendRequest("quit");
        PrintResponse();
        sock.close();
    }
    catch (std::exception& e){
        char buf[512];
        CharToOem(e.what(), buf);
        std::cout << "Exception: " << buf << "\n";
    }
    return 0;
}
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
25.02.2012, 18:42     Отправка файла #7
Цитата Сообщение от igorrr37 Посмотреть сообщение
Юзайте лучше boost. Вот отправка с прикреплённым файлом.
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
#include <iostream>
#include <ostream>
#include <string>
#include <fstream>
#include <iterator>
#include <windows.h> // CharToOem
#include <boost/asio.hpp>
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
namespace iters=boost::archive::iterators;
typedef boost::asio::ip::tcp tcp;
typedef iters::base64_from_binary<iters::transform_width<std::string::const_iterator, 6, 8>>
    base64_t;
 
boost::asio::streambuf reqBuf, respBuf;
std::ostream reqStream(&reqBuf);
tcp::socket* psock;
 
void SendRequest(std::string s){
    reqStream<<s<<"\r\n";
    boost::asio::write(*psock, reqBuf);
}
 
std::size_t PrintResponse(){
    std::size_t len=boost::asio::read_until(*psock, respBuf, "\r\n");
    std::cout<<&respBuf;
    return len;
}
 
std::string Encode(const std::string& s){
    return std::string(base64_t(s.begin()), base64_t(s.end()));
}
 
int main(){
    try{
        std::ifstream ifs("1.txt"); // прикреплённый файл
        if(!ifs){std::cerr<<"File not found\n"; return 1;}
        std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()), encStr(Encode(str));
        ifs.close();
        // авторизация на ящик отправителя
        std::string login="name1", encLogin(Encode((login))); //имя
        std::string passw="passw1", encPassw(Encode(passw));  //пароль
        std::string host="smtp.mail.ru"; // почтовый сервер
        boost::asio::io_service io;
        tcp::resolver resolver(io);
        tcp::resolver::query query(host, "25"); //default smtp port
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
        tcp::socket sock(io);
        psock=&sock;
        boost::system::error_code error = boost::asio::error::host_not_found;
        while (error && endpoint_iterator != end){
            sock.close();
            sock.connect(*endpoint_iterator++, error);
        }
        if (error) throw boost::system::system_error(error);
        PrintResponse();
        SendRequest("ehlo myhost");
        PrintResponse();
        SendRequest("auth login");//выбираем авторизацию по login
        PrintResponse();
        SendRequest(encLogin);
        PrintResponse();
        SendRequest(encPassw);
        PrintResponse();
        SendRequest("mail from:<name1@mail.ru>");//ящик отправителя
        PrintResponse();
        SendRequest("rcpt to:<name2@yandex.ru>");// ящик получателя
        PrintResponse();
        SendRequest("data");
        PrintResponse();
        SendRequest("from:<name1@mail.ru>");  //это
        SendRequest("to:<name2@yandex.ru>"); //не
        SendRequest("subject: Some subject"); //спам
        SendRequest("Mime-Version: 1.0");
        SendRequest("Content-Type: multipart/mixed; boundary=bound");
        SendRequest("\r\n--bound");
        SendRequest("Content-type: text/plain; charset=windows-1251");
        SendRequest("Content-Transfer-Encoding: quoted-printable\r\n");
        SendRequest("It's letter's text\r\nThis letter has attaching file.");//текст письма
        SendRequest("\r\n--bound");
        SendRequest("Content-Type: text/plain; name=file.txt");
        SendRequest("Content-Transfer-Encoding: base64");
        SendRequest("Content-Disposition: attachment\r\n");
        SendRequest(encStr);
        SendRequest("\r\n--bound--\r\n.");
        PrintResponse();
        SendRequest("quit");
        PrintResponse();
        sock.close();
    }
    catch (std::exception& e){
        char buf[512];
        CharToOem(e.what(), buf);
        std::cout << "Exception: " << buf << "\n";
    }
    return 0;
}
У меня данный пример вылетает с ошибкой string iterator not dereferencable.
Как я понимаю, не может разыменовать. Это только у меня так или как? ))
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
25.02.2012, 19:09     Отправка файла #8
работает
Миниатюры
Отправка файла  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2012, 22:04     Отправка файла
Еще ссылки по теме:

C++ SMTP Отправка файла на почту
C++ dev с++ Отправка на мыло файла
C++ Отправка файла по почте

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

Или воспользуйтесь поиском по форуму:
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
25.02.2012, 22:04     Отправка файла #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
для VS
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
#include <stdafx.h>
#include <iostream>
#include <ostream>
#include <string>
#include <fstream>
#include <bitset>
#include <iterator>
#include <boost/asio.hpp>
#include <windows.h> // CharToOem
typedef boost::asio::ip::tcp tcp;
 
boost::asio::streambuf reqBuf, respBuf;
std::ostream reqStream(&reqBuf);
tcp::socket* psock;
 
void SendRequest(std::string s){
    reqStream<<s<<"\r\n";
    boost::asio::write(*psock, reqBuf);
}
 
std::size_t PrintResponse(){
    std::size_t len=boost::asio::read_until(*psock, respBuf, "\r\n");
    std::cout<<&respBuf;
    return len;
}
 
std::string Encode(const std::string& s)
{
    std::size_t size = s.size();
    std::string ini("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"), out, bits;
    char buf[3];
    int la = 0, lb = 0;
    for(int j = 0; j < size; j += 3)
    {
        bits.clear();
        for(int i = 0; i < 3; ++i) buf[i] = '\0';
        buf[0] = s[j];
        if(j + 1 < size) buf[1] = s[j + 1];
        else la = 1;
        if(j + 2 < size) buf[2] = s[j + 2];
        else lb = 1;
        for(int k = 0; k < 3; ++k)
        {
            for(int l = 7; l >= 0; --l)
            {
                bits.push_back((buf[k] >> l) & 1 ? '1' : '0');
            }
        }
        //std::cout << bits << std::endl;
        for(int l = 0; l < 4; ++l)
        {
            int m = (l + 1) * 6 - 1, n = l * 6;
            std::bitset<6> b(std::string(&bits[n], &bits[m + 1]));
            //std::cout << b.to_ulong() << std::endl;
            if((l == 2 && la) || (l == 3 && lb))
            {
                out.push_back('=');
            }
            else out.push_back(ini[b.to_ulong()]);
        }
    }
    //std::cout << "out : " << out << std::endl;
    return out;
}
 
int main(){
    try{
        std::ifstream ifs("1.txt"); // прикреплённый файл
        if(!ifs){std::cerr<<"File not found\n"; return 1;}
        std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()), encStr(Encode(str));
        ifs.close();
        // авторизация на ящик отправителя
        std::string login="name1", encLogin(Encode((login))); //имя
        std::string passw="passw1", encPassw(Encode(passw));  //пароль
        std::string host="smtp.mail.ru"; // почтовый сервер
        boost::asio::io_service io;
        tcp::resolver resolver(io);
        tcp::resolver::query query(host, "25"); //default smtp port
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
        tcp::socket sock(io);
        psock=&sock;
        boost::system::error_code error = boost::asio::error::host_not_found;
        while (error && endpoint_iterator != end){
            sock.close();
            sock.connect(*endpoint_iterator++, error);
        }
        if (error) throw boost::system::system_error(error);
        PrintResponse();
        SendRequest("ehlo myhost");
        PrintResponse();
        SendRequest("auth login");//выбираем авторизацию по login
        PrintResponse();
        SendRequest(encLogin);
        PrintResponse();
        SendRequest(encPassw);
        PrintResponse();
        SendRequest("mail from:<name1@mail.ru>");//ящик отправителя
        PrintResponse();
        SendRequest("rcpt to:<name2@yandex.ru>");// ящик получателя
        PrintResponse();
        SendRequest("data");
        PrintResponse();
        SendRequest("from:<name1@mail.ru>");  //это
        SendRequest("to:<name2@yandex.ru>"); //не
        SendRequest("subject: Some subject"); //спам
        SendRequest("Mime-Version: 1.0");
        SendRequest("Content-Type: multipart/mixed; boundary=bound");
        SendRequest("\r\n--bound");
        SendRequest("Content-type: text/plain; charset=windows-1251");
        SendRequest("Content-Transfer-Encoding: quoted-printable\r\n");
        SendRequest("It's letter's text\r\nThis letter has attaching file.");//текст письма
        SendRequest("\r\n--bound");
        SendRequest("Content-Type: text/plain; name=file.txt");
        SendRequest("Content-Transfer-Encoding: base64");
        SendRequest("Content-Disposition: attachment\r\n");
        SendRequest(encStr);
        SendRequest("\r\n--bound--\r\n.");
        PrintResponse();
        SendRequest("quit");
        PrintResponse();
        sock.close();
        std::cin.sync();
        std::cin.get();
    }
    catch (std::exception& e){
        char buf[512];
        CharToOemA(e.what(), buf);
        std::cout << "Exception: " << buf << "\n";
    }
    return 0;
}
Yandex
Объявления
25.02.2012, 22:04     Отправка файла
Ответ Создать тему
Опции темы

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