You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过指定邮箱完成AWS SNS Topic的邮箱退订?

问题:通过邮箱地址实现AWS SNS Topic退订失败

我已经实现了一个接口,能将指定邮箱订阅到AWS SNS Topic,代码如下:

[HttpPost("subscriptions/{email}")]
public async Task SubscribeEmail(string email)
{
    try
    {
        var request = new SubscribeRequest()
        {
            TopicArn = AwsServicesConstants.SenderTopicArn,
            ReturnSubscriptionArn = true,
            Protocol = "email",
            Endpoint = email,
        };

        var response = await _snsClient.SubscribeAsync(request);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Unexpected error: {ex}");
    }
}

我想仅通过邮箱地址实现该Topic的退订,编写了如下接口,但无法正常工作——因为UnsubscribeRequest只支持传入subscriptionArn,不支持直接传邮箱地址:

[HttpDelete("subscriptions/{email}")]
public async Task<UnsubscribeResponse> UnsubscribeEmail(string email)
{
    var request = new UnsubscribeRequest(email);

    var response = await _snsClient.UnsubscribeAsync(request);

    return response;
}

解决方案

要实现通过邮箱退订,需要先根据目标Topic和邮箱地址查询对应的订阅ARN,再执行退订操作:

[HttpDelete("subscriptions/{email}")]
public async Task<IActionResult> UnsubscribeEmail(string email)
{
    try
    {
        // 获取指定Topic下的所有订阅
        var listRequest = new ListSubscriptionsByTopicRequest
        {
            TopicArn = AwsServicesConstants.SenderTopicArn
        };

        var listResponse = await _snsClient.ListSubscriptionsByTopicAsync(listRequest);
        var targetSubscriptions = listResponse.Subscriptions
            .Where(s => s.Protocol.Equals("email", StringComparison.OrdinalIgnoreCase) 
                     && s.Endpoint.Equals(email, StringComparison.OrdinalIgnoreCase))
            .ToList();

        if (!targetSubscriptions.Any())
        {
            return NotFound($"邮箱 {email} 未订阅该Topic");
        }

        // 遍历匹配的订阅执行退订
        foreach (var subscription in targetSubscriptions)
        {
            var unsubscribeRequest = new UnsubscribeRequest(subscription.SubscriptionArn);
            await _snsClient.UnsubscribeAsync(unsubscribeRequest);
        }

        return Ok($"邮箱 {email} 已成功退订");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"退订出错: {ex}");
        return StatusCode(StatusCodes.Status500InternalServerError, "退订操作失败");
    }
}

注意事项

  • 一个邮箱可能在同一个Topic下存在多个订阅记录(比如重复订阅),所以需要遍历所有匹配项执行退订
  • 确保SNS客户端拥有ListSubscriptionsByTopic和Unsubscribe的权限
  • 可根据业务需求调整返回结果,比如返回退订的ARN列表或统一状态

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:35:24