SMTP邮件客户端Python

时间:2013-11-02 00:49:56

标签: python syntax smtp

我必须在Python中编写一个用于类的SMTP邮件客户端,并且我被困在作业的第一部分。经过多次麻烦我已经走到了这一步(目前使用Free Portable SMTP服务器,但稍后需要使用SSL或TLS进行gmail)。以下是我的代码。当它到达RCPT TO部分代码时,我收到500语法错误。有人可以帮忙吗?

from socket import *
msg = "\r\n I love computer networks!"
endmsg = "\r\n.\r\n"

# Choose a mail server
mailServer = 'localhost'
mailPort = 25

# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket(AF_INET,SOCK_STREAM)
clientSocket.connect((mailServer, mailPort))
recv = clientSocket.recv(1024)
print 'test'
print recv
if recv[:3] != '220':
    print '220 reply not received from server.'

# Send HELLO command and print server response.
helloCommand = 'HELO Alice\r\n';
clientSocket.send(helloCommand)
recv1 = clientSocket.recv(1024)
print recv1
if recv1[:3] != '250':
    print '250 reply not received from server.'

# Send MAIL FROM command and print server response.
#command = "STARTTLS\r\n"
#clientSocket.send(command)
#recva = clientSocket.recv(1024)
#print(recva)
mailfromCommand = 'MAIL FROM: <mail@mail.com>\r\n.'
clientSocket.send(mailfromCommand)
recv1 = clientSocket.recv(1024)
print(recv1)
if recv1[:3] != '250':
    print('mail from 250 reply not received from server.')

# Send RCPT TO command and print server response.
rcpttoCommand = 'RCPT TO: <myemail@gmail.com>\r\n'
clientSocket.send(rcpttoCommand)
recv1 = clientSocket.recv(1024)
print(recv1)
if recv1[:3] != '250':
    print('rcpt to 250 reply not received from server.')

# Send DATA command and print server response
dataCommand = 'Data'
print(dataCommand)
clientSocket.send(dataCommand)
recv1 = clientSocket.recv(1024)
print(recv1)
if recv1[:3] != '250':
    print('data 250 reply not received from server.')

# Send message data.
message = raw_input('Enter Message Here: ')

# Fill in end# Message ends with a single period.
mailMessageEnd = '\r\n.\r\n'
clientSocket.send(message + mailMessageEnd)
recv1 = clientSocket.recv(1024)
print(recv1)
if recv1[:3] != '250':
    print('end msg 250 reply not received from server.')

# Send QUIT command and get server response.
quitCommand = 'Quit\r\n'
print(quitCommand)
clientSocket.send(quitCommand)
recv1 = clientSocket.recv(1024)
print(recv1)
if recv1[:3] != '250':
    print('quit 250 reply not received from server.')

    pass

if __name__ == '__main__':
    main()

结果:

test
220 localhost


250 Hello localhost


250 mail@mail.com Address Okay


RCPT TO: <myemail@gmail.com>


500 Syntax Error


rcpt to 250 reply not received from server.
Data

1 个答案:

答案 0 :(得分:2)

最可能出现的问题是:

mailfromCommand = 'MAIL FROM: <mail@mail.com>\r\n.'

注意最后的额外.?那么,你发送服务器的最终结果是:

MAIL FROM: <mail@mail.com>
.RCPT TO: <myemail@gmail.com>

.RCPT是语法错误。


但是,代码中还有另外两个非常严重的问题。

首先,不能保证send发送您提供的所有数据。这就是它返回实际发送的字节数的原因。因此,您可以轻松地将其作为命令的一部分发送。

这个问题很容易解决:只需使用sendall代替send


第二个是,不能保证每个recv只能得到一行数据。它可以在一个recv中获得6个字符,然后在下一个中获得19个字符。 TCP sockets are byte streams, not message streams,您可以根据协议在其上构建消息流。

想象一下,如果您在一个250 mail@mail.com Addr中获得recv,然后在下一个中获得ess OK\r\n250 myemail@gmail.com Address OK\r\n,会发生什么。您将检查第二个是否以250开头,发现它没有,并且失败。

通常情况下解决这个问题并不简单 - 通常你必须缓冲和解析消息,这意味着要么编写生成器,要么完全重新组织代码。

但是对于像SMTP这样的逐行协议,这很简单:只需使用makefile,它会返回一个文件对象,您可以迭代或调用readline,并且它会神奇地为你处理缓冲。


看起来这三个错误显然都在你老师给你的代码中。更不用说像helloCommand = 'HELO Alice\r\n'末尾的杂散分号(这是由一个实际上并不知道Python的人编写的代码的红色标记)。你可能想要阅读Socket Programming HOWTO,或者更好的,一个更完整的教程(谷歌有望为你找到),这样你就可以学习如何实际编写工作程序,而不是几乎99%的时间都能破解废话当计算机不太忙时,在你平台上的localhost上。

相关问题