Usage:
$ python3 ses.py YOUR_AWS_SECRET_KEY us-east-1| #!/usr/bin/env python3 | |
| import hmac | |
| import hashlib | |
| import base64 | |
| import argparse | |
| SMTP_REGIONS = [ | |
| "us-east-2", # US East (Ohio) | |
| "us-east-1", # US East (N. Virginia) | |
| "us-west-2", # US West (Oregon) | |
| "ap-south-1", # Asia Pacific (Mumbai) | |
| "ap-northeast-2", # Asia Pacific (Seoul) | |
| "ap-southeast-1", # Asia Pacific (Singapore) | |
| "ap-southeast-2", # Asia Pacific (Sydney) | |
| "ap-northeast-1", # Asia Pacific (Tokyo) | |
| "ca-central-1", # Canada (Central) | |
| "eu-central-1", # Europe (Frankfurt) | |
| "eu-west-1", # Europe (Ireland) | |
| "eu-west-2", # Europe (London) | |
| "sa-east-1", # South America (Sao Paulo) | |
| "us-gov-west-1", # AWS GovCloud (US) | |
| ] | |
| # These values are required to calculate the signature. Do not change them. | |
| DATE = "11111111" | |
| SERVICE = "ses" | |
| MESSAGE = "SendRawEmail" | |
| TERMINAL = "aws4_request" | |
| VERSION = 0x04 | |
| def sign(key, msg): | |
| return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() | |
| def calculate_key(secret_access_key, region): | |
| if region not in SMTP_REGIONS: | |
| raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.") | |
| signature = sign(("AWS4" + secret_access_key).encode("utf-8"), DATE) | |
| signature = sign(signature, region) | |
| signature = sign(signature, SERVICE) | |
| signature = sign(signature, TERMINAL) | |
| signature = sign(signature, MESSAGE) | |
| signature_and_version = bytes([VERSION]) + signature | |
| smtp_password = base64.b64encode(signature_and_version) | |
| return smtp_password.decode("utf-8") | |
| def main(): | |
| parser = argparse.ArgumentParser( | |
| description="Convert a Secret Access Key to an SMTP password." | |
| ) | |
| parser.add_argument("secret", help="The Secret Access Key to convert.") | |
| parser.add_argument( | |
| "region", | |
| help="The AWS Region where the SMTP password will be used.", | |
| choices=SMTP_REGIONS, | |
| ) | |
| args = parser.parse_args() | |
| print(calculate_key(args.secret, args.region)) | |
| if __name__ == "__main__": | |
| main() |