发送电子邮件失败时的HTTP状态码

8
注意:我已经阅读了这篇文章,但我仍然不知道如何正确地构建发送电子邮件函数,所以我问了这个问题。我需要知道在电子邮件发送成功或失败时使用的HTTP状态代码,如果这不是正确的做法,那么正确的做法是什么。
向我的Rails应用程序发送POST请求将发送电子邮件。
如果电子邮件发送失败,我应该在JSON响应中返回什么HTTP状态代码给发送POST请求的人?
  def inform
    delivered = true
    begin
      UserMailer.new_comment(current_user, other_user, @note).deliver_now
    rescue Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError
      delivered = false
    end

    if delivered
      # I use :created here because email is created
      render json: { delivered: true }.to_json, status: :created
    else
      # I use :service_unavailable here because email sending failed
      render json: { delivered: false }.to_json, status: :service_unavailable
    end
  end

这是一个API吗?您可能不需要返回正文。如果响应不是2xx(即4xx或5xx),则电子邮件将无法发送。 - B Seven
@BSeven 我的“inform”方法是一个API,我将从我的Rails JavaScript中调用它。另外,你说“如果响应不是2xx”,这里的“响应”是什么意思?你是指我编写的“inform”方法的响应吗?还是你指Mailer发送电子邮件的响应?你是说我可以在“inform”方法中返回任何4xx或5xx代码作为我的HTTP响应状态码吗? - Henry Yang
我指的是inform操作的响应。Mailer不会返回响应代码。我的意思是你可以只返回202(在我看来比201更好),或者503。你不需要在正文中返回“{delivered:}”。状态码已经包含了响应中的所有信息。 - B Seven
@BSeven 我明白了,那是一个很好的观点!你为什么选择503而不是502呢?你在下面的答案中推荐了502。还有,为什么202比201更好呢? - Henry Yang
1
哈哈,你说得对。我是指502。202更好,因为201是在创建资源时使用的状态码。202是“已接收请求但尚未执行”的状态码。这正是发送邮件的情况。您已经发出了请求,但不知道它是否会成功。例如,如果电子邮件无效,则不会成功。https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202 - B Seven
@BSeven 我明白了,谢谢。 - Henry Yang
2个回答

12

502 - bad_gateway

通常用于上游服务器故障。

这是更多信息:https://airbrake.io/blog/http-errors/502-bad-gateway-error

502 Bad Gateway错误意味着你(客户端)连接的上游服务器遇到问题。在这种情况下,这意味着提供502 Bad Gateway错误的服务器充当网关


0

我更愿意使用代码 424 https://www.rfc-editor.org/rfc/rfc4918#section-11.4

424(依赖失败)状态码表示方法无法在资源上执行,因为请求的操作依赖于另一个操作,而该操作失败。例如,如果PROPPATCH方法中的某个命令失败,则至少其余命令也将以 424(依赖失败)失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接