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




