全流程完整代码如下
from socket import *
import base64
serverName = 'smtp.qq.com'
serverPort = 25
# AF_INET代表Ipv4 SOCK_STREAM 代表TCP协议
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send("HELO myName\r\n".encode())
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send("AUTH login\r\n".encode())
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(base64.b64encode("xxxxxxxx@qq.com".encode())+b'\r\n')
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(base64.b64encode("xxxxxxxx".encode())+b'\r\n')
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(b"mail from: <xxxxxxxx@qq.com>\r\n")
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(b"rcpt to: <xxxxxxxx@qq.com>\r\n")
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(b"data\r\n")
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(b"From: <xxxxxxxx@qq.com>\r\n")
clientSocket.send(b"To: <xxxxxxxx@qq.com>\r\n")
clientSocket.send(b"subject: socket not SSL\r\n")
clientSocket.send(b"socketMainContain not SSL\r\n")
clientSocket.send(b".\r\n")
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.send(b"quit\r\n")
msg = clientSocket.recv(2048)
print(msg.decode())
clientSocket.close()
注意事项:
1. 每个命令的大小写是严格要求的,如果大小写不符合要求会 502 invalid input
2. 每次send完成某个命令后,需要recv回报信息,不然下个流程会 502
3. clientSocket.send(base64.b64encode("xxxxxxxx".encode())+b'\r\n') 这里+b'\r\n' 是为了防止\r\n被base64编码导致的502,且只有验证过程需要base64编码。
4.验证密码不是邮箱密码,是qq邮箱授权码
5.建议使用 smtplib