【问题标题】:Send individual emails to multiple recipients将单个电子邮件发送给多个收件人
【发布时间】:2018-11-19 08:16:03
【问题描述】:

我已经编写了一个代码来向多个收件人发送电子邮件。但是,每个收件人都会收到所有邮件而不是自己的邮件。

数据框:

email content mark@gmail.com Hi Mark, bla bla eve@gmail.com Hi Eve, bla bla john@gmail.com 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()

【问题讨论】:

  • 您正在迭代两次。一次是内容,一次是电子邮件。基本上,您正在发送内容与电子邮件的所有可能组合。要使用 for 循环执行此操作,只需对所有行迭代一次。看看这个答案:stackoverflow.com/questions/16476924/…
  • 感谢@RafaelC!

标签: python pandas email for-loop smtplib


【解决方案1】:

试试这个:

df = {
      'content': ['test1', 'test2', 'test3'], 
        'email': ['mail1@mail.com', 'mail2@mail.com', 'mail3@mail.com']
     }

x = 0
for email in df['email']:
        print(email)
        print(df["content"][x]+"\n")
        x+=1

【讨论】:

  • 你可以缩短一点df = {'mail1@m.com' : ['text1', 'text2']}
【解决方案2】:

只需将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()

【讨论】:

    【解决方案3】:

    我重复了两次。而不是使用 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)
    

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 2016-08-21
      • 2014-08-17
      • 1970-01-01
      • 2013-09-02
      • 2012-05-18
      • 2015-05-21
      相关资源
      最近更新 更多