Enviar e‑mail C++
Como usar C++ e SMTP para enviar e‑mail com anexo ou iCalendar
Download grátis julgamentoComo regra, o protocolo SMTP é usado para enviar mensagens de e‑mail. Você precisa de acesso a um servidor SMTP para enviar uma mensagem. É necessário localizar o endereço do servidor SMTP na rede, determinar a porta e o tipo de criptografia, método de login e autorização. Alguns provedores de e‑mail também exigem que você habilite o acesso ao servidor SMTP nas configurações da sua conta. Além disso, se não se sentir confortável implementando a autorização OAuth em seu software, pode tentar criar uma senha separada para o aplicativo nas configurações da sua conta.
Portanto, se você já fez todo o trabalho preparatório, é hora de começar a enviar mensagens. Você pode usar a biblioteca Aspose.Email para C++ para isso. Considere o exemplo mais simples:
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");
Use esta opção se quiser enviar um e‑mail de texto simples.
Enviar e‑mail com anexos usando C++
Se precisar enviar uma mensagem de e‑mail complexa usando C++, a classe MailMessage será definitivamente útil. Por exemplo, para enviar uma mensagem semelhante à anterior:
auto message = MakeObject<MailMessage>(u"login@gmail.com", u"to@aspose.com", u"subject", u"body");
smtpClient->Send(message);
A classe MailMessage é uma ótima ferramenta. Ela permite enviar mensagens armazenadas nos formatos de arquivo EML e MSG (Formato de Mensagem Outlook). Você também pode usar esse formato para enviar anexos ou mesmo objetos iCalendar para agendar ou confirmar presença. MailMessage permite ajustar finamente sua lista de destinatários, Cc e Bcc. Você pode enviar um e‑mail com marcação HTML. Também pode marcar a mensagem com várias flags antes de enviá‑la, adicionar metadados, criptografá‑la etc.
Por que as pessoas escolhem Aspose.Email para C++ para enviar e‑mail?
Sim, o Aspose.Email para C++ não é apenas uma utilidade para enviar mensagens de e‑mail. É uma solução abrangente que oferece suporte completo a uma variedade de tarefas relacionadas ao envio, recebimento, armazenamento e processamento de e‑mail. E você pode ter certeza de que ao executar essas tarefas não encontrará as limitações da biblioteca. Estudamos este assunto por muitos anos e estamos continuamente expandindo sua funcionalidade.
Você provavelmente já se deparou com pequenas bibliotecas que surgiram relativamente recentemente. Elas resolvem de forma simples e natural um problema comum a muitos usuários. Mas, assim que você se distancia um pouco, percebe que ao continuar usando essa biblioteca despretensiosa, é forçado a constantemente improvisar soluções paliativas, alguns módulos para contornar restrições da biblioteca, adaptadores projetados para fazer sua pequena biblioteca "amigar" outra pequena biblioteca etc. E agora, sua solução engenhosa já não é tão engenhosa assim. Além disso, ao enviá‑la ao servidor, ela acaba se prejudicando regularmente, porque ninguém testou aquele zoológico de gambiarras e integrações antes de você. Por mais que se esforce, mais cedo ou mais tarde ainda encontrará as limitações dessa biblioteca. E precisará buscar algo novo. Portanto, quando se trata de trabalhar com e‑mail, talvez queira considerar o Aspose.Email para C++!
Não oferecemos apenas um cliente para trabalhar com SMTP. Primeiro, esse não é o único protocolo para enviar e‑mails com C++. Com nosso produto, você pode enviar e‑mails usando Exchange EWS e Microsoft Graph!
Já falamos sobre as possibilidades do MailMessage neste artigo. Mas essa está longe de ser a única ferramenta para preparar mensagens para envio. Você pode:
- gerar mensagens a partir de um modelo usando TemplateEngine;
- descompactar contêineres com mensagens, graças ao suporte aos formatos OST, PST e MBOX;
- baixar mensagens da caixa de correio usando suporte aos protocolos IMAP, POP3, Exchange EWS e WebDav, bem como Microsoft Graph;
- converter e‑mails de um formato para outro.
Você pode receber facilmente uma mensagem usando o protocolo Exchange EWS. Ela estará no formato MAPI. Mas pode convertê‑la facilmente para o formato EML, o que permitirá enviá‑la posteriormente via protocolo SMTP. Ao mesmo tempo, pode alterar a lista de destinatários ou o remetente da mensagem a qualquer momento.
Como funciona o envio de e‑mail usando C++ e SMTP?
Configuração SMTP
No momento em que você cria uma instância da classe SmtpClient, nada de especial acontece. Você simplesmente define as várias configurações que permitirão conectar a um servidor SMTP no futuro para enviar mensagens. Toda a mágica ocorre na primeira chamada ao send método. O que está acontecendo neste momento?
Na verdade, tudo depende das configurações que você especificou. Vamos considerar várias opções. Suponha que você tenha definido o host do servidor, mas não tenha especificado a porta e o tipo de criptografia. Nesse caso, o mecanismo de seleção automática de configurações será ativado. Esse mecanismo consiste em tentativas sucessivas de conectar ao servidor SMTP usando portas padrão e os algoritmos de criptografia correspondentes. Primeiro, tenta‑se conectar ao servidor através de um canal criptografado. Se falhar, o mecanismo tentará estabelecer uma conexão não criptografada. Se você não quiser usar a versão não criptografada do protocolo, especifique o SecurityOptions.SSL_AUTO configuração. Esta configuração também permite selecionar configurações de servidor, mas verifica apenas canais criptografados.
Se for possível estabelecer conexão com o servidor, uma tentativa de autorização é realizada. Caso a autorização falhe, o código de erro é salvo para uso futuro. O mecanismo de correspondência tentará conectar de outras formas. A mensagem será enviada se você conseguir conectar e fazer login. Se a conexão falhar, o usuário receberá um código de erro de autorização (se houver um salvo durante a seleção). Assim, o usuário poderá entender que inseriu a senha errada ou cometeu outro erro. Se nenhuma das opções de portas e tipos de criptografia se adequar e nem sequer chegarmos à tentativa de autorização, o usuário receberá um erro informando configurações de servidor incorretas.
Aliás, vale mencionar que nosso SmtpClient (como todos os demais clientes da nossa biblioteca) pode conectar ao servidor SMTP através de um proxy. Também é possível especificar as configurações do servidor proxy durante a inicialização.
Autorização do cliente SMTP
O SmtpClient oferece suporte a mais do que diferentes métodos de conexão. Ele também suporta diferentes métodos de autorização. Por exemplo, você pode usar o mecanismo OAuth. Para isso, disponibilizamos várias ferramentas simultaneamente.
Primeiro, trata‑se do TokenProvider. Esta é a classe que contém todos os dados necessários para armazenar e atualizar o token OAuth. Nesse caso, você deve realizar a autorização OAuth por conta própria e salvar todas as informações recebidas do servidor OAuth. O RefreshToken desempenha um papel crucial aqui. É um token adicional emitido pelo servidor de autorização, junto com o AccessToken. A diferença é que o AccessToken, geralmente, é válido apenas por um período determinado, enquanto o RefreshToken permanece válido por muito mais tempo, ou até indefinidamente (até que o usuário o revogue). Graças ao RefreshToken, a classe TokenProvider pode sempre atualizar um AccessToken quando este não for mais válido.
Outra opção é a interface ITokenProvider. Nesse caso, você pode não apenas implementar o mecanismo OAuth você mesmo, mas também passá‑lo ao SmtpClient para que ele o utilize conforme necessário.
Deve‑se notar que o mecanismo OAuth nem sempre é necessário. Às vezes é muito mais fácil fazer login com nome de usuário e senha. Para isso, não é preciso reconfigurar sua conta de e‑mail, recusar a autenticação de dois fatores etc. Existe uma solução mais segura – uma senha separada para o aplicativo. Para aproveitar esse recurso, verifique as configurações da sua conta de e‑mail. Muito provavelmente, a senha do aplicativo será gerada automaticamente ao configurá‑la em sua conta. Não se esqueça de salvá‑la em algum lugar. Também recomendamos limitar ao máximo as permissões do seu aplicativo durante a configuração. É claro que, se um invasor obtiver essa senha, não poderá assumir sua conta, mas ainda assim poderá fazer muitas coisas desagradáveis. E aqui você não pode fazer nada, pois a senha é a única coisa que protege seus dados contra intrusos. Em geral, a ferramenta é muito prática, porém reduz a segurança da sua conta; use‑a por sua conta e risco.
Enviando e‑mail via SMTP com C++
Então, a conexão com o servidor é estabelecida e a autorização foi bem‑sucedida. É hora de enviar as mensagens. Para o envio, utiliza‑se um objeto da classe MailMessage. Técnicamente, você poderia apenas passar todos os dados necessários ao método de envio. Mas, na prática, eles ainda são coletados no objeto MailMessage. Em seguida, graças à capacidade da classe MailMessage de serializar para o formato EML, obtemos o fluxo de dados necessário que pode ser passado ao nosso servidor SMTP. Assim, enviamos ao servidor o comando para enviar a mensagem e transferimos todo o conteúdo da mensagem a ele em forma de dados textuais. Se houver dados binários na mensagem, por exemplo, arquivos anexos, esses dados são codificados em Base64, e os metadados da mensagem indicam que o destinatário precisará decodificá‑los. O servidor SMTP pode verificar a correção da mensagem recebida (por exemplo, conferir o campo FROM com a conta do remetente no servidor), bem como complementar os metadados da mensagem a seu critério. Então, o servidor enviará o e‑mail aos destinatários, cuja lista também será obtida a partir dos metadados do e‑mail.