blob: 74a00a9d7cc58395d68195a611e46d8d8e75cb3d [file] [log] [blame]
R. David Murray87e20742009-05-23 01:30:26 +00001import unittest
2from test import support
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03003from test.support import socket_helper
R. David Murray87e20742009-05-23 01:30:26 +00004import smtplib
Christian Heimesa5768f72013-12-02 20:44:17 +01005import socket
Antoine Pitrou0d38f2e2011-05-18 20:02:50 +02006
7ssl = support.import_module("ssl")
R. David Murray87e20742009-05-23 01:30:26 +00008
R. David Murrayeccb2ce2009-05-23 02:36:15 +00009support.requires("network")
R. David Murray87e20742009-05-23 01:30:26 +000010
Christian Heimesa5768f72013-12-02 20:44:17 +010011def check_ssl_verifiy(host, port):
12 context = ssl.create_default_context()
13 with socket.create_connection((host, port)) as sock:
14 try:
15 sock = context.wrap_socket(sock, server_hostname=host)
16 except Exception:
17 return False
18 else:
19 sock.close()
20 return True
21
Antoine Pitroue0650202011-05-18 18:03:09 +020022
23class SmtpTest(unittest.TestCase):
24 testServer = 'smtp.gmail.com'
Berker Peksaged0392a2015-03-02 07:40:36 +020025 remotePort = 587
Antoine Pitroue0650202011-05-18 18:03:09 +020026
27 def test_connect_starttls(self):
28 support.get_attribute(smtplib, 'SMTP_SSL')
Christian Heimesa170fa12017-09-15 20:27:30 +020029 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
30 context.check_hostname = False
31 context.verify_mode = ssl.CERT_NONE
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030032 with socket_helper.transient_internet(self.testServer):
Antoine Pitroue0650202011-05-18 18:03:09 +020033 server = smtplib.SMTP(self.testServer, self.remotePort)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020034 try:
Christian Heimesa5768f72013-12-02 20:44:17 +010035 server.starttls(context=context)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020036 except smtplib.SMTPException as e:
37 if e.args[0] == 'STARTTLS extension not supported by server.':
38 unittest.skip(e.args[0])
39 else:
40 raise
Antoine Pitroucc9ca222011-05-18 18:04:04 +020041 server.ehlo()
42 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020043
44
R. David Murray87e20742009-05-23 01:30:26 +000045class SmtpSSLTest(unittest.TestCase):
46 testServer = 'smtp.gmail.com'
47 remotePort = 465
48
49 def test_connect(self):
R. David Murrayeccb2ce2009-05-23 02:36:15 +000050 support.get_attribute(smtplib, 'SMTP_SSL')
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030051 with socket_helper.transient_internet(self.testServer):
Antoine Pitrou6003ff72010-10-13 17:14:16 +000052 server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020053 server.ehlo()
54 server.quit()
R. David Murray87e20742009-05-23 01:30:26 +000055
Antoine Pitrouc1d52062011-05-07 19:39:37 +020056 def test_connect_default_port(self):
57 support.get_attribute(smtplib, 'SMTP_SSL')
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030058 with socket_helper.transient_internet(self.testServer):
Antoine Pitrouc1d52062011-05-07 19:39:37 +020059 server = smtplib.SMTP_SSL(self.testServer)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020060 server.ehlo()
61 server.quit()
Antoine Pitrouc1d52062011-05-07 19:39:37 +020062
Antoine Pitroue0650202011-05-18 18:03:09 +020063 def test_connect_using_sslcontext(self):
Christian Heimesa170fa12017-09-15 20:27:30 +020064 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
65 context.check_hostname = False
66 context.verify_mode = ssl.CERT_NONE
Antoine Pitroue0650202011-05-18 18:03:09 +020067 support.get_attribute(smtplib, 'SMTP_SSL')
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030068 with socket_helper.transient_internet(self.testServer):
Christian Heimesa5768f72013-12-02 20:44:17 +010069 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
70 server.ehlo()
71 server.quit()
72
Christian Heimesa5768f72013-12-02 20:44:17 +010073 def test_connect_using_sslcontext_verified(self):
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030074 with socket_helper.transient_internet(self.testServer):
Victor Stinner19c899c2014-09-04 00:35:43 +020075 can_verify = check_ssl_verifiy(self.testServer, self.remotePort)
76 if not can_verify:
77 self.skipTest("SSL certificate can't be verified")
78
Christian Heimesa5768f72013-12-02 20:44:17 +010079 support.get_attribute(smtplib, 'SMTP_SSL')
80 context = ssl.create_default_context()
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030081 with socket_helper.transient_internet(self.testServer):
Christian Heimesa5768f72013-12-02 20:44:17 +010082 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020083 server.ehlo()
84 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020085
86
R. David Murray87e20742009-05-23 01:30:26 +000087if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -050088 unittest.main()