blob: b69cd9de62724aed1b4457a1f48c605af9c659d6 [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'
Berker Peksaged0392a2015-03-02 07:40:36 +020024 remotePort = 587
Antoine Pitroue0650202011-05-18 18:03:09 +020025
26 def test_connect_starttls(self):
27 support.get_attribute(smtplib, 'SMTP_SSL')
Christian Heimesa170fa12017-09-15 20:27:30 +020028 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
29 context.check_hostname = False
30 context.verify_mode = ssl.CERT_NONE
Antoine Pitroue0650202011-05-18 18:03:09 +020031 with support.transient_internet(self.testServer):
32 server = smtplib.SMTP(self.testServer, self.remotePort)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020033 try:
Christian Heimesa5768f72013-12-02 20:44:17 +010034 server.starttls(context=context)
Nadeem Vawda3fc58682011-07-30 23:46:54 +020035 except smtplib.SMTPException as e:
36 if e.args[0] == 'STARTTLS extension not supported by server.':
37 unittest.skip(e.args[0])
38 else:
39 raise
Antoine Pitroucc9ca222011-05-18 18:04:04 +020040 server.ehlo()
41 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020042
43
R. David Murray87e20742009-05-23 01:30:26 +000044class SmtpSSLTest(unittest.TestCase):
45 testServer = 'smtp.gmail.com'
46 remotePort = 465
47
48 def test_connect(self):
R. David Murrayeccb2ce2009-05-23 02:36:15 +000049 support.get_attribute(smtplib, 'SMTP_SSL')
Antoine Pitrou6003ff72010-10-13 17:14:16 +000050 with support.transient_internet(self.testServer):
51 server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020052 server.ehlo()
53 server.quit()
R. David Murray87e20742009-05-23 01:30:26 +000054
Antoine Pitrouc1d52062011-05-07 19:39:37 +020055 def test_connect_default_port(self):
56 support.get_attribute(smtplib, 'SMTP_SSL')
57 with support.transient_internet(self.testServer):
58 server = smtplib.SMTP_SSL(self.testServer)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020059 server.ehlo()
60 server.quit()
Antoine Pitrouc1d52062011-05-07 19:39:37 +020061
Antoine Pitroue0650202011-05-18 18:03:09 +020062 def test_connect_using_sslcontext(self):
Christian Heimesa170fa12017-09-15 20:27:30 +020063 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
64 context.check_hostname = False
65 context.verify_mode = ssl.CERT_NONE
Antoine Pitroue0650202011-05-18 18:03:09 +020066 support.get_attribute(smtplib, 'SMTP_SSL')
67 with support.transient_internet(self.testServer):
Christian Heimesa5768f72013-12-02 20:44:17 +010068 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
69 server.ehlo()
70 server.quit()
71
Christian Heimesa5768f72013-12-02 20:44:17 +010072 def test_connect_using_sslcontext_verified(self):
Victor Stinner19c899c2014-09-04 00:35:43 +020073 with support.transient_internet(self.testServer):
74 can_verify = check_ssl_verifiy(self.testServer, self.remotePort)
75 if not can_verify:
76 self.skipTest("SSL certificate can't be verified")
77
Christian Heimesa5768f72013-12-02 20:44:17 +010078 support.get_attribute(smtplib, 'SMTP_SSL')
79 context = ssl.create_default_context()
80 with support.transient_internet(self.testServer):
81 server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
Antoine Pitroucc9ca222011-05-18 18:04:04 +020082 server.ehlo()
83 server.quit()
Antoine Pitroue0650202011-05-18 18:03:09 +020084
85
R. David Murray87e20742009-05-23 01:30:26 +000086if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -050087 unittest.main()