1 """emailAge core API module.
2
3 This module contains all methods that are required to make a request
4 fromt the emailAge API.
5 """
6 import base64
7 import hmac
8 import hashlib
9 import urllib
10 import logging
11 from ast import literal_eval
12
13 import requests
14
15 from tools import generate_nonce_timestamp
16 from tools import split_url_and_query
17
18 logger = logging.getLogger('emailage')
19
20
22 """Generate the oauth url for emailAge
23 @param method: can be POST or GET.
24 @param url: base url to use, either prod or sandbox..
25 @param consumer_key: consumer key credential for authentication.
26 @param consumer_secret: consumer secret credential for authentication.
27 """
28
29 if not method:
30 method = "GET"
31
32 nonce, timestamp = generate_nonce_timestamp()
33 url, orig_query = split_url_and_query(url)
34
35
36 query_params = urllib.quote(orig_query, safe='=&') + '&'
37
38
39 cred_params = urllib.urlencode({'oauth_consumer_key': consumer_key, 'oauth_nonce': nonce,
40 'oauth_signature_method': 'HMAC-SHA1', 'oauth_timestamp': timestamp,
41 'oauth_version': '1.0'})
42 """ivar: credential parameters required in the payload."""
43
44 query_str = query_params + cred_params
45
46 sig_url = method.upper() + "&" + urllib.quote(url, "") + "&" + urllib.quote(query_str, "")
47
48
49 hash_result = hmac.new(consumer_secret + "&", sig_url.encode('utf-8'), hashlib.sha1).digest()
50 sig = base64.encodestring(hash_result).rstrip()
51 """ivar: signature based on consumer secret to validate request."""
52
53 oauth_url = url + "?" + query_str + "&oauth_signature=" + urllib.quote(sig.decode(), "")
54 return oauth_url
55
56
58 """Returns the base url, either sandbox or prod.
59 @param use_prod: use production url or sandbox.
60 """
61 if use_prod:
62 service_url = "https://api.emailage.com/EmailAgeValidator/"
63 else:
64 service_url = "https://sandbox.emailage.com/EmailAgeValidator/"
65 return service_url
66
67
68 -def get_emailage_score(email, customer_key, secret_token, ip=None, use_prod=False, score_only=True):
69 """Returns the emailAge score and message.
70 @param email: email address to query for, mandatory field.
71 @param customer_key: customer key as per emailAge api.
72 @param secret_token: secret key as per emailAge api.
73 @param ip: optional ip address to include in the query.
74 @param use_prod: use emailage production url instead of sandbox.
75 @return: success, emailAge score data, message
76 """
77
78 base_url = get_base_url(use_prod) + "?format=json"
79 url = get_emailage_url('POST', base_url, customer_key, secret_token)
80 data = "{}+{}".format(email, ip) if ip else email
81 """ivar: payload sent to emailAge. Email and optionally includes IP."""
82
83 try:
84 logger.info("EmailAge Request: {} {}".format(url, data))
85 r = requests.post(url, data=data)
86 resp = literal_eval(r.content)
87 logger.info("EmailAge Response: {}".format(resp))
88 results = resp['query']['results'][0]
89 except Exception as e:
90 msg = "Could not get emailAge score. {}: {}.".format(e.__class__, e)
91 logger.info("EmailAge Response: None due to error.")
92 return False, None, msg
93
94 if score_only:
95 return True, results['EAScore'], "{}. {}.".format(results.get('EAAdvice'), results.get('EAReason'))
96 else:
97 return True, results, ""
98