You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于现有Python脚本实现带JPG附件的客户生日邮件发送?

如何扩展生日检查脚本,发送带JPG附件的生日祝贺邮件?

嘿,你的生日检查脚本基础框架已经搭得很好了!要实现给当日生日客户发送带JPG附件的祝贺邮件,咱们可以通过Python的标准库来完成,不用额外装第三方包。先帮你梳理下改进方向和完整代码:

第一步:修复CSV读取逻辑

你原来的birthdays.csv是逗号分隔的格式(date, name, email),但脚本里用split(' ')按空格分割会出错,咱们换成Python内置的csv模块来读取,更稳妥。

第二步:添加邮件发送功能

smtplib来连接SMTP服务器,email模块构造带附件的邮件内容。需要配置你的邮箱SMTP信息(比如Gmail用smtp.gmail.com:587,Outlook用smtp.office365.com:587),还有发件人邮箱、密码/应用密码。

完整改进后的脚本

import time
import os
import csv
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

# 配置项,根据你的实际情况修改
BIRTHDAY_FILE = 'birthdays.csv'
SMTP_SERVER = 'smtp.gmail.com'  # 替换成你的邮箱SMTP服务器
SMTP_PORT = 587
SENDER_EMAIL = 'your-email@gmail.com'
SENDER_PASSWORD = 'your-app-password'  # 注意:Gmail需要用应用密码,不是登录密码
BIRTHDAY_IMAGE_PATH = 'birthday-wish.jpg'  # 替换成你的JPG附件路径
EMAIL_SUBJECT = '生日快乐!'
EMAIL_BODY = '''亲爱的{name}:

今天是你的生日,祝你生日快乐,天天开心!

此致
你的团队
'''

def send_birthday_email(recipient_name, recipient_email):
    # 创建邮件容器
    msg = MIMEMultipart()
    msg['From'] = SENDER_EMAIL
    msg['To'] = recipient_email
    msg['Subject'] = EMAIL_SUBJECT

    # 添加邮件正文
    body = EMAIL_BODY.format(name=recipient_name)
    msg.attach(MIMEText(body, 'plain'))

    # 添加JPG附件
    try:
        with open(BIRTHDAY_IMAGE_PATH, 'rb') as img_file:
            img = MIMEImage(img_file.read())
            img.add_header('Content-Disposition', 'attachment', filename=os.path.basename(BIRTHDAY_IMAGE_PATH))
            msg.attach(img)
    except FileNotFoundError:
        print(f"警告:未找到附件文件 {BIRTHDAY_IMAGE_PATH},邮件将不带附件发送")

    # 连接SMTP服务器并发送邮件
    try:
        with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
            server.starttls()  # 启用TLS加密
            server.login(SENDER_EMAIL, SENDER_PASSWORD)
            server.send_message(msg)
        print(f"已成功发送生日邮件给 {recipient_name} ({recipient_email})")
    except Exception as e:
        print(f"发送邮件给 {recipient_name} 失败:{str(e)}")

def check_todays_birthdays():
    today = time.strftime('%m%d')  # 获取今日的月日(如1005表示10月5日)
    has_birthdays = False

    # 用csv模块读取文件,处理逗号分隔的格式
    with open(BIRTHDAY_FILE, 'r', newline='', encoding='utf-8') as file:
        reader = csv.reader(file)
        next(reader)  # 如果CSV有表头,取消注释这一行跳过表头
        for row in reader:
            if len(row) < 3:
                print(f"警告:无效行格式,跳过:{row}")
                continue
            # row[0]是date(格式应该是mmdd,比如1005),row[1]是name,row[2]是email
            birthday_date = row[0].strip()
            if birthday_date == today:
                has_birthdays = True
                # 发送系统通知
                os.system(f'notify-send "Birthdays Today: {row[1]}"')
                # 发送生日邮件
                send_birthday_email(row[1], row[2].strip())

    if not has_birthdays:
        os.system('notify-send "No Birthdays Today!"')

if __name__ == "__main__":
    check_todays_birthdays()

关键注意事项

  • CSV格式:确保birthdays.csv每行格式严格是mmdd,name,email(比如1005,张三,zhangsan@example.com),如果有表头的话,记得取消代码里next(reader)的注释。
  • SMTP配置:不同邮箱的SMTP服务器和端口不同,比如:
    • Gmail:smtp.gmail.com:587,需要在谷歌账号设置里启用「应用密码」(前提是开启了两步验证)
    • Outlook/Hotmail:smtp.office365.com:587,直接用登录密码即可
  • 附件路径:确保birthday-wish.jpg和脚本在同一目录,或者填写完整的绝对路径。
  • 错误处理:脚本里加了基本的错误捕获,比如找不到附件、邮件发送失败都会打印提示,方便排查问题。

这样修改后,脚本既会保留原来的系统通知,又能自动给当日生日的客户发送带JPG附件的祝贺邮件啦!

内容的提问来源于stack exchange,提问作者Adam

火山引擎 最新活动