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

SMTP Отправка файла на почту - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.96
Ineibet
 Аватар для Ineibet
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 12
13.02.2013, 22:00     SMTP Отправка файла на почту #1
Здравствуйте! Вот пытаюсь дописать код для отправки файлов на почту, код взял здесь на форуме. Всё дело в том что не отправляет файлы больших размеров, от файла приходит только 7 байт. Что можно сделать?!

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
#include <iostream>
#include <fstream>
#include <windows.h>
#pragma pack(1)
#pragma comment(lib,"Ws2_32.lib")
 
using namespace std;
 
void Base64Encode(const char* pText, char* pResBuf, std::size_t bufLen)
{
    static union
    {
        char arr[3];
        struct
        {
            unsigned a1 : 6, a2 : 6, a3 : 6, a4 : 6;
        } s;
    };
    static char ini[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
    memset(pResBuf, '\0', bufLen);
    int size = std::strlen (pText);
    int i, j, k;
    for(i = 0, k = 0; i < size;)
    {
        arr[0] = arr[1] = arr[2] = '\0';
        for(j = 2; j >= 0 && i < size; --j, ++i)
        {
            arr[j] = pText[i];
        }
        pResBuf[k++] = ini[s.a4];
        pResBuf[k++] = ini[s.a3];
        pResBuf[k++] = (1 > j ? ini[s.a2] : '=');
        pResBuf[k++] = (0 > j ? ini[s.a1] : '=');
    }
    return;
}
 
int main ()
{
    std::ifstream ifs("Sending.rar", std::ios::binary);
    if(ifs.is_open())
    {
        setlocale(LC_ALL,"Russian");
        SOCKET nSMTPServerSocket;
        struct sockaddr_in smtp_address;
        int nConnect, iMsg = 0, iEnd = 0, rc;
        char sBuf[4096], buffer2[512];
        char hostname[80] = "smtp.yandex.ru"; // Почтовый сервер ящика отправителя
        hostent *h = NULL;
        char login[] = "Login@yandex.ru", password[] = "Password"; // Логин и пароль ящика отправителя
        
        // Размер файла
        FILE* file = fopen("Sending.rar", "rb");
        if( file==NULL ) return -1;
        fseek(file, 0, SEEK_END);
        long size = ftell(file);
        char* fileContent = new char[size];
        size_t index;
        for(index = 0; ifs.get(fileContent[index]); ++index);
        fileContent[index] = 0;
        char seventhString[1024] =
            "from:<Login@yandex.ru>\r\n" // Ящик отправителя
            "to:<To@yandex.ru>\r\n"  // Ящик получателя
            "subject: Письмо\r\n"
            "Mime-Version: 1.0\r\n"
            "Content-Type: multipart/mixed; boundary=bound\r\n"
            "\r\n--bound\r\n"
            "Content-type: text/plain; charset=windows-1251\r\n"
            "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
            "Текст тут\r\n" //текст письма
            "\r\n--bound\r\n"
            "Content-Type: plain; name=Sending.rar\r\n" // Имя файла
            "Content-Transfer-Encoding: base64\r\n"
            "Content-Disposition: attachment\r\n\r\n";
        char seventhStringMiddle[512];
        char seventhStringEnd[] = "\r\n--bound--\r\n.\r\n";
 
        char MailMessage[][1024] =
        {
            "EHLO mail.ru\r\n",
            "AUTH LOGIN\r\n",
            "",
            "",
            "mail from:<Login@yandex.ru>\r\n", // Ящик отправителя
            "rcpt to:<To@yandex.ru>\r\n", // Ящик получателя
            "data\r\n",
            "",
            "QUIT\r\n"
        };
 
        Base64Encode(login, buffer2, sizeof(buffer2));
        strcpy(MailMessage[2], strcat(buffer2,"\r\n"));
 
        Base64Encode(password, buffer2, sizeof(buffer2));
        strcpy(MailMessage[3], strcat(buffer2,"\r\n"));
 
        Base64Encode(fileContent, seventhStringMiddle, sizeof(seventhStringMiddle));
        strcat(seventhString, strcat(strcat(seventhStringMiddle,"\r\n"), seventhStringEnd));
        strcpy(MailMessage[7], seventhString);
 
        WSADATA WSAData;
        rc = WSAStartup(MAKEWORD(1, 1), &WSAData);
        if(rc) return __LINE__;
        nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);
        if(nSMTPServerSocket != INVALID_SOCKET)
        {
            smtp_address.sin_family = AF_INET;
            h = gethostbyname(hostname);
            if (h == NULL)
            {
                printf("error: Could not resolve ");
                getchar();
                return __LINE__;
            }
            smtp_address.sin_addr.s_addr = inet_addr(inet_ntoa(*(reinterpret_cast<in_addr*>(h->h_addr))));
            smtp_address.sin_port = htons(25);
            nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address,
                                                                sizeof(smtp_address));
            if(!nConnect)
            {
                iMsg = iEnd = 0;
                do
                {
                    iEnd = recv(nSMTPServerSocket, sBuf, sizeof(sBuf), 0);
                    sBuf[iEnd] = '\0';
                    printf("Answer: %s", sBuf);
                    printf("Request: %s", MailMessage[iMsg]);
                    send(nSMTPServerSocket, MailMessage[iMsg], strlen(MailMessage[iMsg]), 0);
                    iMsg++;
                } while(iMsg < int(sizeof(MailMessage) / sizeof(*MailMessage)));
                iEnd = recv(nSMTPServerSocket, sBuf, sizeof(sBuf), 0);
                sBuf[iEnd] = '\0';
                printf(sBuf);
            }
            closesocket(nSMTPServerSocket);
        }
        ifs.close();
    }
    else
        std::cerr << "Unable to open input file" << std::endl;
    getchar();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2013, 22:00     SMTP Отправка файла на почту
Посмотрите здесь:

C++ Отправка На Почту
C++ Отправка файла
Отправка содержимого текстового файла на почту C++
C++ клиент и сервер под SMTP
C++ Алгоритм отправки файла на почту
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NIKOLAYY
718 / 697 / 154
Регистрация: 22.09.2012
Сообщений: 4,865
13.02.2013, 22:14     SMTP Отправка файла на почту #2
Обьясни свой код. Это 140 сторок чтоб 1 файл на почту ушел?
Ineibet
 Аватар для Ineibet
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 12
13.02.2013, 22:18  [ТС]     SMTP Отправка файла на почту #3
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Обьясни свой код. Это 140 сторок чтоб 1 файл на почту ушел?
Да код не мой, просто поправляю что бы отправить файл на почту! Какие есть другие варианты?!
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
13.02.2013, 22:27     SMTP Отправка файла на почту #4
лол, на C# это в 5 строчек делается...)
Ineibet
 Аватар для Ineibet
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 12
13.02.2013, 22:39  [ТС]     SMTP Отправка файла на почту #5
Ну хоть кто нибудь подскажет как это сделать?!
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
13.02.2013, 22:46     SMTP Отправка файла на почту #6
Цитата Сообщение от Ineibet Посмотреть сообщение
Ну хоть кто нибудь подскажет как это сделать?!
код не смотрел, но почти все почтовые сервисы ограничивают размер отправляемого файла...до 30 метров где-нибуть...)
Ineibet
 Аватар для Ineibet
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 12
13.02.2013, 23:13  [ТС]     SMTP Отправка файла на почту #7
Цитата Сообщение от NeonLost Посмотреть сообщение
код не смотрел, но почти все почтовые сервисы ограничивают размер отправляемого файла...до 30 метров где-нибуть...)
Так мне не удаётся даже 7 Мб отправить
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
13.02.2013, 23:18     SMTP Отправка файла на почту #8
Цитата Сообщение от NeonLost Посмотреть сообщение
лол, на C# это в 5 строчек делается...)
Ага зато тянет NET за собой.

Добавлено через 2 минуты
Цитата Сообщение от Ineibet Посмотреть сообщение
Да код не мой, просто поправляю что бы отправить файл на почту! Какие есть другие варианты?!
Во первых почитать RFC http://rfc2.ru/5321.rfc

Да и возможно стоит использовать какую нибудь готовую либу ?
Ineibet
 Аватар для Ineibet
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 12
13.02.2013, 23:32  [ТС]     SMTP Отправка файла на почту #9
Цитата Сообщение от Avazart Посмотреть сообщение
Ага зато тянет NET за собой.

Добавлено через 2 минуты

Во первых почитать RFC http://rfc2.ru/5321.rfc

Да и возможно стоит использовать какую нибудь готовую либу ?
Спасибо за информацию, конечно можно было бы использовать готовую библиотеку, но хотелось бы узнать почему именно такой код не работает
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
13.02.2013, 23:37     SMTP Отправка файла на почту #10
Есть такая штука как телнет клиент ( через консоль) им можно пощупать то как оно делается http://www.shkodenko.kiev.ua/index.p...content_id=138

Добавлено через 1 минуту
но хотелось бы узнать почему именно такой код не работает
Нужно смотреть что отвечает вам сервер на каждый ваш запрос...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 01:15     SMTP Отправка файла на почту
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Ineibet
 Аватар для Ineibet
0 / 0 / 0
Регистрация: 03.02.2013
Сообщений: 12
14.02.2013, 01:15  [ТС]     SMTP Отправка файла на почту #11
Цитата Сообщение от Avazart Посмотреть сообщение
Есть такая штука как телнет клиент ( через консоль) им можно пощупать то как оно делается http://www.shkodenko.kiev.ua/index.p...content_id=138

Добавлено через 1 минуту

Нужно смотреть что отвечает вам сервер на каждый ваш запрос...
Знаю что через Telnet можно.

Вывод вот такой на все запросы. Ну это когда пытаюсь отправить архив.

Answer: 220 smtp17.mail.yandex.net ESMTP (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru)
Request: EHLO mail.ru
Answer: 250-smtp17.mail.yandex.net
250-8BITMIME
250-PIPELINING
250-SIZE 42991616
250-STARTTLS
250-AUTH LOGIN PLAIN
250-DSN
250 ENHANCEDSTATUSCODES
Request: AUTH LOGIN
Answer: 334 VXNlcm5hdfgt
Request: cmVndHBAeWFuZGV4dfgh
Answer: 334 UGFzc3dvfgtj
Request: NTI4Njk2dfhyu
Answer: 235 2.7.0 Authentication successful.
Request: mail from:<Login@yandex.ru>
Answer: 250 2.1.0 <Login@yandex.ru> ok
Request: rcpt to:<To@yandex.ru>
Answer: 250 2.1.5 <To@yandex.ru> recipient ok
Request: data
Answer: 354 Enter mail, end with "." on a line by itself
Request: from:<Login@yandex.ru>
to:<To@yandex.ru>
subject: Письмо
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary=bound

--bound
Content-type: text/plain; charset=windows-1251
Content-Transfer-Encoding: quoted-printable

Текст тут

--bound
Content-Type: plain; name=Sending.rar
Content-Transfer-Encoding: base64
Content-Disposition: attachment

UmFyIRoH

--bound--
.
Answer: 250 2.0.0 Ok: queued on smtp17.mail.yandex.net as 6jSKahuH-6kSuegoE
Request: QUIT
221 2.0.0 Closing connection.

Ну а вот когда пытаюсь отправить обычный текст, то отправляет не больше 4 Кб. Пытался выделить определённое количество памяти в зависимости от размера файла, но как понял это ничего не даёт!
Yandex
Объявления
14.02.2013, 01:15     SMTP Отправка файла на почту
Ответ Создать тему
Опции темы

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