Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I work with/around Gmail's SMTP outbound sending limits?

I'm using my Gmail Apps for Domain account to send email within my rails application for standard automated emails (user signup, forgot password, notify admin of new comment, etc), but I'm worried about the 500 emails per day limit set by Google.

Google suggests one way to overcome the limit is to use multiple user accounts.

So, I've setup 10 additional gmail user accounts (noreply1, noreply2, noreply3, etc) - I'd like to track when any of these accounts has sent 500 emails in a 24 hour period and use the idle account accordingly.

How do I dynamically set the :user_name value in ActionMailer::Base.smtp_settings?

Here's my current setup - NOTE: this sends from "noreply1" every time, even though i'm explicitly setting :user_name and :from to "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 => "[email protected]",
        :password => "password"
    }

--- account.rb --- (MODEL, called via a callback)
after_create :send_welcome_email
...
def send_welcome_email
  #ActionMailer::Base.smtp_settings[:user_name] = '[email protected]'
  ActionMailer::Base.smtp_settings.merge!({:user_name => "[email protected]"})  
  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 = "[email protected]" 
    @body = { :account => account }
  end
end
like image 941
Jim Jones Avatar asked Mar 09 '09 14:03

Jim Jones


2 Answers

You could also set up an MTA on your server and use that for sending the mail.

That's what we do.

You have to add your server's IP as a valid one for sending email in your domain's SPF record to avoid getting marked as spam.

Another benefit of this is that if you do this, you can set the From: address of the email to be one of your users, which you cannot do with GMail.

like image 193
Luke Francl Avatar answered Nov 20 '22 13:11

Luke Francl


Store the available usernames in a table in the database, along with a 'last-modified', 'last-reset' and a sent count. You can then query this when sending an email to find the least used email address currently. Then increment the sent count and last-modified account. The 'last-reset' value can be used for your cleanup code so that you reset the counts each 24 hour period.

This also makes it easy to add new email accounts, retire accounts you aren't using anymore, implement in a different app, etc. as it's all just in a database table that you can change when required.

like image 3
workmad3 Avatar answered Nov 20 '22 11:11

workmad3