【问题标题】:How can I work with/around Gmail's SMTP outbound sending limits?如何使用/绕过 Gmail 的 SMTP 出站发送限制?
【发布时间】:2010-10-12 04:52:35
【问题描述】:

我正在使用我的 Gmail Apps for Domain 帐户在我的 rails 应用程序中发送标准自动电子邮件(用户注册、忘记密码、通知管理员新评论等)的电子邮件,但我担心每个 500 封电子邮件谷歌设置的天数限制。

Google 建议克服限制的一种方法是使用多个用户帐户。

所以,我已经设置了 10 个额外的 gmail 用户帐户(noreply1、noreply2、noreply3 等) - 我想跟踪这些帐户中的任何一个在 24 小时内何时发送了 500 封电子邮件,并相应地使用空闲帐户.

如何动态设置ActionMailer::Base.smtp_settings中的:user_name值?

这是我当前的设置 - 注意:这每次都从“noreply1”发送,即使我明确地将 :user_name 和 :from 设置为“noreply2”:

--- development.rb --- 
    ActionMailer::Base.delivery_method = :smtp
    ActionMailer::Base.smtp_settings = {
        :address => "smtp.gmail.com",
        :port => "587",
        :domain => "mydomain.com",   
        :authentication => :plain,
            :user_name => "noreply1@mydomain.com",
        :password => "password"
    }

--- account.rb --- (MODEL, called via a callback)
after_create :send_welcome_email
...
def send_welcome_email
  #ActionMailer::Base.smtp_settings[:user_name] = 'noreply2@mydomain.com'
  ActionMailer::Base.smtp_settings.merge!({:user_name => "noreply2@mydomain.com"})  
  SubscriptionNotifier.deliver_welcome(self)   
end

--- subscription_notifier.rb --- (MODEL) 
class SubscriptionNotifier < ActionMailer::Base
  def welcome(account)    
    @sent_on = Time.now
    @subject = "Welcome to the App"
    @recipients = account.email
    @from = "noreply2@mydomain.com" 
    @body = { :account => account }
  end
end

【问题讨论】:

  • 我认为 workmad3 改变 ActionMailer::Base.smtp_settings 散列的想法是正确的,我只是不知道如何让 rails 用我的动态设置重新加载该散列的值:user_name键。
  • 您使用的是什么版本的 Rails?在控制器操作中动态更改 ActionMailer::Base.smtp_settings[:user_name] 在 2.3.2 中对我有用。 (至少,哈希值发生了变化。我没有尝试发送邮件。)
  • 这很奇怪 - 哈希键值发生了变化,但电子邮件是使用我的 development.rb 文件中的原始 :user_name 发送的
  • 甚至为我发送作品。您能否发布一些代码,准确显示您在控制器中的原始配置和更改是如何完成的?
  • 肯定的 - 我会把它添加到上面的问题中......谢谢

标签: ruby-on-rails email smtp


【解决方案1】:

将可用的用户名连同“last-modified”、“last-reset”和发送计数一起存储在数据库的表中。然后,您可以在发送电子邮件时查询此信息以查找当前使用最少的电子邮件地址。然后增加发送的计数和最后修改的帐户。 'last-reset' 值可用于您的清理代码,以便您每 24 小时重置一次计数。

这也使得添加新的电子邮件帐户、停用不再使用的帐户、在不同的应用程序中实现等变得容易,因为这一切都只是在一个数据库表中,您可以在需要时进行更改。

【讨论】:

  • 谢谢,对跟踪电子邮件帐户非常有用的技术,但我专门寻找代码来在典型的 rails smtp 配置哈希中设置 :user_name 元素。
  • 糟糕,没有正确阅读问题。我将添加第二个回复,其中包含我认为对实际问题有用的内容:) @kyle:然后我可能会这样做......这对我来说似乎很直观,所以很惊讶这些方面还没有可用的东西跨度>
  • 你可以在这里找到一个rails插件github.com/mahkhaled/acts_as_mail_balancer
【解决方案2】:

您应该能够以与配置相同的方式在邮件中的哈希中设置 :user_name 元素,即:

ActionMailer::Base.smtp_settings[:user_name] = 'new_user_name'

虽然这可能需要一些额外的代码来强制重新加载任何内部操作邮件配置(我自己没有测试过)

【讨论】:

  • 我终于开始测试这个,但我无法让它工作。在控制器方法中设置 ActionMailer::Base.smtp_settings[:user_name] = 'new_user_name' 根本不会影响哈希。知道如何重新加载哈希吗?
【解决方案3】:

您还可以在您的服务器上设置一个 MTA 并使用它来发送邮件。

这就是我们所做的。

您必须将您服务器的 IP 添加为有效 IP,以便在您域的 SPF 记录中发送电子邮件,以避免被标记为垃圾邮件。

这样做的另一个好处是,如果您这样做,您可以将电子邮件的 From: 地址设置为您的用户之一,而 GMail 无法做到这一点。

【讨论】:

  • 当有人使用在 GMail 中注册的“发件人”地址回复您发送的电子邮件时,您没有遇到任何来自 Google 的垃圾邮件问题?
  • 嗯...我没有看到任何问题。我们在 SPF 中将 Google Apps for Your Domain 注册为我们的邮件服务器,然后还将另一个 IP 地址(我们的服务器)注册为有效发件人。
  • 能否提供有关如何执行此操作的更多详细信息。
【解决方案4】:

评论框对我的问题来说太严格了。更改 ActionMailer::Base.smtp_settings 哈希对我来说可以按预期动态工作,所以我怀疑这里还有其他一些因素在起作用。可以尝试的一些事情:

  1. 您使用的是 TLS 插件吗?我在 Rails 2.3.2 和 Ruby 1.8.6 中使用了 action_mailer_optional_tls
  2. 正在向日志/控制台写入什么内容?
  3. 您更改的是用户名而不是密码:所有 noreply 帐户的密码都相同吗?

编辑:更多尝试

我会仔细查看 cmets 中提到的 smtp_tls.rb 文件,以确保没有任何内容是硬编码的。或者删除它并尝试我上面链接的插件。要使用它,您只需将:tls =&gt; true 添加到 smtp_settings 哈希即可。

【讨论】:

  • 1.我在我的 lib 目录中使用 smtp_tls.rb,但老实说,我不记得我从哪里得到的,但它用 gmail 发送邮件很好。我会尝试 action_mailer_optional_tls - 是的,Rails 2.3.2,Ruby 1.86 补丁 lvl 111 2.console 正在记录从 noreply1 发送的电子邮件 3.是的,所有密码都相同
  • 你使用的是和我类似的代码吗?有人建议“重新加载”哈希,但我不知道该怎么做。你是直接设置值还是使用合并!
  • 几乎相同的代码。我尝试设置值以及合并!,两者都有效。您不需要“重新加载”哈希:ActionMailer 使用您提供的相同 smtp_settings 哈希——没有内部缓存。
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2017-05-12
  • 2012-04-19
  • 2013-08-24
  • 2011-07-18
相关资源
最近更新 更多