sendgrid-python
sendgrid-python copied to clipboard
Add support for Proxies
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?
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.
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?
Hi @campbellmc,
Yes, that is correct. Thanks!
@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
Looking through the code I didn't find support for proxy-based integrations. Are you still taking PRs for this open request?
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.
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.
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.
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.
https://github.com/sendgrid/python-http-client/issues/146