diff --git a/SQL/SendGrid-Text.txt b/SQL/SendGrid-Text.txt new file mode 100644 index 0000000..5d05cb3 --- /dev/null +++ b/SQL/SendGrid-Text.txt @@ -0,0 +1,56 @@ + + "MERMS-Web" was successfully created and added to the next step. +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 +Configure your application +Configure your application with the settings below. + +Server smtp.sendgrid.net +Ports +25, 587 (for unencrypted/TLS connections) +465 (for SSL connections) +Username apikey +Password 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 + + + +Create an API key +This allows your application to authenticate to our API and send mail. You can enable or disable additional permissions on the API keys page. + + "Chief-Works" was successfully created and added to the next step. +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 +Configure your application +Configure your application with the settings below. + +Server smtp.sendgrid.net +Ports +25, 587 (for unencrypted/TLS connections) +465 (for SSL connections) +Username apikey +Password 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 + + +SMTP credentials +IAM user name + +ses-smtp-user.20260425-142515 +SMTP user name + +AKIAZAI4GVFJOPMTPLPL +SMTP password + +BBawlUaS79J04F++4PvIhd2ULJT61vLOWvGNQKIPM6q+ +Hide + + + +SMTP credentials +IAM user name + +ses-smtp-user.20260425-144948 +SMTP user name + +AKIAZAI4GVFJK2G2HEHE +SMTP password + +BE9Lc5jMU1m58Jlfeey20IQ7OPz5jBA3q8BhMwVJjLD7 +Hide \ No newline at end of file diff --git a/app/notifications/__init__.py b/app/notifications/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/notifications/aws/aws_mailer.py b/app/notifications/aws/aws_mailer.py new file mode 100644 index 0000000..728f08a --- /dev/null +++ b/app/notifications/aws/aws_mailer.py @@ -0,0 +1,39 @@ +import boto3 +from botocore.exceptions import ClientError +from app.utils.logger import logger + + +# @staticmethod +def send_email_ses(to_email, subject, html_content, text_content=None): + AWS_REGION = "us-east-1" + FROM_EMAIL = "support@mermsemr.com" # Must be verified in SES + + client = boto3.client( + "ses", + region_name=AWS_REGION, + # Credentials pulled from env vars: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY + # or from IAM role if running on EC2/ECS + ) + + body = {"Html": {"Charset": "UTF-8", "Data": html_content}} + if text_content: + body["Text"] = {"Charset": "UTF-8", "Data": text_content} + + try: + response = client.send_email( + Source=FROM_EMAIL, + Destination={"ToAddresses": [to_email]}, + Message={ + "Subject": {"Charset": "UTF-8", "Data": subject}, + "Body": body, + }, + ) + logger.info(f"SES email sent. MessageId: {response['MessageId']}") + return response + + except ClientError as e: + logger.error(f"SES ClientError: {e.response['Error']['Message']}") + raise + except Exception as e: + logger.error(f"SES send failed: {e}") + raise diff --git a/app/notifications/mail_factory.py b/app/notifications/mail_factory.py new file mode 100644 index 0000000..e69de29 diff --git a/app/notifications/sendgrid/sendgrid_mailer.py b/app/notifications/sendgrid/sendgrid_mailer.py new file mode 100644 index 0000000..10ee25a --- /dev/null +++ b/app/notifications/sendgrid/sendgrid_mailer.py @@ -0,0 +1,37 @@ +from app.utils.logger import logger +from marshmallow import ValidationError +from flask_mail import Mail, Message +from sendgrid import SendGridAPIClient +from sendgrid.helpers.mail import Mail + + +@staticmethod +def test_new_mailer(): + + # Replace these with your actual details + SENDGRID_API_KEY = "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" + FROM_EMAIL = 'support@mermsemr.com' # Must be a verified sender in SendGrid + TO_EMAIL = 'works@chiefsoft.com' + + message = Mail( + from_email=FROM_EMAIL, + to_emails=TO_EMAIL, + subject='Sending with Twilio SendGrid is Fun', + html_content='and easy to do anywhere, even with Python' + ) + + try: + # Initialize the SendGrid client + sg = SendGridAPIClient(SENDGRID_API_KEY) + + # Send the email + response = sg.send(message) + + # Print status codes: 202 means the request was accepted for delivery + print(f"Status Code: {response.status_code}") + print(f"Body: {response.body}") + print(f"Headers: {response.headers}") + + except Exception as e: + logger.error(f"An unrelated error occurred: {e}") +