在现代网络通信中,安全性变得越来越重要。对于发送电子邮件这一常见任务,SMTP 协议提供了两种安全连接方式:SSL和TLS。本文将介绍如何在C++中实现SMTP客户端,以支持这两种安全协议。
SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是两种广泛使用的安全协议,用于在网络通信中提供加密。对于SMTP协议,SSL通常使用端口465,而TLS使用端口587。然而,并非所有SMTP服务器都遵循这一标准,因此开发者需要根据实际情况进行配置。
SSL在TCP连接建立后立即进行加密连接的协商,而TLS则需要客户端先发送STARTTLS命令,然后服务器响应该命令,之后才开始加密连接的协商。
1. 客户端通过TCP连接到服务器。 2. 客户端与服务器协商加密连接。 3. 服务器通过加密连接发送欢迎消息给客户端。 4. 客户端通过加密连接发送EHLO命令给服务器。 5. 服务器通过加密连接响应EHLO命令。
1. 客户端通过TCP连接到服务器。 2. 服务器通过未加密连接发送欢迎消息给客户端。 3. 客户端通过未加密连接发送EHLO命令给服务器。 4. 服务器通过未加密连接响应EHLO命令。 5. 客户端发送STARTTLS命令给服务器。 6. 服务器响应STARTTLS命令。 7. 客户端与服务器协商加密连接。 8. 客户端通过加密连接发送EHLO命令给服务器。 9. 服务器通过加密连接响应EHLO命令。
在实现SMTP客户端时,使用了OpenSSL库。以下是如何配置和使用该库的示例代码:
#define test_gmail_tls
CSmtp mail;
#if defined(test_gmail_tls)
mail.SetSMTPServer(
"smtp.gmail.com",
587
);
mail.SetSecurityType(USE_TLS);
#elif defined(test_gmail_ssl)
mail.SetSMTPServer(
"smtp.gmail.com",
465
);
mail.SetSecurityType(USE_SSL);
#elif defined(test_hotmail_TLS)
mail.SetSMTPServer(
"smtp.live.com",
25
);
mail.SetSecurityType(USE_TLS);
#elif defined(test_aol_tls)
mail.SetSMTPServer(
"smtp.aol.com",
587
);
mail.SetSecurityType(USE_TLS);
#elif defined(test_yahoo_ssl)
mail.SetSMTPServer(
"plus.smtp.mail.yahoo.com",
465
);
mail.SetSecurityType(USE_SSL);
#endif
mail.SetLogin(
"***"
);
mail.SetPassword(
"***"
);
mail.SetSenderName(
"User"
);
// ......
mail.Send();
注意:使用非特权用户账户测试Yahoo时,邮件发送可能会失败,并返回错误消息“530 Access denied: Free users cannot access this server”。