Envoi mail smtp, attachement [demande forum]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 902 fois - Téléchargée 28 fois

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

Ajouter un commentaire

Commentaires

cs_Arnotic
Messages postés
936
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
-
Si tu veux va voir mes dernières sources concernant l'envoi d'e-mail le code est complet.
piloudestetienne
Messages postés
1
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2005
-
bonjour
Je suis en train de programmer un petit logiciel de mailing et j'utilise cette fonction que j'ai implemante ds une classe CMailAttach (donc un .cpp et un .h)
J'ai insere les lib.h precisee ci dessus et la librairie ws2_32.lib dans les settings

Qd je compile sans utiliser la classe, il n'y a pas de probleme. Mais je cree un objet qui appel ta fonction, j'ai l'erreur suivante:
Linking...
Australian mailingDlg.obj : error LNK2001: unresolved external symbol "public: int __thiscall CMailAttach::SendMail(char *,int,char *,char *,char *,char *,char *,bool,unsigned int,char *)" (?SendMail@CMailAttach@@QAEHPADH00000_NI0@Z)
Debug/Australian mailing.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Est ce que j'est oublie un include ou une librairie...
Je n'est pas trouve ma reponse sur le net donc si tu pouvais me decoincer
En vous remerciant.

pilou
pcouderc
Messages postés
2
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
5 janvier 2005
-
pcouderc
Messages postés
2
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
5 janvier 2005
-
Pour une généralisation des envois de mails de type MIME, voir http://www.codeguru.com/Cpp/I-N/internet/email/comments.php/c6213/?thread=65964
gergalp
Messages postés
70
Date d'inscription
vendredi 14 février 2003
Statut
Membre
Dernière intervention
20 mars 2007
-
Pour ceux qui ont du mal a compiler a cause de tabela, il s'agit en fait des caracteres utilisés avec le base64:

char tabela[64] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'v', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/'};

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.