
使用這些基本 REST API 最佳實踐構建出色的 API
在本文中,我們將探討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,我們準備獲取它的正文了!
分為兩步。
GET http://localhost:5000/api/Messages/{id}
獲取電子郵件的所有部分。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 Hub分類頁進入尋找。
原文鏈接:https://blog.stackademic.com/use-smtp4dev-api-for-automate-smtp-email-server-testing-0faa45744a97