Python - запуск нескольких команд с подпроцессом через ssh

Я пытаюсь открыть подпроцесс для отправки электронного письма по протоколу SMTP на моем сервере. Для этого мне нужен безопасный канал TLS, поэтому мне нужен модуль SSL. Мне это не удается, так как я не могу взаимодействовать через openssl через подпроцесс.

Вот как я представляю, как должен работать мой сценарий.

1. Открытое ssl-соединение: openssl s_client -connect smtp.server.com:587 -starttls smtp

1.1. Общайтесь по этому каналу, чтобы войти: AUTH PLAIN ENCODEDLOGINSTRING ==

1.2. Общайтесь по этому каналу для отправки писем: ПОЧТА ОТ: myemail@server.com

Мой скрипт не должен ничего возвращать, кроме "почта была отправлена".

Как мне этого добиться?

Примечание: smtplib нельзя использовать для моего задания.

0
0
136
1

Ответы 1

Я обнаружил, что для этого лучше всего использовать сокет (а не подпроцесс), а затем использовать команду «STARTTLS», а затем обернуть сокет ssl, чтобы получить безопасное tls-соединение. После этого вы можете приступить к отправке ваших команд rcpt к: и т. д. И отправить фактическую почту через сокет.

Замечание: я использовал этот скрипт в подпроцессе, и он мне понадобился для печати вещей в формате html; но вот мой код, который помог. Если вы планируете использовать его, вам нужно сначала установить и ФОРМАТИРОВАТЬ (с символами новой строки и прочим (чтобы сервер smtp понимал)) эти переменные: отправитель, кому, тема, тело, сервер, имя пользователя, пароль и порт.

# check if server is valid
try:
    socket.gethostbyname(server)
except socket.gaierror:
    print("""
    <p>
    Something seems wrong with the server...
    </p>
    """)
    exit()

# make a connection with the server
mailserver = (server, port)
socket.mailsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.mailsocket.connect(mailserver)
step1 = socket.mailsocket.recv(1024)
step1 = step1.decode()
if (step1[:3] != '220'):
    print("""
    <p>
    Something seems wrong with the server...
    </p>
    """)
    exit()

# use tls connection with server
starttls = "STARTTLS" + "\r\n"
socket.mailsocket.send(starttls.encode())
step2 = socket.mailsocket.recv(1024)
step2 = step2.decode()
if (step2[:3] != '220'):
    print("""
    <p>
    Something seems wrong with the TLS connection...
    </p>
    """)
    exit()

# now use SSL
ssl = ssl.wrap_socket(socket.mailsocket, ssl_version=ssl.PROTOCOL_TLSv1_2)
socket.mailsocket = ssl

# set username and password and encode
base64_str = ("\x00"+username+"\x00"+password).encode()
base64_str = base64.b64encode(base64_str)
auth = "AUTH PLAIN ".encode()+base64_str+"\r\n".encode()
socket.mailsocket.send(auth)
step3 = socket.mailsocket.recv(1024)
step3 = step3.decode()
if (step3[:3] != '235'):
    print("""
    <p>
    It seems like your username/password combination is incorrect...
    </p>
    """)
    exit()

# set sender address
sender = "mail from: " + sender + "\r\n"
socket.mailsocket.send(sender.encode())
step4 = socket.mailsocket.recv(1024)
step4 = step4.decode()
if (step4[:3] != '250'):
    print("""
    <p>
    It seems like the sender address is incorrect...
    </p>
    """)
    exit()

# set to address
to = "rcpt to: " + to + "\r\n"
socket.mailsocket.send(to.encode())
step5 = socket.mailsocket.recv(1024)
step5 = step5.decode()
if (step5[:3] != '250'):
    print("""
    <p>
    It seems like the destination address is incorrect...
    </p>
    """)
    exit()

# send data command
data = "data\r\n"
socket.mailsocket.send(data.encode())
step6 = socket.mailsocket.recv(1024)
step6 = step6.decode()
if (step6[:3] != '354'):
    print("""
    <p>
    It seems like the server responds different on the DATA command...
    </p>
    """)
    exit()

# send message subject and body
socket.mailsocket.send(subject.encode())
socket.mailsocket.send(body.encode())
step7 = socket.mailsocket.recv(1024)
step7 = step7.decode()
if (step7[:3] != '250'):
    print("""
    <p>
    It seems like there is something wrong with your message body...
    </p>
    """)
    exit()
else:
    print("""
    <p>
    Your message is queued and will sent as soon as possible!
    </p>
    """)
quit = "QUIT\r\n"
socket.mailsocket.send(quit.encode())

step8 = socket.mailsocket.recv(1024)
step8 = step8.decode()
if (step8[:3] == '221'):
    print("""
    <p>
    Closing connection; bye!
    </p>
    """)
socket.mailsocket.close()

Другие вопросы по теме