Mailosaur - Swift 库 · 
Mailosaur 允许您在软件开发和 QA 部分自动执行电子邮件和短信测试。
- 所有用户无限测试电子邮件地址 - 每个账户都为用户提供无限数量的测试电子邮件地址进行测试。
- 端到端 (e2e) 电子邮件和短信测试 允许您设置密码重置电子邮件、账户验证流程以及通过短信发送的 MFA/一次性密码的端到端测试。
- 伪 SMTP 服务器 Mailosaur 还提供了用于测试的虚拟 SMTP 服务器;允许您在预发布环境中捕获电子邮件,防止错误地发送给客户。
开始使用
本指南提供了几个关键部分
您可以在网站上找到完整的 Mailosaur 文档。
如果您遇到困难,请通过以下邮箱联系我们 [email protected]。
使用 Swift 包管理器安装
要使用 SwiftPM,应使用 Xcode 11 打开项目。点击 文件
-> Swift 包
-> 添加包依赖
,输入此仓库的 URL(https://github.com/mailosaur/mailosaur-swift
)。
或者,更新您的 Package.swift 文件(请确保输入最新版本号)
let package = Package(
dependencies: [
.package(url: "https://github.com/mailosaur/mailosaur-swift", from: "1.0.0")
],
// ...
)
使用 Cocoapods 安装
要安装 Mailosaur,只需在 Podfile 中添加以下行(确保版本号正确)
pod 'Mailosaur', '~> 1.0'
然后,运行以下命令
$ pod update
使用 Carthage 安装
将以下依赖项添加到您的 Cartfile 中
github "mailosaur/mailosaur-swift"
然后,运行以下命令
carthage update --platform ios
cd ./Carthage/Checkouts/Mailosaur
swift package generate-xcodeproj
cd ../../..
carthage build
然后,将库导入到您的代码中。YOUR_API_KEY
的值将在下一步(创建账户)中介绍
import Mailosaur
let mailosaur = MailosaurClient(config: MailosaurConfig(apiKey: "YOUR_API_KEY"))
API 参考
这个库由Mailosaur 邮件和短信测试API 提供支持。您可以轻松查看API本身,可以通过我们的 API参考文档 或通过我们的Postman或Insomnia集合查看。
创建账户
通过网站创建一个 免费试用账户。
拥有账户后,导航到 API选项卡 以找到以下值
- 服务器ID - 服务器类似于项目,可以分组您的测试。每次通过API与服务器交互时都需要此ID。
- 服务器域名 - 每个服务器都有自己的域名。您需要它来向您的服务器发送电子邮件。
- API密钥 - 您可以为每个服务器创建一个API密钥(推荐),或者一个账户级别的API密钥用于整个账户。 了解更多关于API密钥的信息。
使用Mailosaur测试电子邮件地址
Mailosaur为您提供了无限数量的测试电子邮件地址——无需设置或编写代码!
以下是操作方式
- 当您创建账户时,您将获得一个服务器。
- 每个服务器都有自己的 服务器域名 名称(例如
abc123.mailosaur.net
) - 任何以
@{YOUR_SERVER_DOMAIN}
结尾的电子邮件地址都可以与Mailosaur一起使用,无需任何特殊设置。例如 - 需要时,您还可以创建更多服务器。每个服务器都将有自己的域名。
不能使用测试电子邮件地址? 您还可以通过 SMTP测试电子邮件。通过将您的产品或网站通过SMTP连接到Mailosaur,Mailosaur将捕获您的应用程序发送的所有电子邮件,无论电子邮件地址是什么。
找到一封电子邮件
在自动化测试中,您可能希望等待一封新电子邮件到达。这个库通过messages.get
方法使这变得很容易。下面是如何使用它的方法
let mailosaur = MailosaurClient(config: MailosaurConfig(apiKey: "YOUR_API_KEY"))
// See https://mailosaur.com/app/project/api
let serverId = "abc123"
let serverDomain = "abc123.mailosaur.net"
let message = try await mailosaur.messages.get(server: serverId,
criteria: MessageSearchCriteria(sentTo: serverDomain))
print(message.subject) // "Hello, World!!"
这段代码的作用是什么?
- 使用您的API密钥设置一个
MailosaurClient
实例。 - 等待包含ID
abc123
的服务器上到达一封电子邮件。 - 输出电子邮件的主题行。
我的电子邮件没有找到
首先,请检查您发送的电子邮件在Mailosaur仪表板中是否可见。
如果是的话,可能的原因是默认情况下,messages.get
方法只搜索在Mailosaur中接收到的最近1小时内的电子邮件。您可以覆盖此行为(见下面的receivedAfter
选项),但我们仅建议在设置期间这样做,因为使用默认设置时您的测试通常会运行得更快
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let newDate = formatter.date(from: "2023/01/01 00:00")
let message = try await mailosaur.messages.get(server: serverId,
criteria: MessageSearchCriteria(sentTo: "anything@\(serverDomain)"),
receivedAfter: newDate) // Override receivedAfter to search all messages since Jan 1st
找到一条短信消息
重要:试用账户默认情况下没有短信访问权限。请联系我们的支持团队以启用短信功能试用。
如果您已启用短信测试,您可以预留用于测试的电话号码,然后以类似测试电子邮件的方式使用 Mailosaur API。
let mailosaur = MailosaurClient(config: MailosaurConfig(apiKey: "YOUR_API_KEY"))
let serverId = "abc123"
let sms = try await mailosaur.messages.get(server: serverId,
criteria: MessageSearchCriteria(sentTo: "4471235554444"))
print(sms.text.body)
测试纯文本内容
大多数电子邮件和所有短信都应该有一个纯文本主体。Mailosaur 通过电子邮件或短信消息中的 text.body
属性公开此内容。
print(message.text.body) // "Hi Jason, ..."
if let body = message.text.body, body.contains("Jason") {
print("Email contains \"Jason\"")
}
从纯文本中提取验证码
您可能有一封包含帐户验证码或其他一次性密码的电子邮件或短信。您可以使用简单的正则表达式提取此类内容。
以下是如何提取6位数字代码的示例
print(message.text.body) // "Your access code is 243546."
let regex = /(?<code>[0-9]{6})/
if let body = message.text.body, let match = body.firstMatch(of: regex) {
print(match.code)
}
测试HTML内容
大多数电子邮件还包含纯文本内容以及HTML主体。您可以通过与纯文本非常相似的方式访问HTML内容。
print(message.html.body) // "<html><head ..."
使用 SwiftSoup 处理 HTML
如果需要遍历电子邮件的HTML内容。例如,通过CSS选择器查找元素,可以使用SwiftSoup库。
import SwiftSoup
// ...
let dom = try SwiftSoup.parse(message.html.body!)
let el = try dom.select(".verification-code")
let verificationCode = try el.text()
处理超链接
当以HTML内容发送电子邮件时,Mailosaur会自动提取在锚点(<a>
)和区域(<area>
)元素中找到的所有超链接,并通过html.links
数组使这些链接可用。
每个链接都有一个文本属性,表示在正文中显示的超链接文本,以及一个包含目标URL的href属性。
// How many links?
print(message.html.links.count) // 2
if let firstLink = message.html.links.first {
print(firstLink.text) // "Google Search"
print(firstLink.href) // "https://www.google.com/"
}
重要:为确保始终拥有有效的电子邮件,Mailosaur仅提取使用<a>
或<area>
标签正确编写的链接。
纯文本中的链接(包括短信消息)
Mailosaur还可以自动检测纯文本内容中的链接,这对于短信测试特别有用。
// How many links?
print(message.text.links.count) // 2
if let firstLink = message.text.links.first {
print(firstLink.text) // "Google Search"
print(firstLink.href) // "https://www.google.com/"
}
处理附件
如果电子邮件中包含附件,您可以通过attachments
属性访问这些附件。
// How many attachments?
print(message.attachments.count) // 2
每个附件都包含有关文件名和内容类型的元数据。
if let firstAttachment = message.attachments.first {
print(firstAttachment.fileName) // "contract.pdf"
print(firstAttachment.contentType) // "application/pdf"
}
length
属性返回附件文件的大小(以字节为单位)。
if let firstAttachment = message.attachments.first {
print(firstAttachment.length) // 4028
}
将附件写入磁盘
if let firstAttachment = message.attachments.first {
let fileBytes = try mailosaur.files.getAttachment(id: firstAttachment.id)
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent(firstAttachment.fileName)
try fileBytes.write(to: path)
}
使用图片和网页信标
消息的 html.images
属性是一个数组,包含在电子邮件的 HTML 内容中找到的所有图片。该数组的长度对应于电子邮件中找到的图片数量。
// How many images in the email?
print(message.html.images.count)
远程托管图片
电子邮件通常包含许多托管在其他地方(如您的网站或产品)的图片。建议检查这些图片是否可由收件人访问。
所有图片都应该有替代文本描述,可以使用 alt
属性进行检查。
if let image = message.html.images.first {
print(image.alt) // "Hot air balloon"
}
触发网页信标
网页信标是一张小图片,可以用来追踪电子邮件是否被收件人打开。
由于网页信标只是远程托管图片的另一种形式,您可以使用 src
属性向该地址发送 HTTP 请求。
if let image = message.html.images?.first {
print(image.src) // "https://example.com/s.png?abc123"
// Make an HTTP call to trigger the web beacon
let (_, response) = try await URLSession.shared.data(for: URLRequest(url: URL(string: image.src)!))
if let res = response as? HTTPURLResponse {
print(res.statusCode) // 200
}
}
垃圾邮件检查
您可以对电子邮件执行针对 SpamAssassin 的检查。返回的结构与 垃圾邮件测试对象 匹配。
let result = try await mailosaur.analysis.spam(email: message.id)
print(result.score) // 0.5
for rule in result.spamFilterResults.spamAssassin {
print(rule.rule)
print(rule.score)
print(rule.description)
}
开发
如果你想为此库做出贡献,以下是设置本地环境的方法。
测试套件需要设置以下环境变量
export MAILOSAUR_API_KEY=your_api_key
export MAILOSAUR_SERVER=server_id
运行所有测试
swift test
联系我们
你可以通过[email保护]#联系我们。