如何通过Mailjet API重新激活已删除的域名发件人?
Mailjet API重新激活已删除域名发件人解决方案
通过Mailjet API添加域名发件人时,删除后再次添加会抛出MailjetClientRequestException,错误提示为already existing deleted sender。已知可通过管理控制台重新激活发件人,以下是通过API实现该操作的具体方案:
现有代码
fun addSender(campaign: Campaign, email: String, name: String): CampaignSender { try { campaign.sender?.let { existingSender -> deleteSender(existingSender) } val request = MailjetRequest(Sender.resource) .property(Sender.EMAIL, "*@" + extractDomainFromEmail(email)) .property(Sender.NAME, name) val response = mailjetClient.post(request) if (response.status != 201) { throw RuntimeException("Failed to add sender: ${response.data}") } val senderData = response.data.getJSONObject(0) val mailjetSenderId = senderData.getLong("ID") val mailjetDnsId = senderData.optLong("DNSID") return campaignSenderRepository.save( CampaignSender( campaign = campaign, senderEmail = email, senderName = name, mailjetDnsId = mailjetDnsId, mailjetSenderId = mailjetSenderId, status = SenderStatus.EMAIL_SENT ) ) } catch (e: MailjetClientRequestException) { if (e.message?.contains("already existing deleted sender") == true) { return reactivateExistingSender(campaign, email, name) /// ??? How } throw e } }
API激活实现步骤
Mailjet没有直接的“激活”接口,需通过查询已删除发件人+更新状态完成激活:
- 查询匹配目标域名的已删除发件人,获取其ID
- 调用PUT请求更新该发件人的状态为激活
实现reactivateExistingSender方法
private fun reactivateExistingSender(campaign: Campaign, email: String, name: String): CampaignSender { val domain = extractDomainFromEmail(email) val targetEmail = "*@$domain" // 1. 查询已删除的发件人 val listRequest = MailjetRequest(Sender.resource) .filter(Sender.FILTER_EMAIL, targetEmail) .filter(Sender.FILTER_STATUS, "Deleted") // Mailjet中删除状态的标识为"Deleted" val listResponse = mailjetClient.get(listRequest) if (listResponse.status != 200 || listResponse.data.length() == 0) { throw RuntimeException("No deleted sender found for domain: $domain") } val deletedSender = listResponse.data.getJSONObject(0) val senderId = deletedSender.getLong("ID") val dnsId = deletedSender.optLong("DNSID") // 2. 发送激活请求(通过PUT更新状态为Active) val activateRequest = MailjetRequest(Sender.resource, senderId) .property(Sender.STATUS, "Active") .property(Sender.NAME, name) // 可同步更新名称 val activateResponse = mailjetClient.put(activateRequest) if (activateResponse.status != 200) { throw RuntimeException("Failed to reactivate sender: ${activateResponse.data}") } // 保存到数据库 return campaignSenderRepository.save( CampaignSender( campaign = campaign, senderEmail = email, senderName = name, mailjetDnsId = dnsId, mailjetSenderId = senderId, status = SenderStatus.EMAIL_SENT ) ) }
注意事项
- 确保
Sender.FILTER_STATUS和Sender.STATUS的枚举值与Mailjet API文档一致,部分版本可能使用枚举常量而非字符串(比如SenderStatus.Deleted/SenderStatus.Active) - 若查询到多个已删除发件人,需根据业务逻辑选择目标对象(示例中默认取第一个匹配项)
内容的提问来源于stack exchange,提问作者Hugo Lassiège
相关产品推荐
相关产品推荐

