考慮以下示例,通過 Python 3 中的 smtplib 和電子郵件庫發送電子郵件:
import smtplib
from email.message import EmailMessage
# Make the email:
msg = EmailMessage()
msg.set_content("""
Hi,
From foo
from bar
From baz
""")
msg['Subject'] = 'Example'
msg['From'] = "[email protected]"
msg['To'] = "[email protected]"
# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
這將生成一封如下所示的電子郵件:
Message-ID: <...>
Date: Thu, 17 Mar 2022 12:01:47 -0700 (PDT)
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Subject: Example
From: [email protected]
To: [email protected]
Hi,
>From foo
from bar
From baz
如果它位于行首,請注意電子郵件正文中的From轉換方式。如果電子郵件文本中使用了From>From ,我不想放在>那里。我懷疑這是為了防止在標題中未定義但在我的情況下已定義的情況下將其注入正文。from
有趣的是,這EmailMessage本身并不是:
>>> print(msg)
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
Subject: Example
From: [email protected]
To: [email protected]
Hi,
From foo
from bar
From baz
似乎在方法\nFrom中轉向了正文,而不是由訊息本身中的電子郵件策略引起的。\n>FromSMTP(...).send_message
所以問題是如何在發送電子郵件時停止替換文本正文中的\nFromwith 。\n>From
uj5u.com熱心網友回復:
我找到了答案,并決定在其他人遇到同樣的問題時將其記錄下來。簡而言之,答案是您無能為力。
基本上這就是smtplib.SMTP.send_message發生的事情:
def send_message(self, msg, from_addr=None, to_addrs=None,
mail_options=(), rcpt_options=()):
...
else:
g = email.generator.BytesGenerator(bytesmsg)
g.flatten(msg_copy, linesep='\r\n')
注意生成器是如何通過僅傳遞bytesmsg作為引數來創建的。
然后啟動生成器:
def __init__(self, outfp, mangle_from_=None, maxheaderlen=None, *,
policy=None):
...
if mangle_from_ is None:
mangle_from_ = True if policy is None else policy.mangle_from_
self._fp = outfp
self._mangle_from_ = mangle_from_
self.maxheaderlen = maxheaderlen
self.policy = policy
僅outfp通過 (the bytesmsg)。該策略為 None 因此mangle_from_始終True在 smtplib 的send_message方法中。
在幾次方法呼叫之后,會呼叫一個執行this的方法:
...
if self._mangle_from_:
payload = fcre.sub('>From ', payload)
self._write_lines(payload)
...
這會在電子郵件的文本內容中添加>前面。n\From
因此,似乎無法擺脫文本正文中From的替換。>From您可以將方法子類化,復制代碼并自己修復策略,但這并不干凈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/450645.html
上一篇:僅在給出特定郵件主題時才執行宏
