python - запуск нескольких команд с подпроцессом через ssh - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь открыть подпроцесс для отправки электронной почты по протоколу 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 не разрешено использовать для моего назначения.

1 Ответ

0 голосов
/ 14 сентября 2018

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

Sidenote: я использовал этот скрипт в подпроцессе, и мне нужно было, чтобы это печаталось в формате html; но вот мой код, который добился цели. Если вы планируете использовать его, вам нужно сначала установить и FORMAT (с символами новой строки и прочим (чтобы сервер smtp понимал)) сначала: sender, to, subject, body, server, username, password и порт .

# 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...