如何从数据框中迭代值并将值传递给 Python 中的发送电子邮件函数

Posted

技术标签:

【中文标题】如何从数据框中迭代值并将值传递给 Python 中的发送电子邮件函数【英文标题】:How to iterate values from a dataframe and pass the values to a send email function in Python 【发布时间】:2020-10-13 01:50:06 【问题描述】:

我有一个数据框(df),如下所示

Subject                       To_Address       CC_Address                       Backup_Address
Invoice 2345 is invalid       xyz@gmail.com     koke@gmail,ali@gmail.com         a@gmail.com
Invoice 3456 is invalid       abc@gmail.com     jack@gmail.com,ali.gmail.com     b@gmail.com
Invoice 3673 is invalid       bcd@gmail.com     peach@gmail.com,ali.gmail.com    e@gmail.com
Invoice 8978 is invalid                         rock@gmail.com,ali.gmail.com     c@gmail.com
Invoice 8078 is invalid                         rock@gmail.com,ali.gmail.com     d@gmail.com
Invoice 3173 is invalid       mnb@gmail.com     mone@gmail.com,ali.gmail.com     f@gmail.com

我需要为数据框的每一行发送唯一的电子邮件

Email Subject = df[Subject] ,Email To Address =df[To_Address], Email_CC_Address = df[CC_Address]

还需要添加期望条件,Email To Address 为 null 或 NaN,则应通过 Email To Address =df[Backup_Address]

如何在 python 中做到这一点。

我当前使用静态值运行的代码

def create_message(send_from, send_to,cc_to,subject, plain_text_body):
    message = MIMEMultipart('alternative')
    message['From'] = send_from
    message['To'] = COMMASPACE.join(send_to)
    message['Cc'] = cc_to
    message['Subject'] = subject
    message.attach(MIMEText(plain_text_body, 'plain'))
    return message


subject = "Invoice is invalid"
sender_address = "sender@gmail.com.com"
to = "to@gmail.com"
cc_to = "cc@gmail.com"
mail_content="This is a test message"

message = create_message(sender_address,[to],cc_to,subject,mail_content)

send_message(message)

【问题讨论】:

如果是 CSV/TSV 文件,也许使用普通 CSV 模块比在这里使用 Pandas 更好。 @Arunmozhi,我将 pandas 数据框写入 CSV 文件,我不知道如何迭代和传递值并发送单独的电子邮件。 如果消息实际上只有一个正文部分,则不要创建多部分容器。顾名思义,multipart 适用于您拥有多个正文部分的情况,例如主消息和附件。 这能回答你的问题吗? How to iterate over rows in a DataFrame in Pandas 【参考方案1】:

尝试使用zip 并行遍历数据框中的行和多列:

def create_message(send_from, send_to, cc_to,subject, plain_text_body):
    sender_address = "sender@gmail.com.com"
    mail_content="This is a test message"
    for a, b, c, d in zip(df['Subject'], df['To_Address'], df['CC_Address'], df['Backup_Address']):
        if b == '':
            send_to = d
        else:
            send_to = b
        subject = a
        cc_to = c
        message = MIMEMultipart('alternative')
        message['From'] = send_from
        message['To'] = COMMASPACE.join(send_to)
        message['Cc'] = cc_to
        message['Subject'] = subject
        message.attach(MIMEText(plain_text_body, 'plain'))
        return message


message = create_message(sender_address,[to],cc_to,subject,mail_content)

send_message(message)

【讨论】:

这个else: to = d应该else:send_to = d,我是对的【参考方案2】:

要遍历 Pandas DataFrame,您可以使用 DataFrame.iterrows()

但不推荐对 df 进行迭代,因为它被视为“反模式”..

推荐阅读here

【讨论】:

以上是关于如何从数据框中迭代值并将值传递给 Python 中的发送电子邮件函数的主要内容,如果未能解决你的问题,请参考以下文章

遍历火花数据框中的列并计算最小值最大值

如何从嵌套 Json 数组角度 2 打印和分离键和值并将其添加到选择框中

如何从文本框中获取值并将其分配给 Xcode 中的整数变量?

如何从widget的函数返回值,并将其传递给Tkinter,Python中的另一个小部件的函数

如何比较不同数据框中的日期并将值分配给另一个数据框中同一列的一个数据框中的同一列?

迭代每一行并将两列的值传递给查询并将每个结果附加到表中