【问题标题】:Loop through pandas dataframe, insert recipient and dataframe into Outlook e-mail循环遍历 pandas 数据框,将收件人和数据框插入 Outlook 电子邮件
【发布时间】:2019-04-04 22:39:26
【问题描述】:

如何根据列中的唯一值循环遍历 pandas 数据框并插入单独的 Outlook 电子邮件?

这是我的代码:

def Emailer(subject, recipient):
    import win32com.client as win32   
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = recipient
    mail.Subject = subject
    mail.HtmlBody =  """Lots of text"""
    attachment = 'C:/Users/Documents/file.pdf'
    mail.Attachments.Add(attachment)
    mail.Display(True)

Emailer('subject', "multiple e-mails")

这是我想要循环并插入到每封电子邮件中的数据框。

df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
df['Email'] = np.random.choice(['john@mail.com', 'mark@mail.com', 'tina@mail.com'], 10)

          A         B          Email
0 -0.740284  0.509764  mark@mail.com
1  0.119413 -1.270088  mark@mail.com
2  1.792915 -0.243748  mark@mail.com
3  0.181352 -1.949043  tina@mail.com
4 -0.172640  0.051009  john@mail.com
5  0.627760 -0.038189  tina@mail.com
6 -0.589791 -3.255643  tina@mail.com
7  1.654046  0.855315  tina@mail.com
8  2.213134 -0.266334  mark@mail.com
9 -0.907995  0.880413  mark@mail.com

假设蒂娜,她的邮件将是这样的。循环从df['Email'] 中取出行并将数据帧插入mail.HtmlBody,并将Email 中的值插入mail.To = recipient。此外,我希望 Mark 和 John 拥有类似结构的电子邮件。每封电子邮件的主题都相同。根据电子邮件,只有“收件人”和“正文”会有所不同。

To: tina@mail.com
Subject: subject
Body:

Lots of text

          A         B          Email
3  0.181352 -1.949043  tina@mail.com
5  0.627760 -0.038189  tina@mail.com
6 -0.589791 -3.255643  tina@mail.com
7  1.654046  0.855315  tina@mail.com

编辑: 我做了一个 for 循环,将数据框拆分为唯一的表:

for email, df_email in df.groupby('Email'):
    print(df_email)

          A         B          Email
 4 -0.17264  0.051009  john@mail.com
          A         B          Email
0 -0.740284  0.509764  mark@mail.com
1  0.119413 -1.270088  mark@mail.com
2  1.792915 -0.243748  mark@mail.com
8  2.213134 -0.266334  mark@mail.com
9 -0.907995  0.880413  mark@mail.com
          A         B          Email
3  0.181352 -1.949043  tina@mail.com
5  0.627760 -0.038189  tina@mail.com
6 -0.589791 -3.255643  tina@mail.com
7  1.654046  0.855315  tina@mail.com

【问题讨论】:

  • df['Email'].unique() 应该会为您提供独特的电子邮件。你被困在哪里了?
  • @pnv 我不确定如何创建用于创建带有数据框的单个电子邮件的 for 循环。
  • @Ben.T 不,每封电子邮件的主题都相同。只有“To”和“Body”会有所不同。

标签: python pandas loops dataframe outlook


【解决方案1】:

我认为您正在寻找 pandas dataframe.to_string 从您的数据框中创建一个可读的字符串。然后您可以执行以下操作:

for i in df['Email'].unique():
    create_mail(i)

(create_mail 是在 Outlook 上生成电子邮件的任何函数)。在这种情况下,您需要添加

df[df['Email'] == i].to_string()

到mail.HtmlBody。

另一方面,df.to_html 也值得一试。

【讨论】:

  • 看起来是一个好的开始!我只需要在转换为html时修复数据框。
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多