You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS应用调用Mailjet发邮件返回200但未收到邮件求助

解决Mailjet API返回200但未收到邮件的问题

我帮你排查了代码里的几个关键问题,这些大概率是导致邮件没成功送达的原因,咱们一步步来解决:

1. 用错了API接口地址

你现在请求的是https://in-v3.mailjet.com这个根路径,但Mailjet的发送邮件接口需要指定具体的发送路径。v3版本的正确接口应该是https://api.mailjet.com/v3/send,v3.1版本则是https://api.mailjet.com/v3.1/send。你当前请求的根路径虽然返回200,但根本没触发邮件发送的逻辑,相当于白请求了。

修改URL这行代码:

let url = URL(string: "https://api.mailjet.com/v3/send")

2. 字符串插值的语法错误

在生成登录凭证的时候,你写了"\\(username):\\(password)",这里多了反斜杠,会导致用户名和密码被错误转义,生成的base64验证字符串是无效的。正确的写法应该是直接用字符串插值:

let loginString = "\(username):\(password)"

这个错误会导致Mailjet无法正确验证你的身份,但因为你请求的是错误的接口,所以返回了200,实际根本没处理你的邮件请求。

3. 检查你的Mailjet账户状态

  • 先确认发件邮箱ruslan@pinta.com.ua已经在Mailjet后台完成了验证,未验证的邮箱发送的邮件会被直接拦截,不会进入收件箱。
  • 登录Mailjet仪表盘查看邮件日志,这里能看到邮件的状态:是排队中、被拒绝,还是被标记为垃圾邮件,日志里会给出具体的失败原因,非常有用。

4. 收件端的排查

  • 确认收件邮箱maxim.poltoratsky@pinta.com.ua没把发件邮箱加入黑名单,顺便检查一下垃圾邮件文件夹,有时候邮件会被误判进去。
  • 虽然你写的收件人格式看起来没问题,但可以再核对一下:v3版本的Recipients数组确实是包含Email字段的字典数组,这部分是对的,但如果后续还是有问题,可以试试加上Name字段。

修复后的完整代码示例

我把上述问题都修复好了,你可以直接用这个版本测试:

func sendEmail() {
    var recipients = [[String: Any]]()
    recipients.append(["Email": "maxim.poltoratsky@pinta.com.ua"])
    let body: [String: Any] = [
        "FromEmail": "ruslan@pinta.com.ua",
        "FromName": "Me",
        "Subject": "YEEES",
        "Text-part": "Greetings from IOS ;)",
        "Recipients": recipients
    ]
    // 修正API接口地址
    let url = URL(string: "https://api.mailjet.com/v3/send")
    guard let requestUrl = url else {
        print("Invalid URL")
        return
    }
    var request = URLRequest(url: requestUrl)
    let username = "MY_SECRET_KEY"
    let password = "MY_API_KEY"
    // 修正字符串插值错误
    let loginString = "\(username):\(password)"
    guard let loginData = loginString.data(using: .utf8) else { return }
    let base64LoginString = loginData.base64EncodedString()
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
    } catch {
        print("error during JSON serialization")
        dump(error)
        return
    }
    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
        if let error = error {
            print("Request error: \(error)")
            return
        }
        // 新增打印响应数据,方便排查问题
        if let data = data, let responseString = String(data: data, encoding: .utf8) {
            print("Response data: \(responseString)")
        }
        print("Response: \(response ?? URLResponse())")
    })
    task.resume()
}

修改后测试的时候,记得看控制台打印的响应数据,如果还有问题,响应数据里会给出具体的错误提示,结合Mailjet的日志就能快速定位问题啦。

内容的提问来源于stack exchange,提问作者Maxim Poltoratsky

火山引擎 最新活动