probe_scraper/emailer.py (45 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from pathlib import Path
import boto3
import yaml
EMAIL_FILE = Path("emails.txt")
def send_ses(
fromaddr, subject, body, recipients, filename="", dryrun=True, email_file=None
):
"""Send an email via the Amazon SES service. Can specify a single or list of
recipients.
Saves emails to `emails.txt`.
Examples:
```
send_ses('me@example.com', 'greetings', "Hi!", 'you@example.com')
```
```
send_ses('me@example.com', 'greetings', "Hi!", ['a@example.com`, 'b@example.com'])
```
Raises a RuntimeError if the message did not send correctly."""
if isinstance(recipients, list):
recipients = ",".join(recipients)
email_data = [
{"from": fromaddr, "to": recipients, "subject": subject, "body": body}
]
if email_file is None:
email_file = EMAIL_FILE
with open(email_file, "a") as f:
f.write(yaml.dump(email_data, default_flow_style=False))
if dryrun:
email_txt = "\n".join(
[
"New Email",
" From: " + fromaddr,
" To: " + recipients,
" Subject: " + subject,
" Body: " + body,
]
)
print(email_txt)
return
msg = MIMEMultipart()
msg["Subject"] = subject
msg["From"] = fromaddr
msg["To"] = recipients
msg.attach(MIMEText(body))
if filename:
attachment = open(filename, "rb").read()
part = MIMEApplication(attachment)
part.add_header("Content-Disposition", "attachment", filename=filename)
msg.attach(part)
ses = boto3.client("ses", region_name="us-west-2")
result = ses.send_raw_email(RawMessage={"Data": msg.as_string()})
if "ErrorResponse" in result:
raise RuntimeError("Error sending email: " + result)