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!
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.
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.
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'
}
}
}
)
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!
Offizielle Boto3-Dokumentation Häufig gestellte Fragen zu Amazon SES