Envoi mail smtp, attachement [demande forum]

Contenu du snippet

Se trouve aussi ici: http://www.dev.winsysdev.com/

Voici une fonction qui permet d'envoyer des mails avec des fichiers en attachement directement via un serveur SMTP.

Exemple d'appel de la fonction :

if ( SendMail(
"smtp.kiapel.com", /* "smtp.wanadoo.fr" "193.252.22.76" */
25,
"wanadoo.fr",
"eee@eee@.com",
"sss@ss.com",
"Test client 2JTEL.",
"Ceci est un <b>petit</b> test.\r\n<br><font color=\"red\">Ca marche !</font>",
true,
3, /* 1, 3, 5 ; 1 : hight, 3 : normal, 5 : low */
"C:\\foret.jpg" /* "C:\\foret.jpg" */
)
== 0 )
{
MessageBox(hWnd, "Envoi : KO", "debug", MB_OK);
}
else
{
MessageBox(hWnd, "Envoi : OK", "debug", MB_OK);
}

Le code est un peu vieux mais fonctionne :-)

Source / Exemple :


int search_text(char *szText, int lg_data, char *szSearch) {
	// On recherche
	int lg_search = strlen(szSearch), i = 0, found = 0;
	int count=0;
	
	for (i=0; i<lg_data; i++)
	{		
		if (szText[i] == szSearch[count])
		{
			found = 1;
			count++;
			if (count == lg_search)
			{
				return 1;
				break;
			}
		}
		else
		{
			count = 0;
			found = 0;
		}
	}

	if (count == lg_search)
	{
		return 1;
	}
	else
	{	
		return 0;
	}

	return 0;
}
/* Fonction permettant l'envoi des données au serveur distant + vérif des réponses */
int SendData(char *szData, bool bControl)
{
	int iEnd=0;
	int iError=0;
	int iTimeOut=0;
	
	/* Petite pause pour éviter de tout exploser */
	Sleep(200L);
	
	/* Envoi des données */
	send(dasock, szData, strlen(szData), 0); 

	if( bControl == true )
	{
		/* On attend un retour */
		/* TimeOut de 2000ms (2s) */
		int iRecv=0;
		while (iEnd != 1)
		{
			if ( (iRecv = recv (dasock, szRecv, SIZE_MSG_MAX, 0)) != SOCKET_ERROR)
            {
				szRecv[iRecv] = '\0';
				/* On verifie les codes de retours qui sont corrects */
				if(search_text( szRecv, strlen( szRecv ), "250" ) == 1 ||
					search_text( szRecv, strlen( szRecv ), "220" ) == 1 ||
					search_text( szRecv, strlen( szRecv ), "354" ) == 1 ||
					search_text( szRecv, strlen( szRecv ), "221" ) == 1
				  ) 
				{
					iEnd = 1;
					iError = 0;
				}
				else 
				{
					iEnd = 1;
					iError = 1;
				}
            }
			else
			{
				iEnd = 1;
				iError = 1;
			}

			if ( iTimeOut >= 20 ) 
			{
				/* TimeOut dépassé */
				iEnd = 1;
				iError = 1;
			}

			iTimeOut++;
			Sleep(100L); /* Laise du temps système */
		}
	}

	if ( iError == 0 )
	{
		return 1;
	}

	return 0;
}

/* Fonction qui construit et envoi l'e-mail */
int SendMail(char *szAddr, int iPort, char *szDomain, char *szSource, char *szDest, char *szSubject, char *szMessage, bool iHTML, unsigned int iPriority, char *szAttach)
{
	char *szBuffer;
	char *szNameAttach;
	char *szTmp;
	unsigned int i=0, i_back=0;

	szBuffer = (char *)malloc(sizeof(char *) * SIZE_MSG_MAX);
	/* Vérification de l'allocation */
	if ( szBuffer == NULL )
	{
		/* Erreur */
		return 0;
	}

	/* Connection au serveur */
	WSADATA WSAData;
    WSAStartup( MAKEWORD( 2, 0 ), &WSAData );

	/* Création du socket */
    dasock = socket( AF_INET, SOCK_STREAM, 0 ); 	
	if ( isalpha( szAddr[0] ) )
	{   
		/* Ce pas une ip */
        LPHOSTENT hp;
		hp = gethostbyname( szAddr );
        if ( hp == NULL )
		{
            return 0;
        }

		byte_copy( hp->h_addr, &dasin.sin_addr.s_addr, hp->h_length );
    } 
	else
	{ 
        dasin.sin_addr.s_addr = inet_addr( szAddr );
    } 

    dasin.sin_family  = AF_INET;
    dasin.sin_port    = htons( iPort );

	/* Attachement du socket */
    if ( connect( dasock, (SOCKADDR *)&dasin, sizeof(dasin) ) == SOCKET_ERROR )
	{
		closesocket(dasock);

		return 0;
	}

	/* Message de courtoisie ;-) */
	strcpy(szBuffer, "HELO ");
	strcat(szBuffer, szDomain);
	strcat(szBuffer, "\r\n");
	if ( SendData(szBuffer, true) == 0 ) { closesocket(dasock); return 0; }

	/* Provient de */
	strcpy(szBuffer, "MAIL FROM:<");
	strcat(szBuffer, szSource);
	strcat(szBuffer, ">\r\n");
	if ( SendData(szBuffer, true) == 0 ) { closesocket(dasock); return 0; }

	/* Envoyer à */
	strcpy(szBuffer, "RCPT TO:<");
	strcat(szBuffer, szDest);
	strcat(szBuffer, ">\r\n");
	if ( SendData(szBuffer, true) == 0 ) { closesocket(dasock); return 0; }

	/* DATA */
	strcpy(szBuffer, "DATA\r\n");
	if ( SendData(szBuffer, true) == 0 ) { closesocket(dasock); return 0; }

	/* Entete */
	
	/* 

  • ************************************************************************ *
  • STRUCTURE D'UN HEADER *
  • ************************************************************************ *
  • Pour avoir plus d'informations sur ce sujet la meilleur solution est de *
  • lire les sources des e-mails qu'en vous envoi. *
  • *
  • Sinon sur Google.fr vous pourrez trouver votre bonheur. *
  • *
  • Ci-dessous une liste de quelques entetes disponibles : *
  • - From: *
  • - To: *
  • - X-Priority: *
  • - Date: *
  • - MIME-Version: *
  • - Cc: *
  • - Bcc: *
  • - Reply-to: *
  • - Return-Path: *
  • - Content-type: *
  • - Content-Transfer-Encoding: *
  • - Content-Disposition: *
  • - ... *
  • ************************************************************************ *
  • /
szTmp = (char *)malloc(sizeof(char *) * 2); /* Vérification de l'allocation */ if ( szTmp == NULL ) { /* Erreur */ closesocket(dasock); return 0; } strcpy(szBuffer, "From: <"); strcat(szBuffer, szSource); strcat(szBuffer, ">\r\nTo: <"); strcat(szBuffer, szDest); strcat(szBuffer, ">\r\nX-Priority: "); itoa(iPriority, szTmp, 10); strcat(szBuffer, szTmp); strcat(szBuffer, "\r\nMINE-Version: 1.0"); strcat(szBuffer, "\r\nSubject: "); strcat(szBuffer, szSubject); strcat(szBuffer, "\r\nContent-type: multipart/mixed;"); strcat(szBuffer, " boundary=bb32f0a41b7155b18982fa256e5974aba\r\n\r\n"); /* Il faudrait générer un boundary aléatoirement */ if ( iHTML == true ) { strcat(szBuffer, "--bb32f0a41b7155b18982fa256e5974aba\r\nContent-Type: text/html\r\nContent-Disposition: inline\r\n\r\n"); } else { strcat(szBuffer, "--bb32f0a41b7155b18982fa256e5974aba\r\nContent-Type: text/plain\r\nContent-Disposition: inline\r\n\r\n"); } if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } /* Liberation de la memoire temporaire */ free( szTmp ); /* Maintenant étant donné que les packets peuvent dépasser les 1024 octects (a cause du message) nous découpons donc ce dernier en packet de 1024-1 puis nous les envoyons */ /* Réinitialisation du buffer */ strcpy(szBuffer, ""); for(i=0; i<=strlen(szMessage); i++, i_back++) { if( i_back >= SIZE_MSG_MAX-1 ) { /* On envoi est on réinitialise le buffer */ if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } strcpy(szBuffer, ""); i_back = 0; } /* On rempli le buffer */ sprintf(szBuffer, "%s%c", szBuffer, szMessage[i]); } /* Envoi du packet en cours de création */ if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } /* Le message est envoyé, nous regardons donc maintenant si il y a un fichier */ if ( strcmp( szAttach, "" ) != 0 ) { /* Un fichier est présent */ FILE *in,*out; sprintf(szBuffer, "%s.tmp", szAttach); if( ( in = fopen( szAttach, "rb" ) ) == NULL || ( out = fopen( szBuffer, "wb") ) == NULL ) { /* Impossible d'ouvrir les fichiers */ closesocket(dasock); return 0; } /* Convertion en base64 */ base64_enc( in, out ); fclose(in); fclose(out); in = NULL; in = fopen(szBuffer,"rb"); if ( in == NULL ) { /* Impossible d'ouvrir le fichier */ closesocket(dasock); return 0; } /* Récupération de la taille du fichier */ int iSize = filelength( _fileno( in ) ); unsigned char *szPtr; szPtr = (unsigned char *)malloc( sizeof(unsigned char *) * iSize); if ( szPtr == NULL ) { /* Erreur d'allocation */ fclose(in); closesocket(dasock); return 0; } /* Lecture du fichier */ fread( szPtr, iSize, 1, in ); /* Avant nous écrivons dans le mail pour signaler qu'un fichier est présent */ strcpy(szBuffer, "\r\n\r\n--bb32f0a41b7155b18982fa256e5974aba\r\n"); szNameAttach = (char *)malloc(sizeof(char *) * 255); /* Vérification de l'allocation */ if ( szNameAttach == NULL ) { /* Erreur */ closesocket(dasock); return 0; } strcpy(szNameAttach, ""); for(i=0; i<=strlen( szAttach ); i++) { if ( szAttach[i] != '\\' ) { sprintf(szNameAttach, "%s%c", szNameAttach, szAttach[i]); } else { strcpy(szNameAttach, ""); } } /* Il ne faudrai pas faire ca de cette manière mais avoir une table, se serai beaucoup plus lisible est maintenable dans le temps... */ if(search_text(szNameAttach, strlen(szNameAttach), ".jpg") == 1 || search_text(szNameAttach, strlen(szNameAttach), ".jpeg") == 1) { strcat(szBuffer, "Content-Type: image/jpeg;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".gif") == 1) { strcat(szBuffer, "Content-Type: image/gif;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".txt") == 1) { strcat(szBuffer, "Content-Type: text/plain;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".htm") == 1 || search_text(szNameAttach, strlen(szNameAttach), ".html") == 1) { strcat(szBuffer, "Content-Type: text/html;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".wav") == 1) { strcat(szBuffer, "Content-Type: audio/x-wav;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".mp3") == 1) { strcat(szBuffer, "Content-Type: audio/x-mp3;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".ogg") == 1) { strcat(szBuffer, "Content-Type: audio/x-ogg;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".mpeg") == 1) { strcat(szBuffer, "Content-Type: audio/x-mpeg;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else if(search_text(szNameAttach, strlen(szNameAttach), ".avi") == 1) { strcat(szBuffer, "Content-Type: video/x-avi;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } else { strcat(szBuffer, "Content-Type: application/octet-stream;\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); strcat(szBuffer, szNameAttach); strcat(szBuffer, "\"\r\n\r\n"); } /* Envoi du packet */ if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } /* Libération de la mémoire */ free( szNameAttach ); /* Création des packets de 1024 - 1 + envoi */ /* Réinitialisation du buffer */ strcpy(szBuffer, ""); for(i=0; i<iSize; i++, i_back++) { if( i_back >= SIZE_MSG_MAX-1 ) { /* On envoi est on réinitialise le buffer */ if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } strcpy(szBuffer, ""); i_back = 0; } sprintf(szBuffer, "%s%c", szBuffer, szPtr[i]); } /* Envoi du packet en cours de création */ if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } /* Libération de la mémoire */ free( szPtr ); fclose( in ); /* Suppression du fichier temporaire */ sprintf(szBuffer, "%s.tmp", szAttach); remove( szBuffer ); } /* Fin du message */ strcpy(szBuffer, "\r\n\r\n--bb32f0a41b7155b18982fa256e5974aba--\r\n.\r\n"); if ( SendData(szBuffer, true) == 0 ) { closesocket(dasock); return 0; } /* On dit au revoir au serveur */ strcpy(szBuffer, "QUIT\r\n"); if ( SendData(szBuffer, false) == 0 ) { closesocket(dasock); return 0; } /* Libération de la mémoire */ free( szBuffer ); /* Fermeture du socket */ closesocket(dasock); /* Aucune erreur est survenue ! */ return 1; } /* Fonction qui copie un buffer dans un autre */ void byte_copy( void * source, void * destination, int size ) { char * src = ( char * ) source; char * dst = ( char * ) destination; for( int i=0; i<size; i++ ) dst[i] = src[i]; } /* Fonction qui converti un fichier en base64 */ void base64_enc( FILE *in, FILE *out ) { char *buf; buf = (char *)malloc(10000); unsigned char input[3], output[4]; int i, len, blocks=0; while(!feof(in)) { len = 0; for(i=0;i<3;i++ ) //3 x 8 bits blocks = 24 bits { input[i] = (unsigned char) getc(in); if(!feof(in)) len++; else input[i] = 0; } if(len) { // 3 blocks of 8 bits in and 4 blocks of 6 bits out Blanc_enc(input,output,len); for( i = 0; i < 4; i++ ) //4 x 6 bits blocks = 24 bits putc(output[i], out ); blocks++; } if(blocks >= LINESIZE/4) { fprintf(out,"%c%c",CR,LF); blocks = 0; } } } void Blanc_enc( unsigned char input[3], unsigned char output[4], int len ) { output[0] = tabela[ input[0] >> 2 ]; /*1.º bit*/ output[1] = tabela[ ((input[0] & 0x03) << 4) | ((input[1] & 0xf0) >> 4) ]; output[2] = (unsigned char) (len>1?tabela[ ((input[1] & 0x0f) << 2) | ((input[2] & 0xc0) >> 6) ] : '='); output[3] = (unsigned char) (len>2?tabela[ input[2] & 0x3f ] : '='); }

Conclusion :


Amusez-vous bien :-)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.