Bra*_*don 1 c++ sockets email smtp
假设我有一个像下面这样的函数,可以完美地从套接字发送和接收信息..
结果是:
Connected to: 65.55.96.11 Port: 25
220 BLU0-SMTP374.blu0.hotmail.com Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at Mon, 31 Dec 2012 19:52:22 -0800
250 BLU0-SMTP374.blu0.hotmail.com Hello [50.100.44.155]
220 2.0.0 SMTP server ready
Exception: Socket Error 10054: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)
为什么会出现异常?当我发送“DATA”字符串时它会抛出异常。
如何登录?我似乎无法在网上找到任何地方。我搜索了它,只看到 AUTH 命令,但根本没有用法或示例。
代码如下:
void SendEmail(std::string Username, std::string Password, std::string IP, std::string Port)
{
Socket = CreateSocket;
ConnectSocket(Socket, IP, Port);
SetTimeout(Socket, 10000);
SocketInfo(Socket, IP, Port);
writeln("Connected to: " + IP + " Port: " + Port);
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "HELO"); //SendSocketEx automatically adds \r\n to the end of a line..
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "STARTTLS");
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "MAIL FROM: mehwtfbleh@hotmail.com");
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "VRFY mehwtfbleh@hotmail.com");
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "RCPT TO: mehwtfbleh@hotmail.com");
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "DATA");
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "This Is The Body..");
writeln(RecvSocket(Socket));
SendSocketEx(Socket, "QUIT");
writeln(RecvSocket(Socket));
CloseSocket(Socket);
FreeSocket(Socket);
}
int main()
{
SendEmail("", "", "smtp.live.com", "25", "localhost");
}
Run Code Online (Sandbox Code Playgroud)
问题是该服务器需要通过 TLS 协议进行通信。的STARTTLS命令告诉所有进一步的通信将发生在安全套接字层(SSL / TLS)服务器。一旦建立此连接,双方之间的所有进一步通信都将被加密。
实现这一点的最简单方法是使用实现 SSL/TLS的库。最著名的库是 OpenSSL。
您可以从终端/控制台使用 OpenSSL 执行快速测试:
openssl s_client -connect smtp.live.com:25 -starttls smtp -crlf
Run Code Online (Sandbox Code Playgroud)
然后你可以发送你的命令:
EHLO hotmail.com
AUTH LOGIN (this depends on the methods supported by the server)
...
MAIL FROM: <your email>
RCPT TO: <recipient email>
DATA
All your SMTP are belong to us.
.
Run Code Online (Sandbox Code Playgroud)