blob: 7f9db2ddf09f4714be579e3cf1c27cd84f4f35d0 [file] [log] [blame]
R. David Murray87e20742009-05-23 01:30:26 +00001import unittest
2from test import support
3import smtplib
Christian Heimesa5768f72013-12-02 20:44:17 +01004import socket
Antoine Pitrou0d38f2e2011-05-18 20:02:50 +02005
6ssl = support.import_module("ssl")
R. David Murray87e20742009-05-23 01:30:26 +00007
R. David Murrayeccb2ce2009-05-23 02:36:15 +00008support.requires("network")
R. David Murray87e20742009-05-23 01:30:26 +00009
Christian Heimesa5768f72013-12-02 20:44:17 +010010def check_ssl_verifiy(host, port):
11 context = ssl.create_default_context()
12 with socket.create_connection((host, port)) as sock:
13 try:
14 sock = context.wrap_socket(sock, server_hostname=host)
15 except Exception:
16 return False
17 else:
18 sock.close()
19 return True
20
Antoine Pitroue0650202011-05-18 18:03:09 +020021
22class SmtpTest(unittest.TestCase):
23 testServer = 'smtp.gmail.com'
24 remotePort = 25
Antoine Pitroue0650202011-05-18 18:03:09 +020025
26 def test_connect_starttls(self):
27 support.get_attribute(smtplib, 'SMTP_SSL')
Christian Heimesa5768f72013-12-02 20:44:17 +010028 context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
Antoine Pitroue0650202011-05-18 18:03:09 +020029 with support.transient_internet(self.testServer):
30 server = smtplib.SMTP(self.testServer, self.remotePort)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020031 try:
Christian Heimesa5768f72013-12-02 20:44:17 +010032 server.starttls(context=context)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020033 except smtplib.SMTPException as e:
34 if e.args[0] == 'STARTTLS extension not supported by server.':
35 unittest.skip(e.args[0])
36 else:
37 raise
Antoine Pitroucc9ca222011-05-18 18:04:04 +020038 server.ehlo()
39 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020040
41
R. David Murray87e20742009-05-23 01:30:26 +000042class SmtpSSLTest(unittest.TestCase):
43 testServer = 'smtp.gmail.com'
44 remotePort = 465
Christian Heimesa5768f72013-12-02 20:44:17 +010045 can_verify = check_ssl_verifiy(testServer, remotePort)
R. David Murray87e20742009-05-23 01:30:26 +000046
47 def test_connect(self):
R. David Murrayeccb2ce2009-05-23 02:36:15 +000048 support.get_attribute(smtplib, 'SMTP_SSL')
Antoine Pitrou6003ff72010-10-13 17:14:16 +000049 with support.transient_internet(self.testServer):
50 server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020051 server.ehlo()
52 server.quit()
R. David Murray87e20742009-05-23 01:30:26 +000053
Antoine Pitrouc1d52062011-05-07 19:39:37 +020054 def test_connect_default_port(self):
55 support.get_attribute(smtplib, 'SMTP_SSL')
56 with support.transient_internet(self.testServer):
57 server = smtplib.SMTP_SSL(self.testServer)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020058 server.ehlo()
59 server.quit()
Antoine Pitrouc1d52062011-05-07 19:39:37 +020060
Antoine Pitroue0650202011-05-18 18:03:09 +020061 def test_connect_using_sslcontext(self):
Christian Heimesa5768f72013-12-02 20:44:17 +010062 context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
Antoine Pitroue0650202011-05-18 18:03:09 +020063 support.get_attribute(smtplib, 'SMTP_SSL')
64 with support.transient_internet(self.testServer):
Christian Heimesa5768f72013-12-02 20:44:17 +010065 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
66 server.ehlo()
67 server.quit()
68
69 @unittest.skipUnless(can_verify, "SSL certificate can't be verified")
70 def test_connect_using_sslcontext_verified(self):
71 support.get_attribute(smtplib, 'SMTP_SSL')
72 context = ssl.create_default_context()
73 with support.transient_internet(self.testServer):
74 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020075 server.ehlo()
76 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020077
78
R. David Murray87e20742009-05-23 01:30:26 +000079def test_main():
Antoine Pitroue0650202011-05-18 18:03:09 +020080 support.run_unittest(SmtpTest, SmtpSSLTest)
R. David Murray87e20742009-05-23 01:30:26 +000081
82if __name__ == "__main__":
83 test_main()