【问题标题】:Send emails using python: how to form the message?使用 python 发送电子邮件:如何形成消息?
【发布时间】:2023-04-07 04:08:02
【问题描述】:

我正在制作一个程序,该程序将从谷歌表中检索数据,这是我一周花费多少的支出日记。成功检索数据后,程序会向我发送一封电子邮件,告诉我我一周内每天花费了多少。

我的消费日记照片:

我正在使用 gspread 来检索数据,并且我能够使用 for 循环逐列检索数据

它给了我数据作为一个列表。
例如,如果我这样做

num_days = 7
goods = []

for day in range(2, num_days + 2):
    goods.append(worksheet.col_values(day))


OUTPUT: [['Mon 04/08/2019', 'Edeka 20.07'], ['Tue 04/09/2019', 'Edeka 9.77', 'Gym 60'], ['Wed 04/10/2019', 'Party 5', 'Jiujitsu System 30', 'Jiujitsu card 5', 'Jiujitsu Monthly fee 54'], ['Thu 04/11/2019', 'Laundry 3.5', 'Part 7.5 Euro'], ['Fri 04/12/2019', 'Edeka 5.95', 'Laundry 2'], ['Sat 04/13/2019', 'Food Festival 20 ', 'DM Hair Roller 3.25', 'Rewe 9.97'], ['Sun 04/14/2019', 'Monitor 224.99']]

所以我能够逐列检索并将它们作为列表放入列表中。

这一切都很好。但我想以以下格式发送电子邮件。

前)

星期一:
埃德卡 20.07

周二:
埃德卡 9.77,
健身房 60

...

太阳:监视器 224.99

这是到达我邮箱的电子邮件照片。
我希望第一个元素消失,只显示我买了什么商品,不包括日期。

我怎样才能像上面的照片一样形成要发送的电子邮件消息?

我目前正在使用 smtplib 发送电子邮件,但我不知道如何仅将我购买的商品放入邮件中。

def send_email_for_spending(money_spent_week):
    with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
        smtp.ehlo()
        smtp.starttls()
        smtp.ehlo()

        smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)

        # title for your email
        subject = "Here is how much you spent in this week."

        # Number of Days
        num_days = 7


        goods = []

        # it starts from 2 because column that has monday is 2nd  
        # column
        for day in range(2, num_days + 2):
            goods.append(worksheet.col_values(day))

        message = f"""
            MON:
                {goods[0]}
            TUE:
                {goods[1]}
            WED:
                {goods[2]}
            THU:
                {goods[3]}
            FRI:
                {goods[4]}
            SAT:
                {goods[5]}
            SUN:
                {goods[6]}
        """

        smtp.sendmail(EMAIL_ADDRESS, 'dudeindaegu@gmail.com', message)

【问题讨论】:

  • 您应该继续使用 smptlib,因为它是 python 中最好的电子邮件发送模块(如果还有其他模块)。但是,要解决您的问题,您可以在for day in range (2, num_days + 2): 之后添加day.pop(0) 您可以找到有关此here 的更多信息
  • 哦,那行得通!但是,有什么办法可以像普通句子一样打印它?例如,如果我执行 day.pop(0),它将像这样打印出 '[edeka 20.7, gym 60]',但我确实想打印出'edeka 20.7, gym 60' 像这样没有支架。有什么办法吗?
  • 是的。弹出后,您可以像这样使用join 方法:output="".join(goods)
  • 把这个放在你放.pop()东西的地方之后
  • @ArnavPoddar 是的,它工作得非常好。非常感谢!

标签:
python
string
email
project
gspread