blob: 72f51cd8d81f5906ce16d322dc2592362538cb9b [file] [log] [blame]
R. David Murray87e20742009-05-23 01:30:26 +00001import unittest
2from test import support
Hai Shi847f94f2020-06-26 01:17:57 +08003from test.support import import_helper
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +03004from test.support import socket_helper
R. David Murray87e20742009-05-23 01:30:26 +00005import smtplib
Christian Heimesa5768f72013-12-02 20:44:17 +01006import socket
Antoine Pitrou0d38f2e2011-05-18 20:02:50 +02007
Hai Shi847f94f2020-06-26 01:17:57 +08008ssl = import_helper.import_module("ssl")
R. David Murray87e20742009-05-23 01:30:26 +00009
R. David Murrayeccb2ce2009-05-23 02:36:15 +000010support.requires("network")
R. David Murray87e20742009-05-23 01:30:26 +000011
Christian Heimesa5768f72013-12-02 20:44:17 +010012def check_ssl_verifiy(host, port):
13 context = ssl.create_default_context()
14 with socket.create_connection((host, port)) as sock:
15 try:
16 sock = context.wrap_socket(sock, server_hostname=host)
17 except Exception:
18 return False
19 else:
20 sock.close()
21 return True
22
Antoine Pitroue0650202011-05-18 18:03:09 +020023
24class SmtpTest(unittest.TestCase):
25 testServer = 'smtp.gmail.com'
Berker Peksaged0392a2015-03-02 07:40:36 +020026 remotePort = 587
Antoine Pitroue0650202011-05-18 18:03:09 +020027
28 def test_connect_starttls(self):
29 support.get_attribute(smtplib, 'SMTP_SSL')
Christian Heimesa170fa12017-09-15 20:27:30 +020030 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
31 context.check_hostname = False
32 context.verify_mode = ssl.CERT_NONE
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030033 with socket_helper.transient_internet(self.testServer):
Antoine Pitroue0650202011-05-18 18:03:09 +020034 server = smtplib.SMTP(self.testServer, self.remotePort)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020035 try:
Christian Heimesa5768f72013-12-02 20:44:17 +010036 server.starttls(context=context)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020037 except smtplib.SMTPException as e:
38 if e.args[0] == 'STARTTLS extension not supported by server.':
39 unittest.skip(e.args[0])
40 else:
41 raise
Antoine Pitroucc9ca222011-05-18 18:04:04 +020042 server.ehlo()
43 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020044
45
R. David Murray87e20742009-05-23 01:30:26 +000046class SmtpSSLTest(unittest.TestCase):
47 testServer = 'smtp.gmail.com'
48 remotePort = 465
49
50 def test_connect(self):
R. David Murrayeccb2ce2009-05-23 02:36:15 +000051 support.get_attribute(smtplib, 'SMTP_SSL')
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030052 with socket_helper.transient_internet(self.testServer):
Antoine Pitrou6003ff72010-10-13 17:14:16 +000053 server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020054 server.ehlo()
55 server.quit()
R. David Murray87e20742009-05-23 01:30:26 +000056
Antoine Pitrouc1d52062011-05-07 19:39:37 +020057 def test_connect_default_port(self):
58 support.get_attribute(smtplib, 'SMTP_SSL')
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030059 with socket_helper.transient_internet(self.testServer):
Antoine Pitrouc1d52062011-05-07 19:39:37 +020060 server = smtplib.SMTP_SSL(self.testServer)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020061 server.ehlo()
62 server.quit()
Antoine Pitrouc1d52062011-05-07 19:39:37 +020063
Antoine Pitroue0650202011-05-18 18:03:09 +020064 def test_connect_using_sslcontext(self):
Christian Heimesa170fa12017-09-15 20:27:30 +020065 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
66 context.check_hostname = False
67 context.verify_mode = ssl.CERT_NONE
Antoine Pitroue0650202011-05-18 18:03:09 +020068 support.get_attribute(smtplib, 'SMTP_SSL')
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030069 with socket_helper.transient_internet(self.testServer):
Christian Heimesa5768f72013-12-02 20:44:17 +010070 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
71 server.ehlo()
72 server.quit()
73
Christian Heimesa5768f72013-12-02 20:44:17 +010074 def test_connect_using_sslcontext_verified(self):
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030075 with socket_helper.transient_internet(self.testServer):
Victor Stinner19c899c2014-09-04 00:35:43 +020076 can_verify = check_ssl_verifiy(self.testServer, self.remotePort)
77 if not can_verify:
78 self.skipTest("SSL certificate can't be verified")
79
Christian Heimesa5768f72013-12-02 20:44:17 +010080 support.get_attribute(smtplib, 'SMTP_SSL')
81 context = ssl.create_default_context()
Serhiy Storchakabfb1cf42020-04-29 10:36:20 +030082 with socket_helper.transient_internet(self.testServer):
Christian Heimesa5768f72013-12-02 20:44:17 +010083 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020084 server.ehlo()
85 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020086
87
R. David Murray87e20742009-05-23 01:30:26 +000088if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -050089 unittest.main()