CSV数据行为何以独立文本文件呈现而非在邮件正文中?
问题分析
你的问题出在每一行CSV数据都被封装成独立的MIMEText对象并附加到邮件,MIMEMultipart在默认混合模式下,多个文本部分会被邮件客户端识别为单独附件,而非合并到正文。另外build_message里的字符串拼接逻辑也存在错误,导致格式混乱。
解决方案
将所有CSV行合并为一个完整的文本内容,生成单个MIMEText对象,这样所有内容会统一显示在邮件正文里。以下是修改后的代码:
修改后的核心代码
读取CSV部分(无需修改)
lines_to_send = [] with open(file, mode='r') as file: csvFile = csv.reader(file) for line in csvFile: lines_to_send.append(line)
发送邮件部分(关键修改)
usernameEmail = '...' passwordEmail = '...' toEmails = ['...'] def send_mail(toaddrs_list, msg_lines, fromaddr, subject="Title"): s = smtplib.SMTP('...') s.starttls() s.set_debuglevel(1) s.login(usernameEmail, passwordEmail) msg = MIMEMultipart() sender = fromaddr recipients = toaddrs_list msg['Subject'] = subject if fromaddr is not None: msg['From'] = sender msg['To'] = ", ".join(recipients) # 只添加一个合并后的文本部分 for mime_text in build_message(msg_lines): msg.attach(mime_text) s.sendmail(sender, recipients, msg.as_string()) def build_message(lines): # 将所有CSV行合并为一个字符串,每行用逗号分隔并换行 content = '\n'.join([', '.join(line) for line in lines]) # 返回单个MIMEText对象的列表 return [MIMEText(content, 'plain')] send_mail(toEmails, lines_to_send, usernameEmail)
可选优化:生成HTML表格(更美观的正文格式)
如果希望邮件正文显示为规整的表格,可以把build_message改成HTML格式:
def build_message(lines): html_content = '<table border="1" cellpadding="4" cellspacing="0">' for line in lines: html_content += '<tr>' for cell in line: # 转义HTML特殊字符,避免格式错乱 html_content += f'<td>{cell.replace("<", "<").replace(">", ">")}</td>' html_content += '</tr>' html_content += '</table>' return [MIMEText(html_content, 'html')]
关键说明
- 原代码循环创建
MIMEText并逐个attach,相当于给邮件添加了N个独立的文本附件,这是数据行被单独附加的根本原因。 - 合并所有内容为单个
MIMEText后,邮件客户端会将其识别为邮件正文的一部分,而非附件。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

