2017-09-12 1 views
0

Après avoir fait beaucoup de recherches, j'ai pu envoyer des emails SMTP en utilisant le serveur gmail de Google. J'utilise le même code sans problème dans CPython sur Windows et Linux cependant quand j'essaie d'utiliser le code sur Micropython 1.9.2 (le plus récent au 11 septembre) sur le port ESP8266 ou Unix le code se verrouille sur la ligne 63 mais je Je n'arrive pas à comprendre pourquoi. Toutes les recommandations sur la façon de corriger ceci seraient grandement appréciées car je ne peux penser qu'à l'implémentation de SSL de Micropython et que je devrai essayer de porter le protocole SSL sur CPython.ESP8226 problème de connexion micropython ssl avec SMTP

Merci.

code Offending est:

61 heloCommand = 'EHLO Alice\r\n' 
62 ssl_clientSocket.write(heloCommand.encode()) 
63 recv1 = ssl_clientSocket.read(1024) 
64 print(recv1) 

CODE (Oui, je sais qu'il est laid et un plan pour nettoyer travailler une fois dans micropython):

# Micropython 
try: 
    import usocket as socket 
    #import base64 
    import ussl as ssl 

except: 
# Python version 3 
    import socket 
    #import base64 
    import ssl 


msg = """From: [email protected] 
To: [email protected] 
Subject: Testing 

Testing transmission thru python 
""" 
endmsg = "\r\n.\r\n" 

recipient = "[email protected]" 
sender = "[email protected]" 
username = "[email protected]" 
password = 'Mary_Had_A_Password_of_123' 

# Choose a mail server (e.g. Google mail server) and call it mailserver 
mailserver = "smtp.gmail.com" 
port = 587 

# Create socket called clientSocket and establish a TCP connection with mailserver 
clientSocket = socket.socket() 
clientSocket.connect(socket.getaddrinfo(mailserver, port)[0][-1]) 
recv = clientSocket.recv(1024) 
print(recv) 
print(recv[:3]) 
if recv[:3] != b'220': 
    print('220 reply not received from server.') 

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

# Request an encrypted connection 
startTlsCommand = 'STARTTLS\r\n' 
clientSocket.send(startTlsCommand.encode()) 
tls_recv = clientSocket.recv(1024) 
print(tls_recv) 
if tls_recv[:3] != b'220': 
    print('220 reply not received from server') 

# Encrypt the socket 
#ssl_clientSocket = ssl.wrap_socket(clientSocket, ssl_version=ssl.PROTOCOL_TLSv1) 
ssl_clientSocket = ssl.wrap_socket(clientSocket) 
print("Secure socket created") 

heloCommand = 'EHLO Alice\r\n' 
ssl_clientSocket.write(heloCommand.encode()) 
recv1 = ssl_clientSocket.read(1024) 
print(recv1) 

# Send the AUTH LOGIN command and print server response. 
authCommand = 'AUTH LOGIN\r\n' 
ssl_clientSocket.write(authCommand.encode()) 
auth_recv = ssl_clientSocket.read(1024) 
print(auth_recv) 
if auth_recv[:3] != b'334': 
    print('334 reply not received from server') 

print("Sending username/password") 
# Send username and print server response. 
#uname = base64.b64encode((username).encode()) 
uname=b'Base64EncryptedUser==' 
pword=b'Base64EncryptedPassword' 
print(str(uname)) 
ssl_clientSocket.write(uname) 
ssl_clientSocket.write('\r\n'.encode()) 
uname_recv = ssl_clientSocket.read(1024) 
print(uname_recv) 
if uname_recv[:3] != b'334': 
    print('334 reply not received from server') 

# Send password and print server response. 
#pword = base64.b64encode((password).encode()) 
print(str(pword)) 
ssl_clientSocket.write(pword) 
ssl_clientSocket.write('\r\n'.encode()) 
pword_recv = ssl_clientSocket.read(1024) 

print(pword_recv) 
if pword_recv[:3] != b'235': 
    print('235 reply not received from server') 

# Send MAIL FROM command and print server response. 
mailFromCommand = 'MAIL FROM: <' + sender + '>\r\n' 
ssl_clientSocket.write(mailFromCommand.encode()) 
recv2 = ssl_clientSocket.read(1024) 
print(recv2) 
if recv2[:3] != b'250': 
    print('250 reply not received from server.') 

# Send RCPT TO command and print server response. 
rcptToCommand = 'RCPT TO: <' + recipient + '>\r\n' 
ssl_clientSocket.write(rcptToCommand.encode()) 
recv3 = ssl_clientSocket.read(1024) 
print(recv3) 
if recv3[:3] != b'250': 
    print('250 reply not received from server.') 

# Send DATA command and print server response. 
dataCommand = 'DATA\r\n' 
ssl_clientSocket.write(dataCommand.encode()) 
recv4 = ssl_clientSocket.read(1024) 
print(recv4) 
if recv4[:3] != b'354': 
    print('354 reply not received from server.') 

# Send message data. 
ssl_clientSocket.write(msg.encode()) 

# Message ends with a single period. 
ssl_clientSocket.write(endmsg.encode()) 
recv5 = ssl_clientSocket.read(1024) 
print(recv5) 
if recv5[:3] != b'250': 
    print('250 reply not received from server.') 

# Send QUIT command and get server response. 
quitCommand = 'QUIT\r\n' 
ssl_clientSocket.write(quitCommand.encode()) 
recv6 = ssl_clientSocket.read(1024) 
print(recv6) 
if recv6[:3] != b'221': 
    print('221 reply not received from server.') 

clientSocket.close() 

CODE MISE À JOUR AVEC RÉPONSE ACCEPTÉ (Oui , Je sais que c'est moche) avec read (1024) étant remplacé par readline() pour socket ssl. Également nécessaire pour ajouter un moyen de nettoyer le tampon après la commande EHLO ssl donc ajouté un "recvCount = recv1.decode(). Count ('\ n')" dans le premier EHLO puis une boucle dans le ssh EHLO pour le même nombre:

# Micropython 
try: 
    import usocket as socket 
    #import base64 
    import ussl as ssl 

except: 
# Python version 3 
    import socket 
    #import base64 
    import ssl 


msg = """From: [email protected] 
To: [email protected] 
Subject: Testing 

Testing transmission thru python 
""" 
endmsg = "\r\n.\r\n" 

recipient = "[email protected]" 
sender = "[email protected]" 
username = "[email protected]" 
password = 'Mary_Had_A_Password_of_123' 

# Choose a mail server (e.g. Google mail server) and call it mailserver 
mailserver = "smtp.gmail.com" 
port = 587 

# Create socket called clientSocket and establish a TCP connection with mailserver 
clientSocket = socket.socket() 
clientSocket.connect(socket.getaddrinfo(mailserver, port)[0][-1]) 
recv = clientSocket.recv(1024) 
print(recv) 
print(recv[:3]) 
if recv[:3] != b'220': 
    print('220 reply not received from server.') 

# Send HELO command and print server response. 
heloCommand = 'EHLO Alice\r\n' 
clientSocket.send(heloCommand.encode()) 
recv1 = clientSocket.recv(1024) 
recvCount=recv1.decode().count('\n') 
print(recv1) 
if recv1[:3] != b'250': 
    print('250 reply not received from server.') 

# Request an encrypted connection 
startTlsCommand = 'STARTTLS\r\n' 
clientSocket.send(startTlsCommand.encode()) 
tls_recv = clientSocket.recv(1024) 
print(tls_recv) 
if tls_recv[:3] != b'220': 
    print('220 reply not received from server') 

# Encrypt the socket 
#ssl_clientSocket = ssl.wrap_socket(clientSocket, ssl_version=ssl.PROTOCOL_TLSv1) 
ssl_clientSocket = ssl.wrap_socket(clientSocket) 
print("Secure socket created") 

heloCommand = 'EHLO Alice\r\n' 
ssl_clientSocket.write(heloCommand.encode()) 
recv1='' 
for index in range(0,recvCount): 
    recv1 = recv1+ssl_clientSocket.readline().decode() 
print(recv1) 

# Send the AUTH LOGIN command and print server response. 
authCommand = 'AUTH LOGIN\r\n' 
ssl_clientSocket.write(authCommand.encode()) 
auth_recv = ssl_clientSocket.readline() 
print(auth_recv) 
if auth_recv[:3] != b'334': 
    print('334 reply not received from server') 

print("Sending username/password") 
# Send username and print server response. 
#uname = base64.b64encode((username).encode()) 
uname=b'Base64EncryptedUser==' 
pword=b'Base64EncryptedPassword' 
print(str(uname)) 
ssl_clientSocket.write(uname) 
ssl_clientSocket.write('\r\n'.encode()) 
uname_recv = ssl_clientSocket.readline() 
print(uname_recv) 
if uname_recv[:3] != b'334': 
    print('334 reply not received from server') 

# Send password and print server response. 
#pword = base64.b64encode((password).encode()) 
print(str(pword)) 
ssl_clientSocket.write(pword) 
ssl_clientSocket.write('\r\n'.encode()) 
pword_recv = ssl_clientSocket.readline() 

print(pword_recv) 
if pword_recv[:3] != b'235': 
    print('235 reply not received from server') 

# Send MAIL FROM command and print server response. 
mailFromCommand = 'MAIL FROM: <' + sender + '>\r\n' 
ssl_clientSocket.write(mailFromCommand.encode()) 
recv2 = ssl_clientSocket.readline() 
print(recv2) 
if recv2[:3] != b'250': 
    print('250 reply not received from server.') 

# Send RCPT TO command and print server response. 
rcptToCommand = 'RCPT TO: <' + recipient + '>\r\n' 
ssl_clientSocket.write(rcptToCommand.encode()) 
recv3 = ssl_clientSocket.readline() 
print(recv3) 
if recv3[:3] != b'250': 
    print('250 reply not received from server.') 

# Send DATA command and print server response. 
dataCommand = 'DATA\r\n' 
ssl_clientSocket.write(dataCommand.encode()) 
recv4 = ssl_clientSocket.readline() 
print(recv4) 
if recv4[:3] != b'354': 
    print('354 reply not received from server.') 

# Send message data. 
ssl_clientSocket.write(msg.encode()) 

# Message ends with a single period. 
ssl_clientSocket.write(endmsg.encode()) 
recv5 = ssl_clientSocket.readline() 
print(recv5) 
if recv5[:3] != b'250': 
    print('250 reply not received from server.') 

# Send QUIT command and get server response. 
quitCommand = 'QUIT\r\n' 
ssl_clientSocket.write(quitCommand.encode()) 
recv6 = ssl_clientSocket.readline() 
print(recv6) 
if recv6[:3] != b'221': 
    print('221 reply not received from server.') 

clientSocket.close() 

Répondre

0

recv1 = ssl_clientSocket.read (1024)

S'il vous plaît lire sur la sémantique de flux MicroPython (qui correspond étroitement à la sémantique de flux Python, juste avec quelques simplifications): http://docs.micropython.org/en/latest/pyboard/library/uio.html?#conceptual-hierarchy

Qu'est-ce que l'état cité ment fait demande exactement 1024 de données (MicroPython suit la sémantique Python "streamed buffer" par défaut). S'il n'y a pas beaucoup de données, .read() attendra patiemment jusqu'à ce qu'il y en ait assez (ou jusqu'à ce que l'EOF ou l'erreur survienne).

Le protocole SMTP est orienté ligne, vous devez donc utiliser .readline() à la place.

+0

Merci pour votre perspicacité, a pris un peu peaufiner mais votre recommandation a fonctionné. Revoir la documentation ci-jointe (double merci). – jawbreaker79