在本文中,我們將探討smtp4dev提供的一系列API,這些API能夠幫助我們自動化測試流程!

官方提供的API文檔解釋不足,需要花費了不少時間才弄清楚每個API的具體功能以及它們各自的用途。

在此,我將分享這些API的詳細信息,包括你可能需要使用這些API的測試場景,希望這樣能幫助你們避免我之前所經歷的困擾!

先決條件

本文假設你已經安裝并啟動了你的模擬服務器。

啟動你的服務器,我們這就開始吧!

首先,你可以通過訪問 http://localhost:5000/api 來獲取OpenAPI文檔。

遺憾的是,文檔中并沒有對每個API的具體功能進行描述(這就是我們在這里的原因)!(還有,為什么會有人在URL中使用大寫字母!)

設置服務器

在開始從你的應用程序發送電子郵件之前,你可能需要配置幾件事情,即用戶和郵箱。

用戶允許你進行身份驗證,而郵箱是你設置收件人的地方,最終也是你檢查收到的郵件的地方。

為此,我們將使用POST請求 http://localhost:5000/api/Server。然而,所需的請求體包含許多你可能想要保留為默認值的參數。

以下是我處理這個問題的方法。首先,使用GET請求 http://localhost:5000/api/Server,以便我們獲取當前的服務器設置。響應將如下所示。

{
"settingsAreEditable": true,
"lockedSettings": {},
"isRunning": true,
"exception": null,
"port": 25,
"hostName": "EC2AMAZ-FG4OBNC",
"allowRemoteConnections": true,
"numberOfMessagesToKeep": 100,
"numberOfSessionsToKeep": 100,
"imapPort": 143,
"disableMessageSanitisation": false,
"tlsMode": "None",
"authenticationRequired": false,
"credentialsValidationExpression": "",
"secureConnectionRequired": false,
"recipientValidationExpression": "",
"messageValidationExpression": "",
"disableIPv6": false,
"users": [],
"mailboxes": [
{
"name": "12@d.c",
"recipients": "12@d.c"
}
],
"relaySmtpServer": "",
"relaySmtpPort": 25,
"relayAutomaticEmails": [],
"relaySenderAddress": "",
"relayLogin": "",
"relayPassword": "",
"relayTlsMode": "None",
"relayAutomaticRelayExpression": "",
"webAuthenticationRequired": false,
"desktopMinimiseToTrayIcon": false,
"isDesktopApp": false,
"smtpAllowAnyCredentials": true,
"smtpEnabledAuthTypesWhenSecureConnection": [
"PLAIN",
"LOGIN",
"CRAM-MD5"
],
"smtpEnabledAuthTypesWhenNotSecureConnection": [
"PLAIN",
"LOGIN",
"CRAM-MD5"
],
"currentUserName": null,
"currentUserDefaultMailboxName": "Default"
}

然后,我們可以使用這個響應作為我們的POST請求體,并只修改我們想要更改的參數。例如,如果我們想要添加一個新的郵箱,名為 to@example.com,收件人為 to@example.com,我們只需要將mailboxes鍵更改為以下內容。

"mailboxes": [
{
"name": "12@d.c",
"recipients": "12@d.c"
},
{
"name": "to@example.com",
"recipients": "to@example.com"
}
]

獲取所有郵箱

如果你想在測試中遍歷所有的郵箱,你可以通過使用上述的GET /api/Server獲取它們,或者你也可以使用GET http://localhost:5000/api/Mailboxes API。

這將返回一個郵箱列表,如下所示。

[
{
"id": "42588956-8078-49c2-b9a1-82bcc8fec9f4",
"name": "Default"
},
{
"id": "51251730-80c1-4fa3-8eeb-18afe848294b",
"name": "12@d.c"
},
{
"id": "1b4dff75-8490-485d-a6e5-a83493721bea",
"name": "to@example.com"
}
]

你需要郵箱的名稱來獲取其中的消息(如果它不是默認郵箱)。

獲取所有電子郵件

現在我們已經為我們的收件人設置了郵箱,讓我們從我們的應用程序發送一些電子郵件給它。

要獲取目標郵箱中的所有消息,我們可以使用兩個API。

GET http://localhost:5000/api/Messages GET http://localhost:5000/api/Messages/new 并設置查詢參數mailboxName為目標郵箱的名稱。

例如,如果我們想要獲取發送到12@d.c的電子郵件,我們只需執行GET http://localhost:5000/api/Messages/new?mailboxName=12%40d.c。響應將如下所示。

[
{
"isRelayed": false,
"deliveredTo": "12@d.c",
"id": "32a199b9-bdc5-4dfd-9556-00486c0c9372",
"from": "from@example.com",
"to": [
"12@d.c"
],
"receivedDate": "2024-07-05T06:43:02.1692009Z",
"subject": "test2",
"attachmentCount": 0,
"isUnread": false
},
{
"isRelayed": false,
"deliveredTo": "12@d.c",
"id": "bfcaacb6-4e31-4897-8d86-b51e0a9dc329",
"from": "from@example.com",
"to": [
"12@d.c"
],
"receivedDate": "2024-07-05T03:33:33.9320652Z",
"subject": "test1",
"attachmentCount": 0,
"isUnread": false
}
]

你以為“/new”意味著只獲取未讀郵件?不是的!如果你只對未讀消息感興趣,你得自己檢查isUnread字段!

那么“/new”是什么意思呢?這只是我的猜測,但我認為它允許你指定lastSeenMessageId,這樣任何在那之前的消息(包括那條消息)都不會被包含在內。

你應該使用哪一個?如果你想要基于最后一條消息ID來過濾消息,或者不需要其他類型的排序或過濾,使用/Messages/new。

如果你想要設置排序順序或使用特定的搜索詞查詢,使用/Messages。對我來說,這兩個API是可以互換的。

獲取電子郵件內容

現在我們已經得到了電子郵件(或者你稱之為消息)的ID,我們準備獲取它的正文了!

分為兩步。

  1. 使用GET http://localhost:5000/api/Messages/{id}獲取電子郵件的所有部分。
  2. 遍歷這些部分,并通過GET http://localhost:5000/api/Messages/{id}/part/{part_id}/content獲取每個部分的內容。

讓我們更詳細地看看這個過程。

首先,我們將使用Messages/{id}來獲取我們電子郵件的結構。在響應中,除了部分內容外,還有其他信息,比如頭部信息。

{
"sessionEncoding": "iso-8859-1",
"eightBitTransport": null,
"hasHtmlBody": false,
"hasPlainTextBody": true,
"id": "32a199b9-bdc5-4dfd-9556-00486c0c9372",
"from": "...",
"to": [
"\"123\" <12@d.c>"
],
"cc": [],
"bcc": [],
"deliveredTo": [
"12@d.c"
],
"receivedDate": "2024-07-05T06:43:02.1692009Z",
"secureConnection": false,
"subject": "test2",
"parts": [
{
"id": "0",
"headers": [
{
"name": "Content-Type",
"value": "text/plain; charset=UTF-8"
},
{
"name": "Content-Transfer-Encoding",
"value": "base64"
}
],
"childParts": [],
"name": "0 - text/plain",
"messageId": "32a199b9-bdc5-4dfd-9556-00486c0c9372",
"contentId": null,
"attachments": [],
"warnings": [],
"size": 894,
"isAttachment": false
}
],
"headers": [
{
"name": "Date",
"value": "Fri, 5 Jul 2024 15:43:01 +0900 (JST)"
},
{
"name": "From",
"value": "..."
},
{
"name": "To",
"value": "123 <12@d.c>"
},
{
"name": "Message-ID",
"value": "<1922961261.6.1720161781968@localhost>"
},
{
"name": "Subject",
"value": "test2"
},
{
"name": "MIME-Version",
"value": "1.0"
},
{
"name": "X-Mailer",
"value": "ColdFusion 2018 Application Server"
}
],
"mimeParseError": null,
"relayError": ""
}

然后,我們將遍歷parts數組,并使用GET請求/Messages/{id}/part/{part_id}/content。這里的part_id將是parts數組中的id鍵。

part_id = 0為例:GET http://localhost:5000/api/Messages/32a199b9-bdc5-4dfd-9556-00486c0c9372/part/0/content,這是我們得到響應的內容。

Some body string

標記郵件為已讀

由于我們只對獲取未讀郵件的內容感興趣,因此以下做法是個好習慣:

在從應用程序發送任何內容之前,將所有郵件標記為已讀(以防萬一),
在我們獲取了郵件內容之后,將該郵件標記為已讀。

要將單個郵箱中的所有郵件標記為已讀,我們將使用POST請求http://localhost:5000/api/Messages/markAllRead,并設置查詢參數mailboxName為目標郵箱名稱。

而要將單個郵件標記為已讀,我們可以調用POST請求http://localhost:5000/api/Messages/{id}/markRead。注意,在這種情況下不需要查詢參數mailboxName

如何找到更多同類API?

冪簡集成是國內領先的API集成管理平臺,專注于為開發者提供全面、高效、易用的API集成解決方案。冪簡API平臺可以通過以下兩種方式找到所需API:通過關鍵詞搜索API、或者從API Hub分類頁進入尋找。

原文鏈接:https://blog.stackademic.com/use-smtp4dev-api-for-automate-smtp-email-server-testing-0faa45744a97

上一篇:

如何獲取 Parseur Pte Ltd. 開放平臺 API Key 密鑰(分步指南)

下一篇:

音頻 API 快速入門指南:在 Linux、Windows、FreeBSD 和 macOS 上播放和錄制聲音
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費