如何从 Rails 应用程序中的一系列电子邮件中过滤掉不活动的电子邮件?

Posted

技术标签:

【中文标题】如何从 Rails 应用程序中的一系列电子邮件中过滤掉不活动的电子邮件?【英文标题】:How to filter out inactive emails from an array of emails in a rails application? 【发布时间】:2021-11-26 23:08:55 【问题描述】:

我目前正在处理一张票,它要求我过滤掉任何要发送给收件人的非活动电子邮件。这是我正在研究的方法:

def self.delivering_email(message)
    return if email_to_be_delivered?(message.subject)
    
    email_list = message.to
    if email_list.is_a?(String)
      email_list = email_list.split(",").map(&:strip)
    end

    email_list.each  |email| 
      identity = Identity.find_by(email: email)
      next if identity.nil?
      # email_list.delete(email) unless identity.try(:preferred_user).active?
      email_list.select(email) if identity.try(:preferred_user).active?
    
    
    message.to = email_list
    message.perform_deliveries = !email_list.empty?
  end

“# email_list.delete(email) 除非 identity.try(:preferred_user).active?”我注释掉是因为 QA 提到只有一封非活动电子邮件会过滤掉,并且不会完全过滤阵列中的其他非活动电子邮件。我假设我必须使用 .select 而不是 .delete,但不知道它是否有效,因为我没有任何方法来测试和重现错误,或者如何以正确的方式实现它。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您在迭代数组时尝试修改数组,这可能会导致奇怪的行为。一种选择是只使用一个单独的数组。

由于您已经在使用email_list.each 进行迭代,因此如果当前的email 不满足您的要求,您可以调用next,就像您已经为identity.nil? 所做的那样。

所以看起来有点像

valid_emails = []
email_list.each  |email|
  identity = Identity.find_by(email: email)
  next if identity.nil? || !identity.try(:preferred_user).active?
  valid_emails << email
end


message.to = valid_emails

【讨论】:

以上是关于如何从 Rails 应用程序中的一系列电子邮件中过滤掉不活动的电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

将外部 CSS 转换为内联 CSS 用于 Rails 中的邮件

Rails:如何使用容器从 ECS 重用 AWS 凭证

Rails 4:EOFError:仅在开发中的任何电子邮件后到达文件结尾

Heroku 环境中的 Ruby on Rails 应用程序:“使用 Mailgun 发送电子邮件”错误

Rails Oauth 设计 Omniauth

如何从Rails的日志中删除邮件html内容?