Rails 应用程序在卡住发布表单时向同一地址发送多封电子邮件

Posted

技术标签:

【中文标题】Rails 应用程序在卡住发布表单时向同一地址发送多封电子邮件【英文标题】:Rails app send multiple email to same address on getting stuck posting form 【发布时间】:2014-04-03 09:08:55 【问题描述】:

我是新手,按照教程,我发布了我的应用程序,目前托管在免费的 heroku dyno 上。问题是有时表单没有发布,我养成了使用浏览器停止按钮停止它然后再次发布它的习惯。我现在意识到我的电子邮件声誉已经下降到 40%,原因是一旦我重新发送表单失败或我停止启动并重新提交表单后,同一封电子邮件多次发送到同一地址。要在保存后发送电子邮件,我在创建操作中使用以下代码。我应该怎么做才能确保只发送一封电子邮件。

  def create
@job_post = JobPost.new(params[:job_post])
@job_post.jobuuid = SecureRandom.hex(7)

if @job_post.save
    if user_signed_in?
      @job_post.update_attribute(:user_id, current_user.id)     
    else
      @job_post.update_attribute(:user_id, 1) 
    end
  # Handle a successful save.
  # Email to JobPoster
  JobMailer.jobposting_acknowledgment(@job_post).deliver
  # Email to Admin
  JobMailer.jobposting_adminnotification(@job_post).deliver
  flash[:notice] = "Job posting is received and is being manually reviewed."
  redirect_to root_path
else
  render 'new'
end 

结束

【问题讨论】:

虽然这个问题解决了问题的一部分:防止多次发送,但您可以做进一步的工作来防止通过使用像 MailTrap 这样的服务发送测试电子邮件,(只需插入其 SMTP 服务器,而不是 SendGrid 的)。 【参考方案1】:

@job_post.jobuuid = SecureRandom.hex(7) 移动到您的新操作并在您的表单中添加一个隐藏字段,以便提交此值。然后,您可以使用它来识别此 @job_post 已被提交:

def create
  redirect_to root_url, alert: 'Job already submitted' if JobPost.exists?(jobuuid: params[:job_post][:jobuuid])
  @job_post = JobPost.new(params[:job_post])
  @job_post.user_id = user_signed_in? ? current_user.id : 1
  begin
    @job_post.transaction do
      @job_post.user_id = user_signed_in? ? current_user.id : 1
      @job_post.save!
      if new_job
        JobMailer.jobposting_adminnotification(@job_post).deliver
        JobMailer.jobposting_acknowledgment(@job_post).deliver
      end
    end
    flash[:notice] = "Job posting is received and is being manually reviewed."
    redirect_to root_path
  rescue ActiveRecord::RecordInvalid
    render 'new'
  end        
end

请注意,您需要确保 jobuuid 是唯一的,并且您的数据库中没有具有该编号的 JobPost。有 2.68 亿个 7 位长的十六进制字符串,所以如果您预计流量会非常大,那么就有可能发生冲突(非常小,但仍然存在)。

【讨论】:

用@job_post.new_record 替换new_job 之后?并输入 @job_post.jobuuid = SecureRandom.hex(7) 。它执行与以前的代码相同的工作。问题是,如果在填写表格并按下提交之后快速按下浏览器停止并快速重复两个操作,即(提交停止,提交停止),只要我继续这样做,每次都会发送电子邮件。我尝试在设计注册表单上做同样的事情,但我不能让它发送超过一封电子邮件。我在表单上使用验证码(人性化),但如果任何机器人可以快速提交/停止以发送大量电子邮件 这只是破坏了使用验证码的目的。我应该怎么做才能确保电子邮件只发送一次。

以上是关于Rails 应用程序在卡住发布表单时向同一地址发送多封电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用 API 时向 APNS 发送推送证书?

form中的action属性规定当提交表单时向何处发送表单数据。

Rails - 如何在不更改页面和更新视图的情况下提交表单?

Rails 5 成功发送数据后重新启用表单提交

使用 Ruby(在 Rails 上)确认链接创建

表单提交