Как запустить TLS на активном соединении в python?
ниже приведен мой текущий код для подключения к smtp-серверу gmail на порту 587. После выдачи команды STARTTLS как бы я закончил согласование сеанса TLS и начал выдавать команды, такие как auth LOGIN и MAIL FROM? Я ввел имя пользователя gmail в кодировке Base64 и заменил его xxxxxxxx в нижней части кода.
мой вывод из этой программы как есть, это:
220 mx.google.com ESMTP y10sm3296641yhd.6
250-mx.google.com к вашим услугам, [75.66.47.144]
250-размер 35882577
250-команда 8bitmime
250-STARTTLS
250 ENHANCEDSTATUSCODES
220 2.0.0 готов к запуску TLS
from socket import *
import ssl
msg = "rn smtp.."
endmsg = "rn.rn"
# Mailserver hostname and port to be used.
mailserver = ("smtp.gmail.com", 587)
# Create a socket and create an active TCP connection with the mailserver
clientSocket = socket(AF_INET, SOCK_STREAM);
clientSocket.connect(mailserver)
# Read server response
recv = clientSocket.recv(1024)
print recv
if recv[:3] != '220':
print '220 reply not received from server.'
# Send EHLO command and print server response.
ehloCommand = 'EHLO smtp.google.comrn'
clientSocket.send(ehloCommand)
recv1 = clientSocket.recv(1024)
print recv1
if recv1[:3] != '250':
print '250 reply not received from server.'
# Send STARTTLS command to server and print server response
command = "STARTTLSrn"
clientSocket.send(command)
recv1 = clientSocket.recv(1024)
print recv1
if recv[:3] != '220':
print '220 reply not received from server.'
# SEND AUTH LOGIN command and Base64 encoded username
command = "AUTH LOGIN xxxxxxxxxxxxxrn"
clientSocket.send(command)
recv1 = clientSocket.recv(1024)
print recv1
1 ответов
вы можете SSL обернуть подключенный сокет. Это даст вам идею:
import ssl
import base64
from socket import *
cc = socket(AF_INET, SOCK_STREAM)
cc.connect(("smtp.gmail.com", 587))
# cc.read(..)
cc.send('helo tester.com\r\n')
cc.send('starttls\r\n')
# cc.read(..) If the server responds ok to starttls
# tls negotiation needs to happen and all
# communication is then over the SSL socket
scc = ssl.wrap_socket(cc, ssl_version=ssl.PROTOCOL_SSLv23)
scc.send('auth login\r\n')
# scc.read(..)
scc.send(base64.b64encode('username')+'\r\n')
scc.send(base64.b64encode('password')+'\r\n')
# css.send(
# mail from:
# rcpt to:
# data
# etc
посмотрите раздел auth LOGIN этой страницы для получения информации о кодировке имени пользователя / пароля:http://www.samlogic.net/articles/smtp-commands-reference-auth.htm
после этого команда auth LOGIN была отправлена на сервер, сервер запрашивает имя пользователя и пароль в кодировке base64 текст (вопросы) клиенту. "VXNlcm5hbWU6" является Кодированный текст BASE64 для слова "Username" и "UGFzc3dvcmQ6" используется кодированный текст BASE64 слово "пароль" в приведенном выше примере. Клиент отправляет имя пользователя и пароль также используют кодировку BASE64. "adlxdkej", в пример выше, это base64 закодированный логин и "lkujsefxlj" - это Зашифрованный пароль в base64.