Envoyer un mail avec piece jointe (utilise mapi) en vc++

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 597 fois - Téléchargée 36 fois

Contenu du snippet

Envoie un mail avec piece jointe (utilise MAPI).
Programme sous Visual C++ 6.0
ATTENTION : pour fonctionner il faut avoir un compte courrier sur Outlook Express par défaut et bien configuré.
L'adresse de l'expediteur devra etre la meme que sur le compte courrier sous OExpress

Source / Exemple :


#include <stdafx.h>
#include <mapi.h>
#include <windows.h>
#include <stdio.h>
#include <iostream.h>

// Définition des fonctions mapi

LPMAPILOGON lpfnMAPILogon;

LPMAPISENDMAIL lpfnMAPISendMail;

LPMAPILOGOFF lpfnMAPILogoff;

MapiRecipDesc recipient;

MapiRecipDesc sender;

MapiFileDesc attach;

MapiMessage message;

char nomfrom[100], nomto[100], adressefrom[110]="SMTP:", adresseto[100];
char sujet[100], mesg[2000], piece[200];
char add[100];

void main()

{

    LHANDLE lhSession;

    HANDLE hMAPILib;

    hMAPILib = LoadLibrary("MAPI32.DLL");

cout<<"Entrez le nom de l'expediteur\n";
cin>>nomfrom;

cout<<"Entrez l'adresse de l'expediteur\n";
cin>>add;
strcat(adressefrom, add);

cout<<"Entrez le nom du destinataire\n";
cin>>nomto;
	
cout<<"Entrez l'adresse du destinataire\n";
cin>>adresseto;
	
cout<<"Entrez le sujet du mail\n"<<flush;
fgets(sujet,100,stdin);

// les retours à la ligne ne sont pas gérés -> passe a l'action suivante
cout<<"Entrez votre message\n"<<flush;
fgets(mesg,2000,stdin);

cout<<"Entrez le chemin complet de la piece jointe\n";
cout<<"ATTENTION : ne pas oublier l'extension du fichier\n";
cin>>piece;

	MapiRecipDesc recipient =
{
    0, MAPI_TO,
    nomto, adresseto,
    0, NULL
};

	MapiRecipDesc sender =
{
	0, MAPI_ORIG,
	nomfrom, adressefrom,
	0, NULL
};
	
	MapiFileDesc attach =
{
	0, 0, -1, piece, NULL, NULL
};
	
	MapiMessage message =
{
    0, sujet, mesg, NULL, NULL, NULL, 0,
	&sender, 1, &recipient, 1, &attach
};

    lpfnMAPILogon =

        (LPMAPILOGON)GetProcAddress((HMODULE)hMAPILib, "MAPILogon");

    lpfnMAPISendMail =

        (LPMAPISENDMAIL)GetProcAddress((HMODULE)hMAPILib, "MAPISendMail");

    lpfnMAPILogoff =

        (LPMAPILOGOFF)GetProcAddress((HMODULE)hMAPILib, "MAPILogoff");

    (*lpfnMAPILogon)(0, NULL, NULL, NULL, 0, &lhSession);

    (*lpfnMAPISendMail)(lhSession, 0, &message, 0, 0);

    (*lpfnMAPILogoff)(lhSession, 0, 0, 0);

    cout<<("\nMessage envoye !\n");

    FreeLibrary((HMODULE)hMAPILib);

}

Conclusion :


Pour que l'envoi soit vraiment automatique, désactiver l'otpion "m'avertir lorsque d'autres applications..." dans outil/options.../sécurité de Outlook Express

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
vendredi 21 décembre 2007
Statut
Membre
Dernière intervention
9 mai 2010

Pour information, ce code marche également avec mozzila thunderbird sous les même conditions, c'est a dire, avec une adresse mail bien configuré, sinon, c'est exactement le même principe.
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
2
Bonjour,
Juste un truc, je viens de m'apercevoir que le code pour formatter le message ne marchait qu'avec MSN hotmail.
Et pas avec Live messenger, outlook express...
Désolé pour l'erreur.
A+
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
2
Bonjour,

Pour ceux que ça interresse, je viens de découvrir une méthode permettant d'envoyer des messages formatés avec ce code.

Voici le code :

mesg est le message formatté à envoyé
et
mesgDepart est le mesage non-formatté

char mesg[31500];
strcpy ( mesg , "<HTML><HEAD>\n<META http-equiv=3DContent-Type content=3D"text/html; =\ncharset=3Diso-8859-1">\n<META content=3D"MSHTML 6.00.6000.16441" name=3DGENERATOR>\n<STYLE></STYLE>\n</HEAD>\n" );
strcat ( mesg , mesgDepart );
strcat ( mesg , "</HTML>" );

Voilà ces 3 à 4 lignes de codes rendent votre texte formatté.

A+
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
2
OUPS,

j'ai oublier de mettre le morceau de code incriminé,
il provient d'une de mes sources personnelles et est fortement inspiré du code de ENVOYER UN MAIL AVEC PIECE JOINTE (UTILISE MAPI) EN VC++.

Le voilà :

void envoyer(char nomfrom[100], char nomto[100], char adressefromTemp[110], char adresseto[100], char objet[256], char mesg[4096], char piece[1024]) {
LPMAPILOGON lpfnMAPILogon;
LPMAPISENDMAIL lpfnMAPISendMail;
LPMAPILOGOFF lpfnMAPILogoff;

LHANDLE lhSession;
HANDLE hMAPILib;
hMAPILib = LoadLibrary("MAPI32.DLL");

char adressefrom[115] = "SMTP:";
strcat(adressefrom,adressefromTemp);

MapiRecipDesc recipient = {0, MAPI_TO, nomto, adresseto, 0, NULL};
MapiRecipDesc sender = {0, MAPI_ORIG, nomfrom, adressefrom, 0, NULL};
MapiFileDesc attach = {0, 0, -1, piece, NULL, NULL};
MapiMessage message = {0, objet, mesg, NULL, NULL, NULL, 0, &sender, 1, &recipient, 1, &attach};

lpfnMAPILogon = (LPMAPILOGON)GetProcAddress((HMODULE)hMAPILib, "MAPILogon");
lpfnMAPISendMail = (LPMAPISENDMAIL)GetProcAddress((HMODULE)hMAPILib, "MAPISendMail");
lpfnMAPILogoff = (LPMAPILOGOFF)GetProcAddress((HMODULE)hMAPILib, "MAPILogoff");
(*lpfnMAPILogon)(0, NULL, NULL, 0, 0, &lhSession);
(*lpfnMAPISendMail)(lhSession, 0, &message, 0, 0);
(*lpfnMAPILogoff)(lhSession, 0, 0, 0);

FreeLibrary((HMODULE)hMAPILib);
}
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
2
Bonjour,

-----

Comme le dit ma question :
http://www.cppfrance.com/infomsg_PROBLEME-AVEC-MAPISEND-MAIL_944232.aspx

Je ne parvient pas à envoyer un mail avec un expéditeur différent que celui par defaut sur outlook. Si par exemple je met a@b.c, le mail par avec mon adresse de outlook par defaut. Comment faire pour que le message soit bien envoyé avec l'adresse a@b.c?
Je dispose de windows Xp et de Outlook Express 6.
Aidez-moi s'il vous plaît!!!
Merci d'avance et à bientôt.
En tout cas à par ce problème, il s'agit d'une source interressante.

-----

A bientôt.
Afficher les 10 commentaires

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.