Inviare e-mail C++
Come usare C++ e SMTP per inviare email con allegato o iCalendar
Scarica la prova gratuitaDi norma, il protocollo SMTP viene utilizzato per inviare messaggi e-mail. È necessario accedere a un server SMTP per inviare un messaggio. È necessario trovare l’indirizzo del server SMTP sulla rete, determinare la porta e il tipo di crittografia, il metodo di accesso e di autorizzazione. Alcuni provider di posta elettronica richiedono inoltre di abilitare l’accesso al server SMTP nelle impostazioni dell’account. Inoltre, se non ti senti a tuo agio nell’implementare l’autorizzazione OAuth nel tuo software, puoi provare a creare una password separata per l’applicazione nelle impostazioni del tuo account.
Quindi, se hai svolto tutto il lavoro preparatorio, è ora di iniziare a inviare messaggi. A tale scopo è possibile utilizzare la libreria Aspose.Email per C++. Consideriamo l’esempio più semplice:
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");
Usa questa opzione se desideri inviare un semplice messaggio di testo.
Inviare e-mail con allegati utilizzando C++
Se è necessario inviare un messaggio e-mail complesso utilizzando C++, la classe MailMessage sarà sicuramente utile. Ad esempio, per inviare un messaggio simile a quello precedente:
auto message = MakeObject<MailMessage>(u"login@gmail.com", u"to@aspose.com", u"subject", u"body");
smtpClient->Send(message);
La classe MailMessage è un ottimo strumento. Consente di inviare messaggi archiviati nei formati di file EML e MSG (Outlook Message Format). È inoltre possibile utilizzare questo formato per inviare allegati o persino oggetti iCalendar per impostare o confermare la partecipazione. MailMessage consente di ottimizzare l’elenco dei destinatari, destinatari Cc e Bcc. Puoi inviare un’email con markup HTML. Puoi anche contrassegnare il messaggio con vari contrassegni prima di inviarlo, aggiungere metadati, crittografarlo, ecc.
Perché le persone scelgono Aspose.Email per C++ per l'invio di e-mail?
Sì, Aspose.Email per C++ non è solo un’utilità per l’invio di messaggi di posta elettronica. Si tratta di una soluzione completa che fornisce un supporto completo per una serie di attività relative all’invio, alla ricezione, all’archiviazione e all’elaborazione delle e-mail. E puoi essere certo che quando esegui queste attività non incontrerai i limiti della libreria. Studiamo questo argomento da molti anni e ne ampliamo costantemente le funzionalità.
Probabilmente ti sei imbattuto in piccole librerie apparse relativamente di recente. Risolvono facilmente e naturalmente un semplice problema che molti utenti devono affrontare. Ma non appena vi fate da parte, vi rendete conto che continuando a usare questa libreria senza pretese, siete costretti a bloccare costantemente delle stampelle, alcuni moduli per aggirare le restrizioni delle librerie, adattatori progettati per fare amicizia con la vostra piccola libreria con un’altra piccola libreria, ecc. E ora, la vostra piccola soluzione ingegnosa non è più così elegante. Inoltre, lo invii al server, dove si spara regolarmente e costantemente ai piedi, perché nessuno ha testato un simile zoo di stampelle e integrazioni prima di te. E non importa quanto ci provi, prima o poi ti imbatterai comunque nei limiti di questa libreria. E devi cercare qualcosa di nuovo. Quindi, quando si tratta di lavorare con la posta elettronica, potresti prendere in considerazione Aspose.Email per C++!
Non ti offriamo solo un client per lavorare con SMTP. Innanzitutto, è tutt’altro che l’unico protocollo per l’invio di e-mail con C++. Con il nostro prodotto, puoi inviare e-mail utilizzando Exchange EWS e Microsoft Graph!
Ti abbiamo già parlato delle possibilità di MailMessage in questo articolo. Ma questo è tutt’altro che l’unico strumento per preparare le lettere da inviare. È possibile:
- generare lettere da un modello utilizzando TemplateEngine;
- disimballare i contenitori con lettere, grazie al supporto dei formati OST, PST e MBOX;
- scaricare lettere dalla casella di posta utilizzando il supporto dei protocolli IMAP, POP3, Exchange EWS e WebDAV, oltre a Microsoft Graph;
- convertire le email da un formato all’altro.
Puoi ricevere facilmente una lettera utilizzando il protocollo Exchange Ews. Sarà in formato MAPI. Ma puoi convertirlo facilmente in formato EML, che ti permetterà di inviarlo successivamente tramite il protocollo SMTP. Allo stesso tempo, puoi modificare l’elenco dei destinatari o il mittente della lettera in qualsiasi momento.
Come funziona l'invio di un'e-mail tramite C++ e SMTP?
Configurazione SMTP
Nel momento in cui si crea un’istanza della classe SMTPClient, non accade nulla di speciale. È sufficiente specificare il numero di impostazioni che in futuro ti consentiranno di connetterti a un server SMTP per inviare messaggi. Tutta la magia accade alla prima chiamata al send
metodo. Cosa sta succedendo in questo momento?
In realtà, tutto dipende dalle impostazioni che hai specificato. Consideriamo diverse opzioni. Supponiamo di aver specificato l’host del server ma non di aver specificato la porta e il tipo di crittografia. In questo caso, verrà avviato il meccanismo di selezione automatica delle impostazioni. Questo meccanismo consiste in tentativi successivi di connessione al server SMTP utilizzando porte standard e gli algoritmi di crittografia corrispondenti. Innanzitutto, viene effettuato un tentativo di connessione al server tramite un canale crittografato. Ma se fallisce, il meccanismo cercherà di stabilire una connessione non crittografata. Se non si desidera utilizzare la versione non crittografata del protocollo, specificare SecurityOptions.SSL_AUTO
impostazione. Questa impostazione consente anche di selezionare le impostazioni del server, ma controlla solo i canali crittografati.
Se è stato possibile stabilire una connessione con il server, viene effettuato un tentativo di autorizzazione. Se l’autorizzazione fallisce, il codice di errore viene salvato per il futuro. Il matcher proverà a connettersi in altri modi. Il messaggio verrà inviato se riesci a connetterti e accedere. Se la connessione fallisce, l’utente riceverà un codice di errore di autorizzazione (se ne è stato salvato uno durante la selezione). In questo modo l’utente sarà in grado di capire di aver inserito la password sbagliata o di aver commesso qualche altro errore. Se nessuna delle opzioni per le porte e i tipi di crittografia è adatta e non siamo nemmeno riusciti a effettuare il tentativo di autorizzazione, l’utente riceverà un messaggio di errore che notifica le impostazioni errate del server.
A proposito, va notato che il nostro SMTPClient (come tutti gli altri client della nostra libreria) può connettersi al server SMTP tramite un proxy. È inoltre possibile specificare le impostazioni del server proxy durante l’inizializzazione.
Autorizzazione del client SMTP
SMTPClient supporta più di diversi metodi di connessione. Supporta anche diversi metodi di autorizzazione. Ad esempio, è possibile utilizzare il meccanismo OAuth. Per fare ciò, forniamo diversi strumenti contemporaneamente.
Prima di tutto, è TokenProvider. Questa è la classe che contiene tutti i dati necessari per archiviare e aggiornare il token OAuth. In questo caso, è necessario eseguire personalmente l’autorizzazione OAuth e salvare tutte le informazioni necessarie ricevute dal server OAuth. RefreshToken svolge un ruolo chiave qui. Si tratta di un token aggiuntivo emesso dal server di autorizzazione, insieme a AccessToken. La loro differenza è che AccessToken, di norma, è valido solo per un certo periodo di tempo. Mentre RefreshToken è valido per molto più tempo o anche a tempo indeterminato (fino a quando l’utente non lo revoca). Grazie a RefreshToken, la classe TokenProvider può sempre aggiornare un AccessToken se quest’ultimo non è più valido.
Un’altra opzione è l’interfaccia iTokenProvider. In questo caso, non solo puoi implementare tu stesso il meccanismo OAuth, ma anche passarlo a SMTPClient in modo che lo utilizzi da solo secondo necessità.
Va notato che il meccanismo OAuth non è sempre necessario. A volte è molto più semplice accedere con nome utente e password. E per questo, non è necessario riconfigurare affatto il proprio account e-mail, rifiutare l’autorizzazione a due fattori, ecc. Esiste una soluzione più sicura: questa è una password separata per l’applicazione. Per sfruttare questa funzione, è necessario esaminare le impostazioni del proprio account e-mail. Molto probabilmente, la password per l’applicazione verrà generata automaticamente quando la configuri nel tuo account. Non dimenticare di salvarlo da qualche parte. Ti consigliamo inoltre di limitare il più possibile le autorizzazioni dell’applicazione durante la configurazione. Ovviamente, se un utente malintenzionato accede a questa password, non sarà in grado di appropriarsi del tuo account, ma può comunque fare molte cose spiacevoli. E qui non puoi fare nulla, perché la password è l’unica cosa che protegge i tuoi dati dagli intrusi. In generale, lo strumento è molto comodo, ma riduce la sicurezza del tuo account, utilizzalo a tuo rischio e pericolo.
Invio di e-mail tramite SMTP con C++
Quindi, la connessione al server viene stabilita e l’autorizzazione è avvenuta con successo. È ora di inviare lettere. Per l’invio, viene utilizzato un oggetto della classe MailMessage. Tecnicamente, puoi semplicemente passare tutti i dati necessari al metodo di invio. In realtà, verranno comunque raccolti nell’oggetto MailMessage. Inoltre, grazie alla capacità della classe MailMessage di serializzare nel formato EML, otteniamo il flusso di dati necessario che può essere passato al nostro server SMTP. Pertanto, diamo al server un comando per inviare una lettera e trasferirle tutto il contenuto della lettera sotto forma di dati di testo. Se i dati binari vengono trasmessi nella lettera, ad esempio sotto forma di file allegati, questi dati vengono codificati nel formato Base64 e i metadati della lettera indicano che il destinatario dovrà decodificarli nuovamente. Il server SMTP può verificare la correttezza del messaggio ricevuto (ad esempio, controllare il campo FROM con l’account del mittente sul server), nonché integrare i metadati del messaggio a sua discrezione. Quindi, il server invierà l’e-mail ai destinatari, un elenco del quale riceverà anche dai metadati dell’email.