共计 1743 个字符,预计需要花费 5 分钟才能阅读完成。
SendCloud 是搜狐的一个邮件代发服务,对于很多站长来说还是挺有用的,毕竟有免费套餐,而且发信速度要比纯 SMTP 要快。
于是申请了账号,开通了 API,但是在测试过程中却发现一个问题,就是关于发信 API 中的“xsmtpapi”这一项参数,文档不是太清晰,导致弄了好久。
按照官方文档,“xsmtpapi”是属于 SMTP 的扩展字段,它的值是经过 base64 编码封装过的 JSON 字符串,而这一个参数,就是决定着我们在发送邮件时对邮件模板的替换以及收件人地址的标识!
在官方文档中有三点注意:
- SMTP 调用时, X-SMTPAPI 必须是头域字段的最后一个. 否则, 可能导致 xsmtpapi error 的错误.
- API 调用时, 直接传入 JSON 字符串即可, 无需 base64 编码封装.
- X-SMTPAPI 的总长度不能超过 1M.
官方给出的格式:
{"to": ["ben@ifaxin.com", "joe@ifaxin.com"],
"sub":
{"%name%": ["Ben", "Joe"],
"%money%":[288, 497]
}
}
然后就写了
$param = ['apiUser' => $mail['api_user'], // 获取 API User
'apiKey' => $mail['api_key'], // 获取 API Key
'from' => $mail['from'], // 设置发件邮箱
'templateInvokeName' => $mail['template'], // 设置模板名称
'xsmtpapi' => json_encode(['to' => 'test@test.com',
'sub' => [// 设置模板替换
'%to%' => 'test@test.com', // 设置称呼
'%sitename%' => $sitename, // 站点名称
'%siteurl%' => $siteurl // 站点地址
]
])
];$param = ['apiUser' => $mail['api_user'], // 获取 API User 'apiKey' => $mail['api_key'], // 获取 API Key 'from' => $mail['from'], // 设置发件邮箱 'templateInvokeName' => $mail['template'], // 设置模板名称 'xsmtpapi' => json_encode(['to' => 'test@test.com', 'sub' => [ // 设置模板替换 '%to%' => 'test@test.com', // 设置称呼 '%sitename%' => $sitename, // 站点名称 '%siteurl%' => $siteurl // 站点地址] ]) ];
接着满心欢喜的尝试发送,结果却提示 xsmtpapi 格式错误,瞬间懵了!难道是因为没 base64_encode?可官方说调用 API 是不用的啊,不管,尝试一次,结果还是错误!
这就搞不懂了,难道还有什么问题?继续排查,将参数 var_dump 出来看,再结合官方给出的实例看,也没问题啊!都已经 json 了啊!
接着下载官方给的示例代码来看,还是没发现哪里有问题!真是奇了怪了?
最后再次对比,终于发现了不同,原来 xsmtpapi 中的数据必须都为数组格式,也就是说,无论是发送单地址还是多地址,最终的 JSON 数据都必须是数组格式。
且 sub 项也必须与地址一一对应,就是如果有两个地址,就必须给两个值,三个地址就要有三个值。
好吧,明白了,赶紧把代码改下,变成这样就 OK 了!
$param = ['apiUser' => $mail['api_user'], // 获取 API User
'apiKey' => $mail['api_key'], // 获取 API Key
'from' => $mail['from'], // 设置发件邮箱
'templateInvokeName' => $mail['template'], // 设置模板名称
'xsmtpapi' => json_encode(['to' => ['test@test.com'],
'sub' => [// 设置模板替换
'%to%' => ['test@test.com'], // 设置称呼
'%sitename%' => [$sitename], // 站点名称
'%siteurl%' => [$siteurl] // 站点地址
]
])
];
正文完