Как я могу выполнить цикл по списку и для каждого отдельного значения инициировать другой цикл?

#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. Вот и все! Теперь я получаю связь «один к одному» между документом и электронной почтой