仅使用套接字的 Python 邮件客户端(无 smtplib)

新手上路,请多包涵

我正在尝试编写一个 python 程序,它将在不使用 smtplib 的情况下发送电子邮件。我试图查看有关此的其他帖子,但找不到解决方案。

 `from socket import *

msg = "\r\n My email's content!"
endmsg = "\r\n.\r\n"

mailserver = ("smtp.aol.com", 25)

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(mailserver)

recv = clientSocket.recv(1024)
recv = recv.decode()
print("Message after connection request:" + recv)
if recv[:3] != '220':
    print('220 reply not received from server.')
heloCommand = 'HELO Alice\r\n'
clientSocket.send(heloCommand.encode())
recv1 = clientSocket.recv(1024)
recv1 = recv1.decode()
print("Message after HeLO command:" + recv1)
if recv1[:3] != '250':
    print('250 reply not received from server.')

# #Info for username and password
# username = "myusername"
# password = "xxxxxxxx"
# authMsg = "AUTH LOGIN\r\n"
# clientSocket.send(authMsg.encode())
# recv_auth = clientSocket.recv(1024)
# print(recv_auth.decode())

# clientSocket.send(username.encode())
# clientSocket.send("\r\n".encode())
# recv_user = clientSocket.recv(1024)
# print("Response after sending username: "+recv_user.decode())

# clientSocket.send(password.encode())
# clientSocket.send("\r\n".encode())
# recv_pass = clientSocket.recv(1024)
# print("Response after sending password: "+recv_pass.decode())

# clientSocket.send(('starttls\r\n').encode())
# recv_tls = clientSocket.recv(1024)
# print(recv_tls.decode())

mailFrom = "MAIL FROM:<yjorayev@aol.com>\r\n"
clientSocket.send(mailFrom.encode())
recv2 = clientSocket.recv(1024)
recv2 = recv2.decode()
print("After MAIL FROM command: "+recv2)

rcptTo = "RCPT TO:<ijorayev@gmail.com>\r\n"
clientSocket.send(rcptTo.encode())
recv3 = clientSocket.recv(1024)
recv3 = recv3.decode()
print("After RCPT TO command: "+recv3)

data = "DATA\r\n"
clientSocket.send(data.encode())
recv4 = clientSocket.recv(1024)
recv4 = recv4.decode()
print("After DATA command: "+recv4)

clientSocket.send(msg.encode())

clientSocket.send(endmsg.encode())
recv_msg = clientSocket.recv(1024)
print("Response after sending message body:"+recv_msg.decode())

quit = "QUIT\r\n"
clientSocket.send(quit.encode())
recv5 = clientSocket.recv(1024)
print(recv5.decode())
clientSocket.close()`

是否可以在不登录服务器的情况下发送电子邮件?如果不是,我该如何正确登录?每次尝试登录时,我都会收到“身份验证失败”错误。即使我正在发送 MAIL FROM 和 RCPT TO 命令,我也有错误说“需要 MAIL 命令”和“需要 RCPT 命令”。

原文由 Yhlas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 414
2 个回答

我能够使用 smtp.gmx.com 发送电子邮件

from socket import *
import base64
import time

msg = "\r\n I love computer networks!"
endmsg = "\r\n.\r\n"
mailserver = ("smtp.gmx.com", 25) #Fill in start #Fill in end
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(mailserver)
recv = clientSocket.recv(1024)
recv = recv.decode()
print("Message after connection request:" + recv)
if recv[:3] != '220':
    print('220 reply not received from server.')
heloCommand = 'EHLO Alice\r\n'
clientSocket.send(heloCommand.encode())
recv1 = clientSocket.recv(1024)
recv1 = recv1.decode()
print("Message after EHLO command:" + recv1)
if recv1[:3] != '250':
    print('250 reply not received from server.')

#Info for username and password
username = "xxxxxx"
password = "xxxxxx"
base64_str = ("\x00"+username+"\x00"+password).encode()
base64_str = base64.b64encode(base64_str)
authMsg = "AUTH PLAIN ".encode()+base64_str+"\r\n".encode()
clientSocket.send(authMsg)
recv_auth = clientSocket.recv(1024)
print(recv_auth.decode())

mailFrom = "MAIL FROM:<xxxxxxxx>\r\n"
clientSocket.send(mailFrom.encode())
recv2 = clientSocket.recv(1024)
recv2 = recv2.decode()
print("After MAIL FROM command: "+recv2)
rcptTo = "RCPT TO:<xxxxxxxxxx>\r\n"
clientSocket.send(rcptTo.encode())
recv3 = clientSocket.recv(1024)
recv3 = recv3.decode()
print("After RCPT TO command: "+recv3)
data = "DATA\r\n"
clientSocket.send(data.encode())
recv4 = clientSocket.recv(1024)
recv4 = recv4.decode()
print("After DATA command: "+recv4)
subject = "Subject: testing my client\r\n\r\n"
clientSocket.send(subject.encode())
date = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
date = date + "\r\n\r\n"
clientSocket.send(date.encode())
clientSocket.send(msg.encode())
clientSocket.send(endmsg.encode())
recv_msg = clientSocket.recv(1024)
print("Response after sending message body:"+recv_msg.decode())
quit = "QUIT\r\n"
clientSocket.send(quit.encode())
recv5 = clientSocket.recv(1024)
print(recv5.decode())
clientSocket.close()

唯一的问题是 gmail 拒绝电子邮件,但其他一些电子邮件服务器确实会收到。现在我正在尝试从需要 SSL 或 TLS 的 smtp.gmail.com 发送电子邮件。有什么建议/帮助吗?

原文由 Yhlas 发布,翻译遵循 CC BY-SA 3.0 许可协议

是否可以在不登录服务器的情况下发送电子邮件?

这取决于服务器。 smtp.aol.com 是 AOL 邮件客户的服务器,此服务器需要您登录。AOL 的 MX ( dig mx aol.com ) 不需要您登录,因为它用于 MTA 之间的通信,但为了打击垃圾邮件,它还有其他限制。

如果不是,我该如何正确登录?

首先,您最好使用 EHLO 而不是 HELO,然后您还会看到服务器支持哪些身份验证方法。

 250-AUTH PLAIN LOGIN XAOL-UAS-MB XOAUTH2

有关 PLAIN 和 LOGIN 身份验证(及其他)的介绍,请参阅 http://www.samlogic.net/articles/smtp-commands-reference-auth.htm 。简而言之:对于 PLAIN,您必须提供 base64(username+"\0"+password)

即使我正在发送 MAIL FROM 和 RCPT TO 命令,我也有错误说“需要 MAIL 命令”和“需要 RCPT 命令”。

您没有提供调试输出,但我猜服务器正在拒绝您的 MAIL FROM 和 RCPT TO 命令,因为您未获得授权。

原文由 Steffen Ullrich 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题