Envoyer un e‑mail C++
Comment utiliser C++ et SMTP pour envoyer un e‑mail avec pièce jointe ou iCalendar
Télécharger l'essai gratuitEn règle générale, le protocole SMTP est utilisé pour envoyer des messages électroniques. Vous devez disposer d’un accès à un serveur SMTP afin d’envoyer un message. Il faut localiser l’adresse du serveur SMTP sur le réseau, déterminer le port et le type de chiffrement, ainsi que la méthode de connexion et d’autorisation. Certains fournisseurs de messagerie exigent également d’activer l’accès au serveur SMTP dans les paramètres de votre compte. De plus, si vous n’êtes pas à l’aise avec la mise en œuvre de l’autorisation OAuth dans votre logiciel, vous pouvez essayer de créer un mot de passe distinct pour l’application dans les paramètres de votre compte.
Ainsi, si vous avez effectué toutes les préparations, il est temps de commencer à envoyer des messages. Vous pouvez utiliser la bibliothèque Aspose.Email pour C++ à cet effet. Considérez l’exemple le plus simple :
auto smtpClient = MakeObject<SmtpClient>(u"smtp.gmail.com", u"login", u"password", SecurityOptions::SSLAuto);
smtpClient->Send(u"login@gmail.com", u"to@gmail.com", u"subject", u"body");
Utilisez cette option si vous souhaitez envoyer un e‑mail texte simple.
Envoyer un e‑mail avec pièces jointes en C++
Si vous devez envoyer un message e‑mail complexe en C++, la classe MailMessage vous sera certainement utile. Par exemple, pour envoyer un message similaire au précédent :
auto message = MakeObject<MailMessage>(u"login@gmail.com", u"to@aspose.com", u"subject", u"body");
smtpClient->Send(message);
La classe MailMessage est un excellent outil. Elle vous permet d’envoyer des messages stockés aux formats de fichiers EML et MSG (Outlook Message Format). Vous pouvez également utiliser ce format pour envoyer des pièces jointes ou même des objets iCalendar afin d’organiser ou de confirmer une présence. MailMessage vous permet d’ajuster finement votre liste de destinataires, de destinataires en copie (Cc) et en copie cachée (Bcc). Vous pouvez envoyer un e‑mail avec un balisage HTML. Vous pouvez aussi marquer le message avec divers indicateurs avant l’envoi, ajouter des métadonnées, le chiffrer, etc.
Pourquoi choisir Aspose.Email pour C++ pour l’envoi d’e‑mail ?
Oui, Aspose.Email pour C++ n’est pas seulement un utilitaire d’envoi de messages électroniques. C’est une solution complète qui offre un support complet pour une variété de tâches liées à l’envoi, la réception, le stockage et le traitement des e‑mails. Vous pouvez être sûr qu’en effectuant ces tâches, vous ne rencontrerez pas les limites de la bibliothèque. Nous étudions ce sujet depuis de nombreuses années et élargissons continuellement ses fonctionnalités.
Vous avez probablement rencontré de petites bibliothèques apparues récemment. Elles résolvent facilement et naturellement un problème simple auquel de nombreux utilisateurs sont confrontés. Mais dès que vous prenez du recul, vous réalisez qu’en continuant d’utiliser cette bibliothèque modestement fonctionnelle, vous êtes contraint de bricoler constamment, d’ajouter des modules pour contourner les limitations, des adaptateurs pour faire communiquer votre petite bibliothèque avec une autre, etc. Et désormais, votre petite solution ingénieuse n’est plus si ingénieuse. De plus, vous la déployez sur le serveur où elle se retourne régulièrement contre vous, car personne n’a testé un tel zoo de contournements et d’intégrations avant vous. Quel que soit votre effort, tôt ou tard vous rencontrerez les limites de cette bibliothèque et devrez chercher autre chose. Ainsi, lorsqu’il s’agit de travailler avec le courrier électronique, vous pourriez envisager Aspose.Email pour C++ !
Nous ne vous proposons pas seulement un client pour travailler avec SMTP. Tout d’abord, ce n’est pas le seul protocole d’envoi d’e‑mails avec C++. Avec notre produit, vous pouvez envoyer des e‑mails en utilisant Exchange EWS et Microsoft Graph !
Nous vous avons déjà présenté les possibilités de MailMessage dans cet article. Mais ce n’est loin d’être le seul outil pour préparer les courriers à l’envoi. Vous pouvez :
- générer des courriers à partir d’un modèle en utilisant TemplateEngine ;
- décompresser les conteneurs de courriers grâce à la prise en charge des formats OST, PST et MBOX ;
- télécharger les courriers depuis la boîte aux lettres en utilisant la prise en charge des protocoles IMAP, POP3, Exchange EWS et WebDav, ainsi que Microsoft Graph ;
- convertir les e‑mails d’un format à un autre.
Vous pouvez facilement recevoir un courrier en utilisant le protocole Exchange EWS. Il sera au format MAPI. Mais vous pouvez le convertir aisément au format EML, ce qui vous permettra de l’envoyer ultérieurement via le protocole SMTP. Parallèlement, vous pouvez modifier à tout moment la liste des destinataires ou l’expéditeur du courrier.
Comment fonctionne l’envoi d’un e‑mail avec C++ et SMTP ?
Configuration SMTP
Au moment où vous créez une instance de la classe SmtpClient, rien de spécial ne se produit. Vous vous contentez de définir un certain nombre de paramètres qui vous permettront de vous connecter à un serveur SMTP ultérieurement pour envoyer des messages. Toute la magie intervient lors du premier appel à la send méthode. Que se passe-t-il à ce moment‑ci ?
En fait, tout dépend des paramètres que vous avez spécifiés. Considérons plusieurs options. Supposons que vous ayez indiqué l’hôte du serveur mais pas le port ni le type de chiffrement. Dans ce cas, le mécanisme de sélection automatique des paramètres se déclenchera. Ce mécanisme consiste en des tentatives successives de connexion au serveur SMTP en utilisant les ports standards et les algorithmes de chiffrement correspondants. D’abord, une tentative de connexion au serveur via un canal chiffré est effectuée. En cas d’échec, le mécanisme tente d’établir une connexion non chiffrée. Si vous ne souhaitez pas utiliser la version non chiffrée du protocole, indiquez le SecurityOptions.SSL_AUTO paramètre. Ce paramètre permet également de sélectionner les paramètres du serveur, mais ne vérifie que les canaux chiffrés.
Si l’on a pu établir une connexion avec le serveur, une tentative d’autorisation est effectuée. Si l’autorisation échoue, le code d’erreur est enregistré pour une utilisation future. Le sélecteur essaiera alors de se connecter par d’autres moyens. Le message sera envoyé si vous pouvez vous connecter et vous authentifier. Si la connexion échoue, l’utilisateur recevra un code d’erreur d’autorisation (s’il a été enregistré lors de la sélection). Ainsi, l’utilisateur pourra comprendre qu’il a saisi un mauvais mot de passe ou commis une autre erreur. Si aucune des options de ports et de types de chiffrement ne convient et que nous n’avons même pas atteint la tentative d’autorisation, l’utilisateur recevra une erreur indiquant des paramètres de serveur incorrects.
En passant, il convient de noter que notre SmtpClient (comme tous les autres clients de notre bibliothèque) peut se connecter au serveur SMTP via un proxy. Vous pouvez également spécifier les paramètres du serveur proxy lors de l’initialisation.
Autorisation du client SMTP
SmtpClient supporte bien plus que différentes méthodes de connexion. Il prend également en charge diverses méthodes d’autorisation. Par exemple, vous pouvez utiliser le mécanisme OAuth. Pour cela, nous mettons à disposition plusieurs outils simultanément.
Tout d’abord, il s’agit de TokenProvider. C’est la classe qui contient toutes les données nécessaires pour stocker et rafraîchir le jeton OAuth. Dans ce cas, vous devez effectuer vous‑même l’autorisation OAuth et enregistrer toutes les informations reçues du serveur OAuth. RefreshToken joue un rôle clé ici. Il s’agit d’un jeton supplémentaire délivré par le serveur d’autorisation, en plus de l’AccessToken. Leur différence est que l’AccessToken, en règle générale, n’est valable que pendant une période déterminée, alors que le RefreshToken reste valide beaucoup plus longtemps, voire indéfiniment (jusqu’à ce que l’utilisateur le révoque). Grâce au RefreshToken, la classe TokenProvider peut toujours rafraîchir un AccessToken lorsqu’il n’est plus valide.
Une autre option est l’interface ITokenProvider. Dans ce cas, vous pouvez non seulement implémenter vous‑même le mécanisme OAuth, mais aussi le transmettre au SmtpClient afin qu’il l’utilise automatiquement si besoin.
Il convient de noter que le mécanisme OAuth n’est pas toujours nécessaire. Parfois il est beaucoup plus simple de se connecter avec un nom d’utilisateur et un mot de passe. Pour cela, vous n’avez pas besoin de reconfigurer votre compte de messagerie, de refuser l’authentification à deux facteurs, etc. Il existe une solution plus sécurisée : un mot de passe dédié à l’application. Pour profiter de cette fonctionnalité, consultez les paramètres de votre compte de messagerie. Très probablement, le mot de passe d’application sera généré automatiquement lorsque vous le configurerez dans votre compte. N’oubliez pas de le conserver. Nous recommandons également de limiter au maximum les autorisations de votre application lors de la configuration. Bien sûr, si un attaquant accède à ce mot de passe, il ne pourra pas usurper votre compte, mais il pourra tout de même causer de nombreux désagréments. Et vous ne pouvez rien y faire, car le mot de passe est le seul élément qui protège vos données des intrus. En général, cet outil est très pratique, mais il diminue la sécurité de votre compte, utilisez‑le à vos risques et périls.
Envoi d’e‑mail via SMTP avec C++
Ainsi, la connexion au serveur est établie et l’autorisation réussie. Il est temps d’envoyer les courriers. Pour l’envoi, on utilise un objet de la classe MailMessage. Techniquement, vous pouvez simplement transmettre toutes les données nécessaires à la méthode d’envoi. Mais, en réalité, elles seront d’abord collectées dans l’objet MailMessage. Ensuite, grâce à la capacité de la classe MailMessage à sérialiser au format EML, nous obtenons le flux de données nécessaire qui peut être transmis à notre serveur SMTP. Ainsi, nous donnons au serveur la commande d’envoyer le courrier et lui transférons tout le contenu du courrier sous forme de données textuelles. Si des données binaires sont transmises dans le courrier, par exemple sous forme de fichiers joints, ces données sont encodées au format Base64, et les métadonnées du courrier indiquent que le destinataire devra les décoder. Le serveur SMTP peut vérifier la conformité du message reçu (par exemple, vérifier le champ FROM avec le compte de l’expéditeur sur le serveur), ainsi que compléter les métadonnées du message à sa discrétion. Ensuite, le serveur envoie le courrier aux destinataires, dont la liste est également extraite des métadonnées du courrier.