2015-10-28 30 views
6

Sto provando a scrivere un programma python che invierà e-mail senza usare smtplib. Ho provato a cercare altri post su questo ma non sono riuscito a trovare una soluzione.Client di posta in Python usando solo socket (senza 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:<[email protected]>\r\n" 
clientSocket.send(mailFrom.encode()) 
recv2 = clientSocket.recv(1024) 
recv2 = recv2.decode() 
print("After MAIL FROM command: "+recv2) 

rcptTo = "RCPT TO:<[email protected]>\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()` 

E 'possibile inviare una e-mail senza accedere al server? In caso contrario, come posso accedere correttamente? Ogni volta che ho provato ad accedere ho ricevuto l'errore "autenticazione fallita". Ho anche errori nel dire "Need MAIL command" e "Need RCPT command" anche se sto inviando comandi MAIL FROM e RCPT TO.

+0

Dai un'occhiata a https://github.com/PabloVallejo/mail-client/blob/master/client.py –

risposta

3

sono stato in grado di inviare e-mail utilizzando 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() 

L'unico problema è che Gmail rifiuta messaggi di posta elettronica, ma alcuni altri server di posta elettronica ricevono. Ora sto cercando di inviare email da smtp.gmail.com che richiede SSL o TLS. Qualche suggerimento/aiuto su questo?

+1

Se si desidera porre un'altra domanda, non chiedere nella risposta. –

1

Is it possible to send an email without logging in to server?

Dipende dal server. smtp.aol.com è il server per i clienti di posta AOL e questo server ha bisogno di accedere. MX per AOL (dig mx aol.com) non ha bisogno di effettuare l'accesso poiché è utilizzato per la comunicazione tra MTA ma ha altre restrizioni per combattere lo spam.

If not how do I login correctly?

In primo luogo si dovrebbe meglio utilizzare EHLO non HELO e poi si sarebbe anche vedere quali metodi di autenticazione sono supportati dal server.

250-AUTH PLAIN LOGIN XAOL-UAS-MB XOAUTH2 

Per un'introduzione in PLAIN e autenticazione di accesso (e altri) vedere http://www.samlogic.net/articles/smtp-commands-reference-auth.htm. In breve: per PLAIN devi fornire base64(username+"\0"+password).

I also have errors saying "Need MAIL command" and "Need RCPT command" even though I am sending MAIL FROM and RCPT TO commands.

vi forniamo alcuna uscita di debug, ma immagino che il server sta rifiutando la tua MAIL FROM e RCPT TO comandi, perché non si è autorizzati.

+0

Ho cambiato errore nel comando EHLO. Ho modificato parte autorizzazione come segue: 'authMsg = "AUTH PLAIN \ r \ n" clientSocket.send (authMsg.encode()) recv_auth = clientSocket.recv (1024) stampa (recv_auth.decode()) # auth = username + "\ 0" + password base64_str = ('% s \ 0% s'% (nome utente, password)). encode() auth = base64.b64encode (base64_str) clientSocket.send (auth) recv_user = clientSocket.recv (1024) di stampa ("risposta dopo auth:" + recv_user.decode()) ' – Yhlas

+0

Ora ho il seguente errore: di risposta dopo l'autenticazione: 421 4.4.2 mtaout-mba01.mx. aol.com Errore: timeout superato Traceback (ultima chiamata ultima): File "mailclient.py", riga 61, in recv2 = clientSocket.recv (1024) ConnectionAbortedError: [WinError 10053] Una connessione stabilita è stata interrotta dal software nel computer host – Yhlas

1

Potrebbe essere necessario abilitare IMAP per poter utilizzare smtp.gmail.com. L'ho fatto e funziona perfettamente. Devi utilizzare la porta 587 o 465. Per abilitare IMAP fai clic sull'icona dell'ingranaggio nel tuo account Gmail, quindi fai clic su Inoltro e POP/IMAP. Infine, fai clic su abilita IMAP e salva le modifiche. Questo dovrebbe funzionare.