#python
Вопрос:
У меня есть список python, этот список содержит любой документ, который был обновлен в установленные сроки, и документы идентифицируются по заданному значению в списке. В результирующем списке может быть один или несколько. Я пытаюсь понять, как я могу пройтись по списку значений (документов) и запустить другой цикл, который повторяет другой список моих электронных писем, в результате чего в исходном списке будет по одному электронному письму на адрес для каждого документа? Я попытался «сложить» циклы друг на друга (фрагмент кода показан ниже), но это приводит к нескольким электронным письмам на каждый адрес электронной почты с полным списком документов (т. Е. Если в списке два документа, на каждый адрес отправляются два электронных письма с подробной информацией об обоих документах).
import boto3
from botocore.exceptions import ClientError
import requests
from datetime import datetime, timedelta
#first get request to pull all current endusers
GET1 = "https://abdc.com/api"
r1 = requests.get(url = GET1, auth=('username/token','APItoken'))
#convert to python dict
data = r1.json()
#create a list of all user's email addresses
emails = [user["email"] for user in data["users"]]
#create an timestamp of previous day and convert to epoch
ts1 = datetime.today() - timedelta(days =1)
ts2 = ts1.strftime("%s")
#set start time attribute as a parameter
params = {'start_time':ts2}
#second GET reqeust to pull all articles updated in the last 24 hrs
GET2 = "https://efdg.com/api"
r2 = requests.get(url = GET2, params=params, auth=('username/token','APItoken'))
#convert to python dict
data2 = r2.json()
#create list of all the target article titles and html url
updated_docs = [articles["html_url"] for articles in data2["articles"]]
doc_title = [articles["title"] for articles in data2["articles"]]
for y in updated_doc:
#create loop to iterate throuhg all the email addresses and send
individual emails to users
for x in emails:
# This address must be verified with Amazon SES.
SENDER = "example@example.com"
#To list
RECIPIENT = x
# Specify a configuration set. If you do not want to use a configuration
# set, comment the following variable, and the
# ConfigurationSetName=CONFIGURATION_SET argument below.
#CONFIGURATION_SET = "ConfigSet"
# If necessary, replace us-west-2 with the AWS Region you're using for Amazon SES.
AWS_REGION = "us-east-1"
# The subject line for the email.
SUBJECT = "blah blah "
# The email body for recipients with non-HTML email clients.
BODY_TEXT = ("Amazon SES Test (Python)rn"
"This email was sent with Amazon SES using the "
"AWS SDK for Python (Boto)."
)
# The HTML body of the email.
BODY_HTML = """<html>
<head></head>
<body>
<h1>l Documentation Notification</h1>
<p1>Please click the link below for the most current version of this document.<br>
<br>
""" str(doc_title) """<br>
<br>
""" str(updated_docs) """
</p1>
</body>
</html>
"""
# The character encoding for the email.
CHARSET = "UTF-8"
# Create a new SES resource and specify a region.
client = boto3.client('ses', region_name=AWS_REGION)
# Try to send the email.
try:
# Provide the contents of the email.
response = client.send_email(
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML,
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT,
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT,
},
},
Source=SENDER,
# If you are not using a configuration set, comment or delete the
# following line
#ConfigurationSetName=CONFIGURATION_SET,
)
# Display an error if something goes wrong.
except ClientError as e:
print(e.response['Error']['Message'])
else:
print("Email sent! Message ID:"),
print(response['MessageId'])
Комментарии:
1. Итак, почему вы хотите просмотреть документы? Что вы хотите видеть в каждом письме?
2. Можете ли вы предоставить некоторые примеры/фиктивные данные? Кроме того, чего вы пытаетесь достичь с помощью своих петель?
3. @quamrana Поскольку в течение установленного периода времени может быть обновлено несколько документов, мне нужно отправить электронное письмо для всех документов в списке, содержащем название и URL-адрес. Оба из которых я получаю из списка (который исходит из запроса GET). Как я уже упоминал, мой код работает, за исключением случаев, когда существует более одного документа, электронное письмо содержит сведения обо всех документах. Сейчас это отношения «один ко многим», но я хочу отношений «один к одному»…. одно электронное письмо на адрес электронной почты на документ в списке
4. Вы имеете в виду, что вам нужно одно электронное письмо на адрес электронной почты, в котором перечислены все документы в списке?
5. нет, я хочу отправить по одному электронному письму на каждый документ в списке на каждый адрес электронной почты. таким образом, если в списке два документа, каждый получатель получит по одному электронному письму на документ в общей сложности два
Ответ №1:
Итак, вы полностью изменили свой код, так что я в замешательстве, но если я правильно читаю между строк, вы имели в виду что-то вроде этого:
#create loop to iterate through all documents in the list
for article in data2["articles"]:
#create loop to iterate through all the email addresses and send individual emails to
users
for x in emails:
# This address must be verified with Amazon SES.
SENDER = "example@example.com"
#To list
RECIPIENT = x
# The HTML body of the email.
BODY_HTML = """<html>
<head></head>
<body>
<h1>l Documentation Notification</h1>
<p1>Please click the link below for the most current version of this document.<br>
<br>
""" str(article["title"]) """<br>
<br>
""" str(article["html_url"]) """
</p1>
</body>
</html>
"""
Обратите внимание, как я повторяю data2["articles"]
и обновляю BODY_HTML
с article["title"]
и article["html_url"]
,
Комментарии:
1. Вот и все! Теперь я получаю связь «один к одному» между документом и электронной почтой