使用wsock32发送带有gmail和startTLS的电子邮件

时间:2015-12-30 17:39:12

标签: c++ email

你好,晚上好,

这个主题对我和许多人来说都是一个麻烦,假设我想在C ++程序中发送EMail以使用smtp和StartTLS,我该怎么做,我从谷歌中剔除了一个简单的源代码,我看到了这个来自这里的代码

http://www.drdobbs.com/sending-e-mail-using-smtp-and-winsock/184416591

现在我想使用谷歌邮件,它使用身份验证smtp和startTLS如何做到这一点

我看到的源代码看起来像这样

#pragma comment(lib, "wsock32.lib")

#include <windows.h>
#include "MailMessage.h"

int main(int argc, char **argv)
{
  MailMessage mail("A Sender",
    "someone@someplace.com",
    "mail.someplace.com");
  mail.To("A Recipient",
    "you@yourplace.com");
  mail.Subject("Sample message");

  mail.Body("Plain text body",
    "<HTML><BODY>\r\n"
    " <H2>HTML Body</H2>\r\n"
    "</BODY></HTML>""\r\n");

  mail.Attach("C:\\Attach.txt");

  const char *result =
    mail.Send().data();

  if (result[0] == '\0')
    result = "Success";

  MessageBox(NULL, result, "Result",
    MB_ICONINFORMATION|MB_OK);
  return 0;
}

1 个答案:

答案 0 :(得分:0)

连接到服务器并发出EHLO(非HELO)命令后,如果服务器的回复包含STARTTLS功能,那么您可以发出{{1命令随时与服务器建立安全会话。收到成功的STARTTLS回复后,您需要发送并完成SSL / TLS握手。创建会话后,您可以继续发送SMTP命令并接收SMTP回复,从新的STARTTLS命令开始(因为在连接受到保护后服务器的功能可能会发生变化)。您必须加密命令并随时解密回复。通信将如下所示(此示例假定如果启用了两步验证,则在GMail中配置了特定于应用程序的密码):

S:    220 smtp.gmail.com ESMTP dg12sm55710335pac.47 - gsmtp
C:    EHLO <hostname>
S:    250-smtp.gmail.com at your service, [<ip address>]
S:    250-SIZE 35882577
S:    250-8BITMIME
S:    250-STARTTLS
S:    250-ENHANCEDSTATUSCODES
S:    250-PIPELINING
S:    250-CHUNKING
S:    250 SMTPUTF8
C:    STARTTLS
S:    220 2.0.0 Ready to start TLS
C/S:  (Exchange SSL/TLS handshake)
C/S:  (Everything from here on is now encrypted)
C:    EHLO <hostname>
S:    250-smtp.gmail.com at your service, [<ip address>]
S:    250-SIZE 35882577
S:    250-8BITMIME
S:    250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
S:    250-ENHANCEDSTATUSCODES
S:    250-PIPELINING
S:    250-CHUNKING
S:    250 SMTPUTF8
C:    AUTH LOGIN
S:    334 VXNlcm5hbWU6
C:    (Send base64 encoded username)
S:    334 UGFzc3dvcmQ6
C:    (Send base64 encoded password)
S:    235 2.7.0 Accepted
C:    (Send email as needed)
C:    QUIT
S:    221 2.0.0 closing connection m1sm91929700pfi.27 - gsmtp

现在,您实际处理加密的方式取决于您。您可以使用OpenSSL之类的库,也可以使用Microsoft的Crypto / SChannel API。有很多关于如何使用套接字的在线教程和书籍。