Ruby on Rails
PopBeforeSMTPForActionMailer

(Versión en español aquí)

A few SMTP servers still use “POP before SMTP” authentication. Here’s how to add support for that to ActionMailer:

In environment.rb

ActionMailer::Base.delivery_method = :smtp
  ActionMailer::Base.server_settings = {
    :port => 25,
    :domain => 'example.com',
    :address => 'smtp.example.com',
    :pop3_auth => { 
      :server => 'pop.example.com', 
      :user_name => 'user', 
      :password => 'password',
      :authentication => :login
    }
  }

The :pop3_auth hash contains the login information for the POP3 server we’re using for authenticating.

  if ActionMailer::Base.delivery_method == :smtp and ActionMailer::Base.server_settings.has_key?(:pop3_auth)
    class ActionMailer::Base

      alias_method :base_perform_delivery_smtp, :perform_delivery_smtp

      @@pop3_auth_done = nil

      private

      def perform_delivery_smtp(mail)
        do_pop_auth if !@@pop3_auth_done or (Time.now - server_settings[:pop3_auth][:expires]) >= @@pop3_auth_done
        base_perform_delivery_smtp(mail)
      end

      # Implementacion de la autenticacion
      def do_pop_auth
        require 'net/pop'
        pop = Net::POP3.new(server_settings[:pop3_auth][:server])
        pop.start(server_settings[:pop3_auth][:user_name], server_settings[:pop3_auth][:password])
        @@pop3_auth_done = Time.now  
        pop.finish
      end
    end
  end