Почтовый клиент в Python, использующий только сокеты (без smtplib)

Я пытаюсь написать программу python, которая будет отправлять электронные письма без использования smtplib. Я попытался посмотреть другие сообщения об этом, но не смог найти решение.

`from socket import *


msg = "rn My email's content!"
endmsg = "rn.rn"

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 Alicern'
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 LOGINrn"
# clientSocket.send(authMsg.encode())
# recv_auth = clientSocket.recv(1024)
# print(recv_auth.decode())

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

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


# clientSocket.send(('starttlsrn').encode())
# recv_tls = clientSocket.recv(1024)
# print(recv_tls.decode())



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

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

data = "DATArn"
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 = "QUITrn"
clientSocket.send(quit.encode())
recv5 = clientSocket.recv(1024)
print(recv5.decode())
clientSocket.close()` 

можно ли отправить электронное письмо без входа на сервер? Если нет, Как правильно войти в систему? Каждый раз, когда я пытался войти в систему, я получал ошибку "ошибка аутентификации". У меня также есть ошибки, говорящие "нужна команда почты" и "нужна команда RCPT", хотя я отправляю почту и RCPT командам.

3 ответов


я смог отправить электронную почту, используя 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 отклоняет электронные письма,но некоторые другие почтовые серверы получают. Теперь я пытаюсь отправить электронное письмо от smtp.gmail.com что требует SSL или TLS. Любые предложения / помощь по этому поводу?


можно ли отправить электронное письмо без входа на сервер?

Это зависит от сервера. smtp.aol.com является сервером для клиентов AOL mail, и этот сервер нуждается в вас для входа в систему. MX для AOL (dig mx aol.com) вам не нужно входить в систему, так как он используется для связи между MTA, но у него есть другие ограничения для борьбы со спамом.

если нет, Как правильно войти в систему?

сначала вы должны лучше использовать EHLO не HELO, а затем вы также увидите, какие методы аутентификации поддерживаются сервером.

250-AUTH PLAIN LOGIN XAOL-UAS-MB XOAUTH2

для введения в обычную аутентификацию и аутентификацию входа (и другие) см. http://www.samlogic.net/articles/smtp-commands-reference-auth.htm. Короче говоря: для равнины вы должны предоставить base64(username+""+password).

у меня также есть ошибки, говорящие "нужна команда почты" и "нужна команда RCPT", хотя я отправляю почту и RCPT команды.

вы не предоставляете отладочный вывод, но я думаю, что сервер отклоняет вашу почту и RCPT командам, потому что вы не авторизованы.


вам может потребоваться включить IMAP для использования smtp.gmail.com - ... Я только что сделал это, и это работает отлично. Вы должны использовать порт 587 или 465. Чтобы включить IMAP, нажмите на значок шестеренки в своей учетной записи gmail, затем нажмите переадресация и POP / IMAP. Наконец, нажмите Включить IMAP и сохраните изменения. Это должно сработать.