Ich habe versucht, mit Python eine E-Mail von Amazon SES zu senden

Auslösen

Es ist notwendig, regelmäßig E-Mails an mehrere Empfänger im Unternehmen zu senden. Bisher wurde Google Mail friedlich mit Tabellenkalkulation + GAS gesendet. Aber! Die Spezifikationen im internen Mail-Versandsystem haben sich geändert! (System zur Verhinderung von Fehlerübertragung) Infolgedessen funktioniert Tabellenkalkulation + GAS Gmail manchmal nicht: schluchzen: Wow Google Mail ist nicht gut, senden Sie eine andere E-Mail ... OK, gehen wir zu Amazon SES!

Experiment zum Senden von E-Mails von Amazon SES mit Python

Zunächst SES von Boto3 Official Document Überprüfen Sie /latest/reference/services/ses.html). Hmmm, es wäre schön, "send_email (** kwargs)" oder "send_raw_email (** kwargs)" zu verwenden. Der Unterschied besteht darin, dass Sie mit "send_raw_email (** kwargs)" Header angeben und Dateien anhängen können. Im Gegenteil, "send_email (** kwargs)" entspricht nicht dieser Seite, ist aber einfach. Ich möchte eine Datei anhängen, aber dieses Mal möchte ich sie schnell implementieren, damit ich E-Mails schnell senden kann. Gehen wir also zu "send_email (** kwargs)".

Lesen Sie zuerst ses mit Boto3

import boto3

client = boto3.client('ses', 
        aws_access_key_id = accesskey, 
        aws_secret_access_key = secretkey, 
        region_name = region
    )

Senden mit send_email (** kwargs)

client.send_email(
        Source = '[email protected]',
        Destination = {
            'ToAddresses': [
                '[email protected]',
            ]
        },
        Message = {
            'Subject': {
                'Data': 'Test Email',
                'Charset': 'UTF-8'
            },
            'Body': {
                'Text': {
                    'Data': 'Testkörper',
                    'Charset': 'UTF-8'
                }
            }
        }
    )

Okay, die Grundlagen sind in Ordnung. Als nächstes werde ich es in etwas umschreiben, das tatsächlich verwendet werden kann. Hinweis: Neu erstelltes Amazon SES verfügt über eingeschränkte Funktionen und Sie müssen Ihre E-Mail-Adresse im Voraus registrieren. Weitere Informationen finden Sie in der offiziellen Häufig gestellten Fragen zu Amazon SES. F: Was ist die Amazon SES-Sandbox? Bitte gib mir.

Produktionsimplementierung

Ich habe bestätigt, dass es erfolgreich mit "send_email (** kwargs)" gesendet werden kann, daher werde ich es implementieren, damit es in der Produktion verwendet werden kann. Zunächst möchte ich keine AWS-Anmeldeinformationen in den Code einbetten, daher lese ich sie aus einer CSV-Datei (einer von IAM heruntergeladenen Datei).

import csv

def get_credentials():
    with open('Anmeldeinformations-CSV-Datei') as f:
        credentials_file = csv.reader(f)
        #Lesen Sie die zweite Zeile, da die erste Zeile der CSV-Datei mit AWS-Anmeldeinformationen der Elementname ist
        next(credentials_file)
        for credentials_array in credentials_file:
            return credentials_array

Als nächstes denke ich, dass der Inhalt der E-Mail leicht zu aktualisieren sein sollte, also lesen Sie ihn aus einer externen Textdatei. Da ich den Mail-Titel und den Mail-Text trennen möchte, werde ich von hier aus ein geeignetes Ziel in der Textdatei als "----- Mail-Text -----" festlegen. Bild der E-Mail-Inhaltsdatei

E-Mail-Betreff testen
-----E-Mail-Text von hier-----
E-Mail-Text testen.
def get_mail_content():
    with open('E-Mail-Inhaltstextdatei') as f:
        mail_content_all = f.read()
    mail_content_splitted = mail_content_all.split('\n-----E-Mail-Text von hier-----\n')
    return mail_content_splitted

Stellen Sie sicher, dass die E-Mail-Adresse des Empfängers auch aus der externen CSV-Datei gelesen wird, damit sie problemlos aktualisiert werden kann.

def get_addresses():
    with open('CSV-Datei der E-Mail-Adresse') as f:
        addresses_file = csv.reader(f)
        for addresses_array in addresses_file:
            return addresses_array

Nachdem Sie alle Informationen für Ihre E-Mail erhalten haben, sammeln Sie die benötigten Informationen aus der von Ihnen erstellten Funktion und senden Sie sie mit "send_email (** kwargs)".

#Holen Sie sich AWS-Anmeldeinformationen
access_key = get_credentials()[0]
secret_key = get_credentials()[1]

client = boto3.client('ses',
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    region_name = 'Von Amazon SES verwendete Region (noch kein Japan)'
)

#Erhalten Sie E-Mail-Inhalte
mail_title = get_mail_content()[0]
mail_body = get_mail_content()[1]

#Mail-Adresse abrufen
to_addresses = get_addresses()
#Da muss die E-Mail-Adresse in einem Array übergeben werden[ ]Umgeben mit
cc_addresses = ['CC-Ziel-E-Mail-Adresse']

#E-Mail senden
client.send_email(
    Source = 'Absender-E-Mail-Adresse',
    Destination = {
        'ToAddresses': to_addresses,
        'CcAddresses': cc_addresses
    },
    Message = {
        'Subject': {
            'Data': mail_title,
            'Charset': 'UTF-8'
        },
        'Body': {
            'Text': {
                'Data': mail_body,
                'Charset': 'UTF-8'
            }
        }
    }
)

Das ist in Ordnung! Ich dachte, aber die offiziellen häufig gestellten Fragen zu Amazon SES haben diese Erklärung.

F: Gibt es eine Begrenzung für die Anzahl der Empfänger, die in einer einzelnen E-Mail-Nachricht angegeben werden können?

Sie können bis zu 50 Empfänger für jede Nachricht angeben, die Sie mit Amazon SES senden. Alle Adressen in den Feldern "An:", "CC:" und "BCC:" sind in dieser Grenze enthalten. Wenn Sie eine E-Mail-Nachricht an mehr als 50 Empfänger senden möchten, müssen Sie die Empfängerliste in Gruppen von 50 oder weniger aufteilen und die Nachrichten in jeder Gruppe senden.

Übrigens, wenn Sie mehr als 50 Personen haben, wird die folgende Fehlermeldung zurückgegeben.

botocore.exceptions.ClientError: An error occurred (InvalidParameterValue) when calling the SendEmail operation: Recipient count exceeds 50.

Unterstützt das Senden von 50 Personen

Das war's. Es ist erforderlich, die Anzahl der gleichzeitig zu sendenden Empfänger auf 50 oder weniger zu verarbeiten. Machen Sie zunächst den Teil zum Senden von E-Mails zu einer Funktion.

def send_email(client, to_addresses, cc_addresses, mail_title, mail_body):
    #E-Mail-Sendevorgang
    client.send_email(
        Source = 'Absender-E-Mail-Adresse',
        Destination = {
            'ToAddresses': to_addresses,
            'CcAddresses': cc_addresses
        },
        Message = {
            'Subject': {
                'Data': mail_title,
                'Charset': 'UTF-8'
            },
            'Body': {
                'Text': {
                    'Data': mail_body,
                    'Charset': 'UTF-8'
                }
            }
        }
    )

Wenn Sie diese send_email für jeweils 50 Empfänger aufrufen

cc_addresses = ['CC-Ziel-E-Mail-Adresse']
to_addresses = get_addresses()
to_addresses_splitted = []
#Schleife die Anzahl der Sätze alle 50_Zuweisen, um zu zählen
loop_count = len(to_addresses) // 50 + 1
for i in range(loop_count):
    #Holen Sie sich nacheinander 50 Artikel (einschließlich CC-E-Mail-Adresse) in das Set
    for j in range(50 - len(cc_addresses)):
        # send_An aus der Liste der E-Mail-Adressen, die an die E-Mail übergeben werden sollen_addresses_Geben Sie die E-Mail-Adresse in der angegebenen Reihenfolge ein
        try:
            to_addresses_splitted.append(to_addresses[i * 50 + j])
        #Ausnahmebehandlung, wenn ein nicht vorhandener Index angegeben wird
        except:
            pass
    send_email(client, to_addresses_splitted, cc_addresses, mail_title, mail_body)
    #Löschen Sie jeden Satz
    to_addresses_splitted = []

Hoppla, alle geteilten E-Mails werden an die CC-E-Mail-Adresse gesendet. Ich möchte nicht eine E-Mail gleichzeitig an die CC-E-Mail-Adresse senden, daher sende ich sie nur für die erste geteilte Übertragung an die CC-E-Mail-Adresse.

def send_email(client, to_addresses, cc_addresses, mail_title, mail_body, i):
    #Nur für die erste Aufteilung an die CC-Adresse senden
    if 0 == i:
        destination_value = {
            'ToAddresses': to_addresses,
            'CcAddresses': cc_addresses
        }
    else:
        destination_value = {
            'ToAddresses': to_addresses
        }

    #E-Mail-Sendevorgang
    client.send_email(
        Source = 'Absender-E-Mail-Adresse',
        Destination = destination_value,
        Message = {
            'Subject': {
                'Data': mail_title,
                'Charset': 'UTF-8'
            },
            'Body': {
                'Text': {
                    'Data': mail_body,
                    'Charset': 'UTF-8'
                }
            }
        }
    )

Zusammenfassung

import boto3
import csv

def main():
    #AWS-Informationen
    access_key = get_credentials()[0]
    secret_key = get_credentials()[1]

    client = boto3.client('ses',
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        region_name = 'us-east-1'
    )

    #Erhalten Sie E-Mail-Inhalte
    mail_title = get_mail_content()[0]
    mail_body = get_mail_content()[1]

    #Mail-Adresse abrufen
    cc_addresses = ['CC-Ziel-E-Mail-Adresse']
    to_addresses = get_addresses()
    to_addresses_splitted = []
    #Schleife die Anzahl der Sätze alle 50_Zuweisen, um zu zählen
    loop_count = len(to_addresses) // 50 + 1
    for i in range(loop_count):
        #Holen Sie sich nacheinander 50 Artikel (einschließlich CC-E-Mail-Adresse) in das Set
        for j in range(50 - len(cc_addresses)):
            # send_An aus der Liste der E-Mail-Adressen, die an die E-Mail übergeben werden sollen_addresses_Geben Sie die E-Mail-Adresse in der angegebenen Reihenfolge ein
            try:
                to_addresses_splitted.append(to_addresses[i * 50 + j])
            #Ausnahmebehandlung, wenn ein nicht vorhandener Index angegeben wird
            except:
                pass
        send_email(client, to_addresses_splitted, cc_addresses, mail_title, mail_body, i)
        #Löschen Sie jeden Satz
        to_addresses_splitted = []

def get_credentials():
    with open('credentials.csv') as f:
        credentials_file = csv.reader(f)
        #Lesen Sie die zweite Zeile, da die erste Zeile der CSV-Datei mit AWS-Anmeldeinformationen der Elementname ist
        next(credentials_file)
        for credentials_array in credentials_file:
            return credentials_array

def get_addresses():
    with open('addresses.csv') as f:
        addresses_file = csv.reader(f)
        for addresses_array in addresses_file:
            return addresses_array

def get_mail_content():
    with open('mail_content.txt') as f:
        mail_content_all = f.read()
    mail_content_splitted = mail_content_all.split('\n---------------------E-Mail-Text von hier---------------------\n')
    return mail_content_splitted

def send_email(client, to_addresses, cc_addresses, mail_title, mail_body, i):
    #Nur für die erste Aufteilung an die CC-Adresse senden
    if 0 == i:
        destination_value = {
            'ToAddresses': to_addresses,
            'CcAddresses': cc_addresses
        }
    else:
        destination_value = {
            'ToAddresses': to_addresses
        }

    #E-Mail-Sendevorgang
    client.send_email(
        Source = 'Absender-E-Mail-Adresse',
        Destination = destination_value,
        Message = {
            'Subject': {
                'Data': mail_title,
                'Charset': 'UTF-8'
            },
            'Body': {
                'Text': {
                    'Data': mail_body,
                    'Charset': 'UTF-8'
                }
            }
        }
    )

if __name__ == "__main__":
    main()

Jetzt können Sie E-Mails ohne Bedenken lokal senden. Wenn es jedoch von einem lokalen Unternehmen stammt, können andere Personen es nicht senden (= ich bin für das Senden von E-Mails verantwortlich). Daher frage ich mich, ob es bald AWS Lambda sein wird.

We're hiring! Wir entwickeln einen KI-Chatbot. Wenn Sie interessiert sind, können Sie uns gerne über die Wantedly-Seite kontaktieren!

Referenzartikel

Offizielle Boto3-Dokumentation Häufig gestellte Fragen zu Amazon SES

Recommended Posts

Ich habe versucht, mit Python eine E-Mail von Amazon SES zu senden
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Senden Sie eine E-Mail mit Amazon SES + Python
Ich habe versucht, E-Mails vom Sakura-Server mit Flask-Mail zu senden
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
[Python] Senden Sie eine E-Mail aus Google Mail mit einer zweistufigen Authentifizierungseinstellung
Ich habe versucht, WebScraping mit Python.
Ich habe eine SMS mit Python gesendet
Einfache Mailübertragung mit Eile Python3
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
[Python] Mail mit Outlook senden
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Scraping von einer authentifizierten Site mit Python
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Ich habe versucht, mit django eine E-Mail zum Abschluss der Registrierung von Google Mail zu senden.
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Senden Sie eine E-Mail mit Python an Spushis Adresse
Ich möchte mit Python eine E-Mail von Google Mail senden.
Ich habe Python ausprobiert! ] Heute Abschluss von "Jeder Python! Was ist Python!"!
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Generieren Sie mit Python eine Einfügeanweisung aus CSV.
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Senden Sie eine E-Mail mit Excel in Python
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
[Python] Ich habe die gleiche Berechnung versucht wie die Vorhersage von LSTM von Grund auf [Keras]
Ich habe Python> autopep8 ausprobiert
Überprüfen Sie die E-Mail mit Python
Mail per Python senden
Ich habe Python> Decorator ausprobiert
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe eine emotionale Analyse von Amazon Comprehend mit der AWS CLI durchgeführt.