diff --git a/CHANGES.rst b/CHANGES.rst
index 85c1be6..debbd61 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,10 @@ premailer Changes
 Peter's note: Unfortunately, ``premailer`` didn't use to keep a change log. But it's
 never too late to start, so let's start here and now.
 
+Unreleased
+----------
+* New option ``session=None`` to provide the session used for making http requests.
+
 3.9.0
 -----
 
diff --git a/README.rst b/README.rst
index 0dad963..1b6b8cc 100644
--- a/README.rst
+++ b/README.rst
@@ -137,6 +137,7 @@ The ``transform`` shortcut function transforms the given HTML using the defaults
     allow_network=True # allow network access to fetch linked css files
     allow_insecure_ssl=False # Don't allow unverified SSL certificates for external links
     allow_loading_external_files=False # Allow loading any non-HTTP external file URL
+    session=None # Session used for http requests - supply your own for caching or to provide authentication
 
 For more advanced options, check out the code of the ``Premailer`` class
 and all its options in its constructor.
diff --git a/premailer/premailer.py b/premailer/premailer.py
index b9d1390..66907ca 100644
--- a/premailer/premailer.py
+++ b/premailer/premailer.py
@@ -140,6 +140,7 @@ class Premailer(object):
         allow_network=True,
         allow_insecure_ssl=False,
         allow_loading_external_files=False,
+        session=None,
     ):
         self.html = html
         self.base_url = base_url
@@ -185,6 +186,7 @@ class Premailer(object):
         self.allow_network = allow_network
         self.allow_insecure_ssl = allow_insecure_ssl
         self.allow_loading_external_files = allow_loading_external_files
+        self.session = session or requests
 
         if cssutils_logging_handler:
             cssutils.log.addHandler(cssutils_logging_handler)
@@ -568,7 +570,7 @@ class Premailer(object):
             return out
 
     def _load_external_url(self, url):
-        response = requests.get(url, verify=not self.allow_insecure_ssl)
+        response = self.session.get(url, verify=not self.allow_insecure_ssl)
         response.raise_for_status()
         return response.text
 

diff --git a/premailer/tests/test_premailer.py b/premailer/tests/test_premailer.py
index 9c0c409..b4e4180 100644
--- a/premailer/tests/test_premailer.py
+++ b/premailer/tests/test_premailer.py
@@ -2084,6 +2084,17 @@ ent:"" !important;display:block !important}
         mocked_requests.get.assert_called_once_with(faux_uri, verify=True)
         eq_(faux_response, r)
 
+    def test_load_external_url_with_custom_session(self):
+        mocked_session = mock.MagicMock()
+        faux_response = "This is not a response"
+        faux_uri = "https://example.com/site.css"
+        mocked_session.get.return_value = MockResponse(faux_response)
+        p = premailer.premailer.Premailer("<p>A paragraph</p>", session=mocked_session)
+        r = p._load_external_url(faux_uri)
+
+        mocked_session.get.assert_called_once_with(faux_uri, verify=True)
+        eq_(faux_response, r)
+
     @mock.patch("premailer.premailer.requests")
     def test_load_external_url_no_insecure_ssl(self, mocked_requests):
         "Test premailer.premailer.Premailer._load_external_url"

Add cache support for _load_external_url
It would be handy if one could use `allow_network` to fetch styles and also rely on a cache for speedy results

It might be simple enough to just expose the session creation used for requests.  Then something like [CacheControl](https://2.python-requests.org/en/master/community/recommended/#cachecontrol) could be dropped in as a simple fix or something more advanced like a custom cache wrapper if needed.
premailer/tests/test_premailer.py::Tests::test_load_external_url_with_custom_session
premailer/tests/test_premailer.py::Tests::test_3_digit_color_expand premailer/tests/test_premailer.py::Tests::test_align_float_images premailer/tests/test_premailer.py::Tests::test_allow_loading_external_files premailer/tests/test_premailer.py::Tests::test_apple_newsletter_example premailer/tests/test_premailer.py::Tests::test_base_url_fixer premailer/tests/test_premailer.py::Tests::test_base_url_ignore_links premailer/tests/test_premailer.py::Tests::test_base_url_with_path premailer/tests/test_premailer.py::Tests::test_basic_html premailer/tests/test_premailer.py::Tests::test_basic_html_argument_wrong premailer/tests/test_premailer.py::Tests::test_basic_html_shortcut_function premailer/tests/test_premailer.py::Tests::test_basic_html_with_pseudo_selector premailer/tests/test_premailer.py::Tests::test_basic_xml premailer/tests/test_premailer.py::Tests::test_broken_xml premailer/tests/test_premailer.py::Tests::test_capture_cssutils_logging premailer/tests/test_premailer.py::Tests::test_child_selector premailer/tests/test_premailer.py::Tests::test_command_line_fileinput_from_argument premailer/tests/test_premailer.py::Tests::test_command_line_fileinput_from_stdin premailer/tests/test_premailer.py::Tests::test_command_line_preserve_style_tags premailer/tests/test_premailer.py::Tests::test_comments_in_media_queries premailer/tests/test_premailer.py::Tests::test_css_disable_basic_html_attributes premailer/tests/test_premailer.py::Tests::test_css_disable_leftover_css premailer/tests/test_premailer.py::Tests::test_css_text premailer/tests/test_premailer.py::Tests::test_css_text_with_only_body_present premailer/tests/test_premailer.py::Tests::test_css_with_html_attributes premailer/tests/test_premailer.py::Tests::test_css_with_pseudoclasses_excluded premailer/tests/test_premailer.py::Tests::test_css_with_pseudoclasses_included premailer/tests/test_premailer.py::Tests::test_disabled_validator premailer/tests/test_premailer.py::Tests::test_doctype premailer/tests/test_premailer.py::Tests::test_empty_style_tag premailer/tests/test_premailer.py::Tests::test_external_links premailer/tests/test_premailer.py::Tests::test_external_links_disallow_network premailer/tests/test_premailer.py::Tests::test_external_links_unfindable premailer/tests/test_premailer.py::Tests::test_external_styles_and_links premailer/tests/test_premailer.py::Tests::test_external_styles_on_http premailer/tests/test_premailer.py::Tests::test_external_styles_on_https premailer/tests/test_premailer.py::Tests::test_external_styles_with_base_url premailer/tests/test_premailer.py::Tests::test_favour_rule_with_class_over_generic premailer/tests/test_premailer.py::Tests::test_favour_rule_with_element_over_generic premailer/tests/test_premailer.py::Tests::test_favour_rule_with_id_over_others premailer/tests/test_premailer.py::Tests::test_favour_rule_with_important_over_others premailer/tests/test_premailer.py::Tests::test_fontface_selectors_with_no_selectortext premailer/tests/test_premailer.py::Tests::test_ignore_does_not_strip_importants premailer/tests/test_premailer.py::Tests::test_ignore_some_external_stylesheets premailer/tests/test_premailer.py::Tests::test_ignore_some_incorrectly premailer/tests/test_premailer.py::Tests::test_ignore_some_inline_stylesheets premailer/tests/test_premailer.py::Tests::test_ignore_style_elements_with_media_attribute premailer/tests/test_premailer.py::Tests::test_include_star_selector premailer/tests/test_premailer.py::Tests::test_inline_important premailer/tests/test_premailer.py::Tests::test_inline_wins_over_external premailer/tests/test_premailer.py::Tests::test_instance_reuse premailer/tests/test_premailer.py::Tests::test_keyframe_selectors premailer/tests/test_premailer.py::Tests::test_kwargs_html_shortcut_function premailer/tests/test_premailer.py::Tests::test_last_child premailer/tests/test_premailer.py::Tests::test_last_child_exclude_pseudo premailer/tests/test_premailer.py::Tests::test_leftover_important premailer/tests/test_premailer.py::Tests::test_links_without_protocol premailer/tests/test_premailer.py::Tests::test_load_external_url premailer/tests/test_premailer.py::Tests::test_load_external_url_404 premailer/tests/test_premailer.py::Tests::test_load_external_url_no_insecure_ssl premailer/tests/test_premailer.py::Tests::test_load_external_url_with_insecure_ssl premailer/tests/test_premailer.py::Tests::test_mailto_url premailer/tests/test_premailer.py::Tests::test_mediaquery premailer/tests/test_premailer.py::Tests::test_merge_styles_basic premailer/tests/test_premailer.py::Tests::test_merge_styles_non_trivial premailer/tests/test_premailer.py::Tests::test_merge_styles_with_class premailer/tests/test_premailer.py::Tests::test_merge_styles_with_unset premailer/tests/test_premailer.py::Tests::test_mixed_pseudo_selectors premailer/tests/test_premailer.py::Tests::test_multiple_style_elements premailer/tests/test_premailer.py::Tests::test_multithreading premailer/tests/test_premailer.py::Tests::test_parse_style_rules premailer/tests/test_premailer.py::Tests::test_precedence_comparison premailer/tests/test_premailer.py::Tests::test_prefer_inline_to_class premailer/tests/test_premailer.py::Tests::test_pseudo_selectors_without_selector premailer/tests/test_premailer.py::Tests::test_remove_classes premailer/tests/test_premailer.py::Tests::test_remove_unset_properties premailer/tests/test_premailer.py::Tests::test_six_color premailer/tests/test_premailer.py::Tests::test_strip_important premailer/tests/test_premailer.py::Tests::test_style_attribute_specificity premailer/tests/test_premailer.py::Tests::test_style_block_with_external_urls premailer/tests/test_premailer.py::Tests::test_tel_url premailer/tests/test_premailer.py::Tests::test_turnoff_cache_works_as_expected premailer/tests/test_premailer.py::Tests::test_type_test premailer/tests/test_premailer.py::Tests::test_unknown_in_media_queries premailer/tests/test_premailer.py::Tests::test_uppercase_margin premailer/tests/test_premailer.py::Tests::test_xml_cdata