如何将Python自定义函数的运行输出作为邮件内容发送
核心原因
你的content函数当前仅将结果直接打印到控制台,没有返回可被其他函数调用的结构化内容,因此直接调用无法拿到输出内容。
最优实现方案(推荐)
1. 修改content函数,返回筛选结果
将原本直接打印的内容存入列表,最后拼接为字符串返回,保留原有打印逻辑不影响调试:
def content(): res_list = [] for d3 in d1: if (x or y or k or w or f) and date in d3.text.upper().lower(): res_list.append(d3.text) res_list.append(d3.attrs['href']) # 保留原有打印用于控制台调试 print(d3.text) print(d3.attrs['href']) # 用换行符拼接所有内容返回 return '\n'.join(res_list)
2. 修改send_mail函数,支持传入自定义内容
建议使用email模块构造标准邮件格式,避免被邮箱判定为垃圾邮件:
import smtplib from email.mime.text import MIMEText from email.header import Header def send_mail(mail_content): sender_mail="*****@gmail.com" receiver_mail="*****@gmail.com" # Gmail需开启两步验证后生成应用专用密码,不可直接使用账号登录密码 password="*******" # 构造纯文本邮件内容 msg = MIMEText(mail_content, 'plain', 'utf-8') msg['From'] = Header("网页筛选工具", 'utf-8') msg['To'] = Header("收件人", 'utf-8') msg['Subject'] = Header("网页筛选结果通知", 'utf-8') server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(sender_mail, password) print("login success") server.sendmail(sender_mail, receiver_mail, msg.as_string()) print("email sent") server.quit()
3. 调用示例
if __name__ == "__main__": # 获取筛选结果 filter_content = content() # 仅当有符合条件的内容时发送邮件 if filter_content.strip(): send_mail(filter_content) else: print("本次无符合筛选条件的内容,无需发送邮件")
备用方案(无需修改原有content函数)
如果不想改动原有content的打印逻辑,可以临时捕获标准输出流获取打印内容,该方式可读性较差,仅作为临时替代方案:
import io import sys def capture_content_output(): original_stdout = sys.stdout output_buffer = io.StringIO() sys.stdout = output_buffer # 调用原函数,所有打印内容会被捕获到缓冲区 content() # 恢复原有标准输出 sys.stdout = original_stdout return output_buffer.getvalue()
调用时将capture_content_output()的返回值传入send_mail即可。
内容的提问来源于stack exchange,提问作者Bruno K
相关产品推荐
相关产品推荐

