Отправка отдельных писем нескольким получателям

Я собрал код для отправки писем нескольким получателям. Однако каждый получатель получает все письма вместо своего.

Датафрейм:

email content [email protected] Hi Mark, bla bla [email protected] Hi Eve, bla bla [email protected] Hi, John bla bla

for content in df['content']:
    for email in df['email']:
       message = MIMEMultipart()
       message['Subject'] = "Subject"
       message['From'] = 'my email'
       message['Reply-to'] = 'my email'
       message['To'] = '{}'.format(email)

       text = MIMEText(mail)
       message.attach(text)

       server = smtplib.SMTP ('smtp.gmail.com',587)
       server.ehlo()
       server.starttls()
       server.login(login, password) 
       server.sendmail(message['From'], message['To'], message.as_string())
       server.quit()

person Lucia Commerz    schedule 09.06.2018    source источник
comment
Вы повторяете дважды. Один раз по содержанию и один раз по электронной почте. По сути, вы отправляете все возможные комбинации контента и электронной почты. Чтобы сделать это с помощью цикла for, выполните итерацию только один раз по всем строкам. Взгляните на этот ответ: stackoverflow.com/questions/16476924/   -  person rafaelc    schedule 09.06.2018
comment
Спасибо @RafaelC!   -  person Lucia Commerz    schedule 09.06.2018


Ответы (3)


Попробуй это:

df = {
      'content': ['test1', 'test2', 'test3'], 
        'email': ['[email protected]', '[email protected]', '[email protected]']
     }

x = 0
for email in df['email']:
        print(email)
        print(df["content"][x]+"\n")
        x+=1
person paradox    schedule 09.06.2018
comment
можно покороче df = {'[email protected]' : ['text1', 'text2']} - person Alexander Dmitriev; 09.06.2018

Просто zip столбцов вместе и пропустить один цикл:

for email, content in zip(df['email'], df['content']):
       message = MIMEMultipart()
       message['Subject'] = "Subject"
       message['From'] = 'my email'
       message['Reply-to'] = 'my email'
       message['To'] = '{}'.format(email)

       text = MIMEText(mail)
       message.attach(text)

       server = smtplib.SMTP ('smtp.gmail.com',587)
       server.ehlo()
       server.starttls()
       server.login(login, password) 
       server.sendmail(message['From'], message['To'], message.as_string())
       server.quit()
person jezrael    schedule 09.06.2018

Я повторял это дважды. Вместо использования 2 циклов for правильный способ перебора DataFrame использует

Вместо этого:

for content in df['content']:
    for email in df['email']:

Использовать это:

for c in df.itertuples():
   message = MIMEMultipart()
   message['To'] = '{}'.format(c[0])

   text = MIMEText(c[1])
   message.attach(text)
person Lucia Commerz    schedule 09.06.2018