test_smtpnet.py 2.7 KB
Newer Older
1 2 3
import unittest
from test import support
import smtplib
4
import socket
5 6

ssl = support.import_module("ssl")
7

8
support.requires("network")
9

10 11 12 13 14 15 16 17 18 19 20
def check_ssl_verifiy(host, port):
    context = ssl.create_default_context()
    with socket.create_connection((host, port)) as sock:
        try:
            sock = context.wrap_socket(sock, server_hostname=host)
        except Exception:
            return False
        else:
            sock.close()
            return True

21 22 23

class SmtpTest(unittest.TestCase):
    testServer = 'smtp.gmail.com'
24
    remotePort = 587
25 26 27

    def test_connect_starttls(self):
        support.get_attribute(smtplib, 'SMTP_SSL')
28
        context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
29 30
        with support.transient_internet(self.testServer):
            server = smtplib.SMTP(self.testServer, self.remotePort)
31
            try:
32
                server.starttls(context=context)
33 34 35 36 37
            except smtplib.SMTPException as e:
                if e.args[0] == 'STARTTLS extension not supported by server.':
                    unittest.skip(e.args[0])
                else:
                    raise
38 39
            server.ehlo()
            server.quit()
40 41


42 43 44 45 46
class SmtpSSLTest(unittest.TestCase):
    testServer = 'smtp.gmail.com'
    remotePort = 465

    def test_connect(self):
47
        support.get_attribute(smtplib, 'SMTP_SSL')
48 49
        with support.transient_internet(self.testServer):
            server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
50 51
            server.ehlo()
            server.quit()
52

53 54 55 56
    def test_connect_default_port(self):
        support.get_attribute(smtplib, 'SMTP_SSL')
        with support.transient_internet(self.testServer):
            server = smtplib.SMTP_SSL(self.testServer)
57 58
            server.ehlo()
            server.quit()
59

60
    def test_connect_using_sslcontext(self):
61 62 63 64 65 66 67 68
        context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
        support.get_attribute(smtplib, 'SMTP_SSL')
        with support.transient_internet(self.testServer):
            server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
            server.ehlo()
            server.quit()

    def test_connect_using_sslcontext_verified(self):
69 70 71 72 73
        with support.transient_internet(self.testServer):
            can_verify = check_ssl_verifiy(self.testServer, self.remotePort)
            if not can_verify:
                self.skipTest("SSL certificate can't be verified")

74
        support.get_attribute(smtplib, 'SMTP_SSL')
75
        context = ssl.create_default_context()
76
        with support.transient_internet(self.testServer):
77
            server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context)
78 79
            server.ehlo()
            server.quit()
80 81


82
if __name__ == "__main__":
83
    unittest.main()