如何每隔5秒读取多文本文件并将各文件最后一行一次性邮件发送
解决思路:先收集所有内容,再统一发送
我明白你的问题啦——现在脚本是处理一个文件就发一封邮件,导致收到4封单独的邮件,而你想要把四个系统的最后一行数据整合到同一封里一次性发送。核心改法就是先把所有文件的目标内容收集齐全,再执行一次邮件发送操作,而不是每处理一个文件就发一次。
具体实现步骤(以Python为例)
1. 先收集所有文件的最后一行数据
先遍历你要处理的4个文件,把每个文件的最后一行整理成你需要的格式,统一存到一个列表里:
import os # 替换成你的4个文件实际路径 target_files = ["sys1.txt", "sys2.txt", "sys3.txt", "sys4.txt"] mail_content_lines = [] for file_name in target_files: # 先检查文件是否存在,避免报错 if not os.path.isfile(file_name): mail_content_lines.append(f"⚠️ 警告:文件 {file_name} 未找到!") continue # 获取文件最后一行内容 with open(file_name, "r") as f: # 读取所有行后取最后一行,strip()去掉多余的换行/空格 last_line = f.readlines()[-1].strip() # 按照你需要的格式拼接内容 system_name = file_name.split(".")[0] # 从文件名提取sys1/sys2等标识 mail_content_lines.append(f"last saved data from datafiles {system_name} last scan {last_line}") # 把所有行合并成一个完整的邮件正文,用换行分隔 final_mail_body = "\n".join(mail_content_lines)
2. 一次性发送整合后的内容
接下来把上面生成的final_mail_body作为邮件正文,只执行一次邮件发送操作:
import smtplib from email.mime.text import MIMEText # 替换成你的实际邮件配置信息 sender_email = "你的发件邮箱@example.com" receiver_email = "收件邮箱@example.com" smtp_server = "smtp.example.com" # 比如QQ邮箱是smtp.qq.com,Gmail是smtp.gmail.com smtp_port = 587 # 通常是587(TLS加密)或465(SSL加密) email_auth_code = "你的邮箱授权码/登录密码" # 部分邮箱需要用授权码而非登录密码 # 构建邮件对象 msg = MIMEText(final_mail_body, "plain", "utf-8") msg["From"] = sender_email msg["To"] = receiver_email msg["Subject"] = "所有系统最新扫描数据汇总" # 发送邮件 try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() # 启用TLS加密 server.login(sender_email, email_auth_code) server.send_message(msg) print("邮件已成功发送,包含所有系统的最新数据!") except Exception as e: print(f"邮件发送失败:{str(e)}")
关键注意点
- 把邮件发送逻辑从文件遍历的循环内部移到循环外部,这是避免多发邮件的核心
- 先通过循环收集全所有需要的内容,再统一生成邮件正文
- 记得根据自己的邮箱服务商调整SMTP服务器地址、端口和验证信息(比如QQ、网易邮箱需要使用授权码而非登录密码)
内容的提问来源于stack exchange,提问作者Nani sweaty
相关产品推荐
相关产品推荐

