Python调用win32com发送Outlook邮件时如何去除自动插入的多余段落缩进
问题原因
格式错乱的核心原因是Python三引号字符串的特性:三引号包裹的内容会原封不动保留你写在代码里的所有缩进、换行、空行。
- 你在代码里为了对齐for循环、赋值语句的层级,给正文第二、第三行加的4个前导空格,会直接出现在邮件正文里,造成多余缩进
- 你写的连续空行会被Outlook识别为段落分隔,产生你说的意外新段落
- 之前调用
.lstrip()没生效,一是因为该方法只能移除字符串最开头的空白,处理不了每行行首的缩进;二是大概率你调用的位置不对,没有把处理后的结果赋值回email.Body。另外你贴的代码里f字符串末尾缺少闭合的三引号,本身也存在语法问题。
解决方案
方案1:手动对齐正文内容(零依赖)
写三引号包裹的正文时,不要跟着代码块的缩进层级走,所有正文行顶格书写,去掉不需要的前导空格和多余空行即可,示例写法:
email.Body = f"""Dear {owner}, Our records indicate that your payment have not been received so far. The total due is ${amount:.2f}. """
注意Dear {owner},前面不要留多余空格,行与行之间只留你实际需要的单空行即可,不要多打空行。
方案2:用textwrap自动清除缩进(不破坏代码排版)
如果你不想把字符串顶格写打乱代码的缩进结构,可以用Python标准库textwrap的dedent方法,自动移除所有正文行共有的前导缩进,不需要手动调整字符串位置。
首先在代码开头加导入语句:
import textwrap
正文部分按正常代码缩进层级写即可,最后用dedent处理:
email.Body = textwrap.dedent(f"""\ Dear {owner}, Our records indicate that your payment have not been received so far. The total due is ${amount:.2f}. """)
这里开头的反斜杠\是为了跳过三引号后紧跟的第一个空行,dedent会自动识别所有行共同的前导空格(也就是你为了代码对齐加的4个空格)并统一移除,最终输出的正文格式完全符合预期。
额外提示
如果需要更复杂的排版(比如加粗、表格、自定义段落间距),可以改用HTML格式写邮件内容,把内容赋值给email.HTMLBody属性而不是email.Body,通过HTML标签控制格式,不会出现纯文本的缩进错乱问题。
内容的提问来源于stack exchange,提问作者python noobie
相关产品推荐
相关产品推荐

