title: Implementing Transport Layer Security in Python - Simple Mail Client
body: <p>I have an assignment to write a simple mail client, and to connect to a google smtp server using sockets (without using smtp lib). However, issuing a MAIL FROM command to a google smtp server requires ssl or tls, and this is the part I can't figure out. I'm trying to use Python's ssl.wrap_socket() method thusly....</p>
  
  <pre><code># Create socket called clientSocket and establish a TCP connection with mailserver
  clientSocket = socket(AF_INET, SOCK_STREAM)
  ssl_clientSocket = ssl.wrap_socket(clientSocket) 
  ssl_clientSocket.connect((mailserver, port))
  </code></pre>
  
  <p>...which isn't working. I'm pretty sure I need to include the ca_certs and ca_reqs parameters, but I'm not sure. And if this is so, how do I go about obtaining these certificates? Do I have to download openssl and generate one? Anyone with experience with this? Here's the entire code just to be on the safe side.</p>
  
  <pre><code>from socket import *
  import ssl
  
  msg = "\r\n I love computer networks!"
  endmsg = "\r\n.\r\n"
  
  # Choose a mail server (e.g. Google mail server) and call it mailserver
  mailserver = "smtp.gmail.com"
  port = 587
  
  # Create socket called clientSocket and establish a TCP connection with mailserver
  clientSocket = socket(AF_INET, SOCK_STREAM)
  ssl_clientSocket = ssl.wrap_socket(clientSocket) 
  ssl_clientSocket.connect((mailserver, port))
  
  recv = ssl_clientSocket.recv(1024)
  print
  print recv
  
  # If the first three numbers of what we receive from the SMTP server are not
  # '220', we have a problem
  if recv[:3] != '220':
      print '220 reply not received from server.'
  
  # Send HELO command and print server response.
  heloCommand = 'HELO Alice\r\n'
  ssl_clientSocket.send(heloCommand)
  recv1 = ssl_clientSocket.recv(1024)
  print recv1
  
  # If the first three numbers of the response from the server are not
  # '250', we have a problem
  if recv1[:3] != '250':
      print '250 reply not received from server.'
  
  # Send MAIL FROM command and print server response.
  mailFromCommand = 'MAIL From: wgimson@gmail.com\r\n'
  ssl_clientSocket.send(mailFromCommand)
  recv2 = ssl_clientSocket.recv(1024)
  print recv2
  
  # If the first three numbers of the response from the server are not
  # '250', we have a problem
  if recv2[:3] != '250':
      print '250 reply not received from server.'
  
  # Send RCPT TO command and print server response.
  rcptToCommand = 'RCPT To: macyali@gmail.com\r\n'
  ssl_clientSocket.send(rcptToCommand)
  recv3 = ssl_clientSocket.recv(1024)
  print recv3
  
  # If the first three numbers of the response from the server are not
  # '250', we have a problem
  if recv3[:3] != '250':
      print '250 reply not received from server.'
  
  # Send DATA command and print server response.
  dataCommand = 'DATA\r\n'
  ssl_clientSocket.send(dataCommand)
  recv4 = ssl_clientSocket.recv(1024)
  print recv4
  
  # If the first three numbers of the response from the server are not
  # '250', we have a problem
  if recv4[:3] != '250':
      print '250 reply not received from server.'
  
  # Send message data.
  ssl_clientSocket.send(msg)
  
  # Message ends with a single period.
  ssl_clientSocket.send(endmsg)
  
  # Send QUIT command and get server response.
  quitCommand = 'QUIT\r\n'
  ssl_clientSocket.send(quitCommand)
  recv5 = ssl_clientSocket.recv(I1024)
  print recv5
  
  # If the first three numbers of the response from the server are not
  # '250', we have a problem
  if recv5[:3] != '221':
      print '221 reply not received from server.'
  </code></pre>