如何基于现有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,直接用登录密码即可
- Gmail:
- 附件路径:确保
birthday-wish.jpg和脚本在同一目录,或者填写完整的绝对路径。 - 错误处理:脚本里加了基本的错误捕获,比如找不到附件、邮件发送失败都会打印提示,方便排查问题。
这样修改后,脚本既会保留原来的系统通知,又能自动给当日生日的客户发送带JPG附件的祝贺邮件啦!
内容的提问来源于stack exchange,提问作者Adam




