Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2015, 11:08   #1
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию Отправка письма с прикрепленным файлом на SMTP через Winsock+OpenSSL Visual Studio C++ 2010

Недавно начал изучать Winsock и решил сделать отправку на почту вроде бы все шло хорошо но сервер выдал что нужна шифрация SSL ну вроде и это осилил письмо оправил все ок )) Потом решил прикрепить файл и тут началось )) все что я смог это отправить текстовик в Base64 и то пришел кусок текста ((
Цель: отправить фалы с вложением на почту Mail (текст + файл(бинарный)) и что бы он пришел не кодированный (как это делает Outlook т.е на почту приходит нормальный работающий Rar архив который не приходиться дешефровать)

Код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include "stdafx.h"
#include <stdlib.h>
#include <sys/stat.h>
#include <io.h>
#include <string>

#include <WinSock.h>
#include <TlHelp32.h>
#include <windows.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")


#include <openssl\bio.h>
#include <openssl\err.h>
#include <openssl\ssl.h>

using namespace std;

void FreeMemoryMassChar(char s1[])
	{
	char c[]= " ";
	int i = 0;
	for (; i < strlen(s1); i++)
	   if (int(s1[i])== -52) s1[i] = c[1];
	s1[i+1]=NULL;
	}

bool ReadFileAll(FILE *fp, char buf[], int sizeFile)
	{
	char ch;
	int sizeCharMass = strlen(buf);
	if (sizeCharMass < sizeFile) return false; 

	for(int i = 0; i < sizeFile; i++)
	 		{
		ch=fgetc(fp);
		buf[i]=ch;
			}
		FreeMemoryMassChar(buf);
	return true;
	}

int SendMailMessage( )
{

 //-----------------------------------------
	WSADATA wsa;
        int x = WSAStartup(MAKEWORD(2,0),&wsa);

        if ( !x)
              printf( "%i\n", x );

        struct sockaddr_in addr;
        int size;
        SOCKET s;
		char text[1024];
        struct hostent *d_addr;
        //char hostname[1000];
        char buf[1000];
        char request[1000];

        SSL_CTX *ctx;
        SSL *ssl;
        int err;

        //printf("\nEnter Hostname: ");
        //scanf("%s", &hostname);
        d_addr = gethostbyname("smtp.mail.ru");
        if (d_addr == NULL) {
                fprintf(stderr, "Unknown Host %s\n", "smtp.mail.ru");
                return 0;
        }
        fflush(stdout);
        s = socket(AF_INET, SOCK_STREAM, 0);
        if (s < 0) {
                fprintf(stderr, "Socket Error\n");
                return -1;
        }
        addr.sin_family = AF_INET;
        addr.sin_addr = *((struct in_addr *)d_addr->h_addr);
        addr.sin_port = htons(465);
        if (connect(s, (LPSOCKADDR)&addr, sizeof(addr)) == -1) {
                closesocket(s);
                fprintf(stderr, "Connection Error\n");
                return -1;
        }
        // registers the error strings for all libssl functions
        SSL_load_error_strings();
        //This is the first SSL function that an application issues before issuing any other SSL function
        SSL_library_init();
        ctx=SSL_CTX_new(SSLv23_method());
        // creates a new SSL structure which is needed to hold the data for a TLS/SSL connection
        ssl=SSL_new(ctx);
        if(ssl < 0) {
                closesocket(s);
                fprintf(stderr, "SSL creation error\n");
                return -1;
        }
        //sets the file descriptor s as the input/output facility for the TLS/SSL (encrypted) side of ssl
        SSL_set_fd(ssl, s);
        err=SSL_connect(ssl);
        if(err < 0) {
                closesocket(s);
                fprintf(stderr, "SSL connect error\nretval: %d\n", err);
                err=SSL_get_error(ssl, err);
                fprintf(stderr, "SSL error: %d\n", err);
                return -1;
        }

        if(!err) {
                closesocket(s);
                fprintf(stderr, "SSL write error\n");
                return -1;
        }
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 11:10   #2
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

Код:
//--------------------------------------обшение с сервером после установки шифрациии--------------------------//
int read_size;
				//              Приветствие
                sprintf( request,"EHLO smtp.mail.ru\r\n" );
                err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 11:10   #3
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

Код:
//-----------------------------------Начало авторизации---------------------------------//
			    //            Авторизация
                sprintf( request,"AUTH LOGIN\r\n" );
                err = SSL_write(ssl, request, strlen(request));
				  read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
				//        ввод логина в кодировке Base 64
				sprintf( request,"Login\r\n" );
                err = SSL_write(ssl, request, strlen(request));

                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
				//        ввод пароля в кодировке Base 64
				sprintf( request,"PassWord=\r\n" );
                err = SSL_write(ssl, request, strlen(request));

                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
				        read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}

								FILE *fp;
fopen_s(&fp,"123.txt", "rb+");//printf("%i\n",fp);
	
if(fp == NULL) 
{
printf ("Cannot open file.\n");
return -1;
exit(1);
} 

	     struct stat fi;
    stat("123.txt",&fi);
    printf("file size: %d\n",fi.st_size);
//-----------------------------------конец авторизации---------------------------------//
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 11:11   #4
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

Код:
				// начинаем отправлять конверт состоящий из полей
				// MAIL FROM: и RCPT TO: После каждого поля ждем
				// подтверждение

								// сообщаем отправителя
                sprintf( request,"MAIL FROM:<123@mail.ru>\r\n" );
                err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}

							// сообщаем получателя
                sprintf( request,"RCPT TO:<123@mail.ru>\r\n" );
                err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}

				         err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
	

				//  Сообшаем серверу что будем отправлять письмо
				printf("DATA:\n");
				          sprintf( request,"DATA\r\n" );
                err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.

Последний раз редактировалось Binary_Dll; 26.04.2015 в 11:14.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 11:12   #5
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

Код:
				printf("Message:\n");					// текст письма

			   // sprintf( request,"%s%s%s%s\n","Login :",(const char *)Login,"Passord :",PasWord);" Пароль:",PasWord C:\Users\packard bell\Documents\Visual Studio 2010\Projects\exe\Debug\ftp.rar
                 				//sprintf( request,"------------Qmailer\r\n\t");  
				//err = SSL_write(ssl, request, strlen(request));

						 
				sprintf( request,"Content-Type: multipart/mixed; boundary=\"------------Qmailer\"\r\n");
				err = SSL_write(ssl, request, strlen(request));

				sprintf( request,"------------Qmailer\r\n");
				err = SSL_write(ssl, request, strlen(request));

				sprintf( request,"Content-Type: text/plain; charset=windows-1251\r\n");
				err = SSL_write(ssl, request, strlen(request));

                sprintf( request,"Content-Transfer-Encoding: 8bit\r\n");
				err = SSL_write(ssl, request, strlen(request));

                sprintf( request,"привет, это текст письма\r\n");
				err = SSL_write(ssl, request, strlen(request));

				sprintf( request,"------------Qmailer\r\n\t");
				err = SSL_write(ssl, request, strlen(request));

                sprintf( request,"Content-Type: application/octet-stream;\r\n\t");  
				err = SSL_write(ssl, request, strlen(request));


				sprintf( request,"name=\"123.txt\"\r\n\t");  
				err = SSL_write(ssl, request, strlen(request));

								sprintf( request,"Content-Transfer-Encoding: base64\r\n\t");
				err = SSL_write(ssl, request, strlen(request));

		         sprintf( request,"Content-Disposition: attachment;\r\n\t");
				 err = SSL_write(ssl, request, strlen(request));

				 sprintf( request,"filename=\"123.txt\"\r\n\t"); 
				 err = SSL_write(ssl, request, strlen(request));




				/*sprintf( request,"Expires: 0\r\n\t");
				err = SSL_write(ssl, request, strlen(request));

				sprintf( request,"Cache-Control: must-revalidate\r\n\t");
				err = SSL_write(ssl, request, strlen(request));

				sprintf( request,"Pragma: public\r\n\t");
				err = SSL_write(ssl, request, strlen(request));

				 sprintf( request,"%s%d\r\n\t","Content-Length: ", fi.st_size);  
				 err = SSL_write(ssl, request, strlen(request));*/




//--------файл--------//base64

	 //typedef basic_string <char> TString;
	 //TString FileText;
	TCHAR FileText[1000];

	ReadFileAll(fp, (char *)FileText, fi.st_size); 
		//FreeMemoryMassChar(FileText); 
	printf("%s\n", FileText); 
	err = SSL_write(ssl, FileText, fi.st_size);
		//sprintf(request, "%s", FileText); 
		// err = SSL_write(ssl, request, strlen(request));
    //printf("%s", FileText.c_str());		
		//sprintf( request,"%s", FileText);
	//printf("%c", ch);
		//}
fclose(fp);
	 //------------- end -----------------//

				//sprintf( request,"------------Qmailer\r\n\t");
               // err = SSL_write(ssl, request, strlen(request));
				
					sprintf( request,"------------Qmailer\r\n\t");
				err = SSL_write(ssl, request, strlen(request));
				

				
				/*sprintf( request,"----------A4D921C2D10D7DB");
				err = SSL_write(ssl, request, strlen(request));

				sprintf( request,"\"Content-Type: application/octet-stream; name=\"ftp.rar\"");
				err = SSL_write(ssl, request, strlen(request));
                sprintf( request,"Content-transfer-encoding: base64");
				err = SSL_write(ssl, request, strlen(request));
				sprintf( request,"\"Content-Disposition: attachment; filename=\"ftp.rar\"");
				err = SSL_write(ssl, request, strlen(request));

				//err = SSL_file(&fp);
				//err = SSL_write(ssl, &fp, sizeFILE);*/
				
				printf("End Message:\n");						// говорим, что закончили
                sprintf( request,"\r\n.\r\n"); //\r\n.\r\n
                err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 11:13   #6
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

Код:
				printf("\nQUIT...\n"); // прощаемся с сервером
                sprintf( request,"QUIT\r\n" );
               err = SSL_write(ssl, request, strlen(request));
                read_size = SSL_read(ssl, buf, sizeof(buf) );
                if ( read_size > 0 )
                {
                        buf[read_size]='\0';
                        printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                }
                else
                {
                        switch( SSL_get_error( ssl, read_size ) )
                        {
                                case SSL_ERROR_ZERO_RETURN:
                                        printf( "ZERO" );
                                        break;

                                case SSL_ERROR_NONE:
                                        printf( "No Error" );
                                        break;

                                case SSL_ERROR_SSL:
                                        printf( "SSL ERROR" );
                                        break;
                        }
				}
				//system("pause");


//-----------------------------------окончание обшения с сервером и закритие сокетов SLL шифрования итд--------------------------//
        SSL_shutdown(ssl);
        SSL_free(ssl);
        SSL_CTX_free(ctx);
        fflush(stdout);
        closesocket(s);
        return 0;

}



int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы
SendMailMessage( );

	system("pause"); //exit(1);  
}
в конце уже были наркоманские попытки отправить но я не смог
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 18:32   #7
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

ну ни кто не поможет что ли ? (((
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 18:44   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Даже если бы я захотел помочь, мне влом собирать прогу из десятка постов...
waleri вне форума Ответить с цитированием
Старый 26.04.2015, 18:48   #9
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Даже если бы я захотел помочь, мне влом собирать прогу из десятка постов...
дак я могу исходничек кинуть ))
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Старый 26.04.2015, 18:51   #10
Binary_Dll
Пользователь
 
Регистрация: 10.02.2015
Сообщений: 20
По умолчанию

хотя мне нужно понять как отправлять файл на мыло то есть примерно что для этого нужно или где прочесть можно.
В мире есть 10 категорий людей – те, кто знают про двоичное счисление и те кто нет.
Binary_Dll вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Через какой компанент реализовать интерфейс? c# ms visual studio 2010. dima1257 C# (си шарп) 4 28.12.2013 12:04
(Visual studio 2010 C#) Сохранение информации в БД через textBox desplenni Помощь студентам 0 18.12.2013 13:33
Отправка письма с файлом Mick_20 PHP 1 26.08.2013 13:46
Отправка письма через SMTP GrabbeR Работа с сетью в Delphi 4 23.04.2012 02:49