sendgrid-python icon indicating copy to clipboard operation
sendgrid-python copied to clipboard

Add support for Proxies

Open pranitbauva1997 opened this issue 8 years ago • 10 comments

I have to use sendgrid to send newsletter mails. Being under a institute proxy, I have to SSH into a AWS server and then pull my script+data there and then send my mails from there.

Now I understand this feature isn't that a big improvement, but this would really help me. I want to make this fix in this package.

What are your opinions?

pranitbauva1997 avatar Oct 22 '17 06:10 pranitbauva1997

Go for it!! If this is something that you need, someone else might need it to. Please make a PR of your change, so long as it is documented, configurable, testable, and passes our build and testing - we will get it merged in.

mbernier avatar Oct 28 '17 03:10 mbernier

I guess this would need ProxyHandler added in python_http_client first or at the same time, right? https://github.com/sendgrid/python-http-client/blob/master/python_http_client/client.py

Would the intention be to add proxies kwargs when instatiating SendGridAPIClient ? And then pass the kwargs through to python_http_client Client?

campbellmc avatar Jul 27 '18 10:07 campbellmc

Hi @campbellmc,

Yes, that is correct. Thanks!

thinkingserious avatar Jul 31 '18 01:07 thinkingserious

@thinkingserious May I ask why is opts deprecated? And how opts distinguishes from the proposal from @campbellmc above?

https://github.com/sendgrid/sendgrid-python/blob/19bb39426b7a43e11efdaa5ad674559c2e50e985/sendgrid/sendgrid.py#L35-L42

splashx avatar Mar 01 '19 10:03 splashx

Looking through the code I didn't find support for proxy-based integrations. Are you still taking PRs for this open request?

adam-revops avatar Sep 08 '19 19:09 adam-revops

As a side-note - we worked around this by calling requests.post independently. We construct the payload using the sendgrid helpers and then go our own way with the actual request - like this - which included proxies we needed in a dict:

r = post(https_url, headers=headers, auth=(provider.api_key, provider.api_secret), json=payload, proxies=self.proxies)

Alas, time is short to make a PR but this work-around was shorter so you can guess which won.

campbellmc avatar Sep 08 '19 20:09 campbellmc

requests support environmental variables http_proxy and https_proxy, we thought we would also need to patch this up but we just didn’t, just export the envs and sendgrid-python will work.

splashx avatar Sep 08 '19 20:09 splashx

Thanks @campbellmc, thats a good work-around!

@splashx Thats a good suggestion, although we don't want to proxy all of our daemon's network requests through the specific proxy we are using because of network costs. These proxy requests are for running it through a secure tokenizer for email addresses and other PII to be revealed to sendgrid.

adam-revops avatar Sep 08 '19 21:09 adam-revops

as an example of how to build a request with proxies:

send_grid_api_client = SendGridAPIClient("YOUR API KEY")
tmp_url = send_grid_api_client.client.mail.send._build_url(query_params={})
headers = send_grid_api_client.client.request_headers
req_body = {'from': {'email': '[email protected]'},
                     'subject': 'my_subject',
                     'personalizations': [{'to': [{'email': 'example_reciever@example_reciever.com'}]}],
                     'content': [{'type': 'text/plain', 'value': 'my_message'}]}

import requests as rq
req = rq.post(url=tmp_url,
       json=req_body,
       headers=headers,
       proxies={"http":"my_http_proxy","https":"my_https_proxy"}
       timeout=10
             )
req.status_code==202

the above code might not be good in production.

thinkingparticle avatar Apr 18 '20 14:04 thinkingparticle

https://github.com/sendgrid/python-http-client/issues/146

chrisdlangton avatar Sep 12 '20 04:09 chrisdlangton