使用Apps Script按邮箱分组合并多行交易记录发送单封邮件
按邮箱分组发送合并交易记录的邮件解决方案
我来帮你搞定这个问题!核心思路就是先按表格里的「Email address」列把所有交易记录分组,把同一收件人的多条记录汇总到一起,再为每个分组生成并发送一封包含全部交易的邮件。下面以Python为例,给出具体的实现步骤:
1. 读取并分组交易数据
首先用pandas读取电子表格,然后按邮箱字段分组,把同一用户的所有交易记录整理成结构化的数据:
import pandas as pd # 读取你的交易记录表格(支持xlsx、csv等格式,根据实际文件调整) df = pd.read_excel("交易记录.xlsx") # 可选:清理空邮箱的记录,避免无效发送 df = df.dropna(subset=["Email address"]) # 按邮箱分组,把每组的交易记录转成字典列表,方便后续处理 grouped_transactions = df.groupby("Email address").apply(lambda x: x.to_dict("records")).to_dict()
这段代码会生成一个类似{"user@example.com": [{"交易ID": "123", "金额": 100, ...}, ...]}的字典,键是收件人邮箱,值是该用户的所有交易记录列表。
2. 生成汇总邮件内容
接下来需要把同一用户的多条交易记录格式成清晰易读的邮件内容,支持纯文本和HTML两种格式(推荐HTML,排版更美观):
# 生成纯文本格式的邮件内容(兼容所有邮箱) def build_plain_text_content(records): content = "您好!以下是您的所有交易记录汇总:\n\n" for idx, record in enumerate(records, 1): content += f"--- 交易{idx} ---\n" for field, value in record.items(): content += f"{field}: {value}\n" content += "\n" content += "感谢您的支持!" return content # 生成HTML格式的邮件内容(排版更美观) def build_html_content(records): # 构建HTML表格 html = """ <p>您好!以下是您的所有交易记录汇总:</p> <table style="border-collapse: collapse; width: 100%;"> <thead> <tr style="background-color: #f2f2f2;"> """ # 添加表头 headers = records[0].keys() for header in headers: html += f"<th style='border: 1px solid #ddd; padding: 8px;'>{header}</th>" html += """ </tr> </thead> <tbody> """ # 添加交易记录行 for record in records: html += "<tr>" for value in record.values(): html += f"<td style='border: 1px solid #ddd; padding: 8px;'>{value}</td>" html += "</tr>" html += """ </tbody> </table> <p style='margin-top: 20px;'>感谢您的支持!</p> """ return html
3. 发送合并后的邮件
最后结合smtplib库,遍历每个邮箱分组,发送汇总邮件:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header # 配置你的邮箱SMTP信息(根据服务商调整,比如QQ、Gmail、企业邮箱等) SMTP_SERVER = "smtp.example.com" SMTP_PORT = 587 # 一般是587(TLS)或465(SSL) SENDER_EMAIL = "your_email@example.com" SENDER_PASSWORD = "your_password" # 注意:部分邮箱需要用应用专用密码,而非登录密码 # 遍历每个收件人分组发送邮件 for recipient_email, records in grouped_transactions.items(): # 创建多部分邮件(同时包含纯文本和HTML) msg = MIMEMultipart('alternative') msg['From'] = Header("交易记录通知", 'utf-8') msg['To'] = Header(recipient_email, 'utf-8') msg['Subject'] = Header("您的交易记录汇总通知", 'utf-8') # 添加纯文本和HTML内容 plain_text = build_plain_text_content(records) html_text = build_html_content(records) msg.attach(MIMEText(plain_text, 'plain', 'utf-8')) msg.attach(MIMEText(html_text, 'html', 'utf-8')) # 发送邮件 try: with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server: server.starttls() # 启用加密传输 server.login(SENDER_EMAIL, SENDER_PASSWORD) server.sendmail(SENDER_EMAIL, recipient_email, msg.as_string()) print(f"✅ 已成功发送汇总邮件至 {recipient_email}") except Exception as e: print(f"❌ 发送邮件至 {recipient_email} 失败:{str(e)}")
额外注意事项
- 如果你的电子表格是用Excel VBA处理的,思路类似:先按「Email address」列排序,然后遍历行,把同一邮箱的记录临时存储起来,当遇到不同邮箱时,就把存储的记录生成邮件发送,再清空临时存储继续下一个用户。
- 务必检查「Email address」列的格式,避免存在空值、拼写错误的邮箱,否则会导致发送失败或者无效发送。
- 不同邮箱服务商的SMTP配置不同,比如QQ邮箱的SMTP服务器是
smtp.qq.com,端口465;Gmail需要开启两步验证并使用应用专用密码。
内容的提问来源于stack exchange,提问作者S Borg
相关产品推荐
相关产品推荐

