簡體   English   中英

如何使用 MailKit 獲取非文本、非附件內容?

[英]How to get nontext, non-attachment content with MailKit?

我們有一個系統,我們通過發送到 OutLook365 地址的電子郵件接收數據,我們有一個 POP3/IMAP 客戶端來讀取這些電子郵件並處理內容。

我們在 .NET 中工作,我們使用 MailKit 來檢索電子郵件。

我們正在做的事情的關鍵:

MailKit.Net.Pop3.Pop3Client client = constructClient();

for (var i = 0; i < client?.Count ?? 0; i++)
{
    MimeMessage message = client.GetMessage(i);

    var attachments = new List<OurAttachmentObject>();

    foreach (MimeEntity mimeEntity in message.Attachments)
    {
        attachments.Add(constructOurAttachmentObj(mimeEntity);
    }

    var messageMessageId = message.MessageId;
    var messageHtmlBody = message.HtmlBody;
    var messageTextBody = message.TextBody;

    doSomething(messageMessageId, messageHtmlBody, messageTextBody, attachments);
}

事情就是這樣 - 我們有一個客戶的電子郵件最終是空的:

  • MimeMessage.HtmlBody 為空,並且
  • MimeMessage.TextBody 為空,並且
  • MimeMessage.Attachments 為空。

我們的代碼將處理附件。 或者一個 TextBody 或一個 HtmlBody。 但我們希望至少存在其中之一。

奇怪的是,這只發生在他們向我們發送電子郵件時。 當我們在 Outlook 中復制電子郵件,以便我們可以再次發送時,它會起作用。 當我們發送具有相同內容的電子郵件時,它會起作用。 只有當他們發送電子郵件時,我們才會遇到這個問題。

他們發送的內容:

Received: from [...]
From:  [...]
To:  [...]
Date:  [...]
Subject:  [...]
Message-ID:  [...]
X-Mailer: [...]
Content-Type: Text/XML; name=theirfilename.xml; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
[...]
MIME-Version: 1.0

<?xml version="1.0"?>
<TheirXmlElement>
  [...]
</TheirXmlElement>

.

是的,電子郵件的正文是 XML。

當我們在 Outlook365 中查看時,XML 顯示為附件,當我們在 Outlook 中復制電子郵件時,它以附件形式出現:

Received: [...]
From: [...]
To: [...]
Subject: [...]
Thread-Topic: [...]
Thread-Index: [...]
[...]
Content-Type: multipart/mixed;
  boundary="_002_20201109124249401C297454xxxxx_"
MIME-Version: 1.0

--_002_20201109124249401C297454xxxxx_--
Content-Type: text/plain; charset="us-ascii"


--_002_20201109124249401C297454xxxxx_--
Content-Type: text/xml; name="theirfilename.xml"
Content-Description: theirfilename.xml
Content-Disposition: attachment;
  filename="theirfilename.xml"; size=11788;
  creation-date="Mon, 09 Nov 2020 19:42:56 GMT";
  modification-date="Mon, 09 Nov 2020 19:42:56 GMT"
Content-ID: <F4B1CA23B7E98F49BCD9AC9B82024AF1@namprd17.prod.outlook.com>
Content-Transfer-Encoding: base64

PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8TmV3RGF0YVNldD4NCiAgPGRlbGl2ZXJ5Pg0KICAgIDxj
[...]
M24NCiAgICA8L3ByaW50YWJsZV90ZXh0Pg0KICA8L3RpY2tldHM+DQo8L05ld0RhdGFTZXQ+DQoN
Cg==

--_002_20201109124249401C297454xxxxx_--
.

我們的代碼可以很好地處理附件。

當我們通過將 XML 內容粘貼到普通電子郵件中進行測試時,收到的是:

Received: [...]
From: [...]
To: [...]
Subject: [...]
Thread-Topic: [...]
Thread-Index: [...]
[...]
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0

<?xml version="1.0"?>
<TheirXmlElement>
  [...]
</TheirXmlElement>

.

這顯示在 MimeMessage.TextBody 中,我們的代碼也可以很好地處理它。

問題似乎是因為 Content-Type 是 Text/XML,所以正文沒有被放入 MimeMessage.TextBody,但它也沒有被視為附件。 盡管如果您復制消息,OutLook 將完全做到這一點。

我在調試時發現,當我們收到他們的一張票時,其中 MimeMessage.TextBody 為空,MimeMessage.HtmlBody 為空,MimeMessage.Attachments 為空,我可以檢索電子郵件的正文:

messageTextBody = message.Body.ToString();

但這讓我很擔心。 MimeMessage.Body 是一個 MimeEntity,我不希望 .ToString() 一直在處理它。

如何MimeKit希望客戶能夠提取電子郵件的身體,當它不是文本或HTML,或附件?

TextBodyHtmlBodyAttachments屬性只是為了方便常見的消息結構。

您需要做的是遍歷 MIME 消息正文的樹結構。

這在常見問題解答中都有解釋: https : //github.com/jstedfast/MailKit/blob/master/FAQ.md#q-how-can-i-get-the-main-body-of-a-message

在您的特定情況下,您可能會回到這一點:

var body = message.BodyParts.OfType<TextPart>().FirstOrDefault();
var text = body.Text;

PS 你絕對應該使用message.Body.ToString()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM