jpmckinney/multi_mail

View on GitHub
lib/multi_mail.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'base64'
require 'cgi'
require 'json'
require 'openssl'

require 'faraday'
require 'mail'
require 'rack'

require 'mail_ext/message'

module MultiMail
  # @see http://rdoc.info/gems/fog/Fog/Errors
  class Error < StandardError; end

  # Raise if an incoming POST request is forged.
  class ForgedRequest < MultiMail::Error; end

  # Raise if an outgoing request is invalid.
  class InvalidRequest < MultiMail::Error; end
  # Raise if an API key is invalid.
  class InvalidAPIKey < InvalidRequest; end
  # Raise if a message is invalid.
  class InvalidMessage < InvalidRequest; end
  # Raise if a message template is invalid.
  class InvalidTemplate < InvalidRequest; end

  # Raise if a message header is invalid
  class InvalidHeader < InvalidMessage; end
  # Raise if a message has no body.
  class MissingBody < InvalidMessage; end

  # Raise if a message has no sender.
  class MissingSender < InvalidHeader; end
  # Raise if a message has no recipients.
  class MissingRecipients < InvalidHeader; end
  # Raise if a message has no subject.
  class MissingSubject < InvalidHeader; end

  class << self
    # @return [RegExp] a message whose subject matches this pattern will be
    #   considered an autoresponse
    attr_accessor :autoresponse_pattern

    # Configures MultiMail.
    #
    # * `autoresponse_pattern`: a message whose subject matches this pattern will
    #   be considered an autoresponse
    #
    # @example
    #   require 'multi_mail'
    #
    #   MultiMail.setup do |config|
    #     config.autoresponse_pattern = /^Out of Office AutoReply:/i
    #   end
    def setup
      yield self
    end

    # Returns whether a message is an autoresponse.
    #
    # @param [Mail::Message] message a message
    # @return [Boolean] whether a message is an autoresponse
    # @see https://github.com/jpmckinney/multi_mail/wiki/Detecting-autoresponders
    def autoresponse?(message)
      !!(
        # If any of the following headers are present and have the given value.
        {
          'Delivered-To'          => 'Autoresponder',
          'Precedence'            => 'auto_reply',
          'Return-Path'           => nil, # in most cases, this would signify a bounce
          'X-Autoreply'           => 'yes',
          'X-FC-MachineGenerated' => 'true',
          'X-POST-MessageClass'   => '9; Autoresponder',
          'X-Precedence'          => 'auto_reply',
        }.find do |name,value|
          message[name] && message[name].decoded == value
        end ||
        # If any of the following headers are present.
        [
          'X-Autogenerated',  # value is one of Forward, Group, Letter, Mirror, Redirect or Reply
          'X-AutoReply-From', # value is an email address
          'X-Autorespond',    # value is an email subject
          'X-Mail-Autoreply', # value is often "dtc-autoreply" but can be another tag
        ].any? do |name|
          message[name]
        end ||
        # If the Auto-Submitted header is present and is not equal to "no".
        (
          message['Auto-Submitted'] &&
          message['Auto-Submitted'].decoded != 'no'
        ) ||
        # If the message subject matches the autoresponse pattern.
        (
          MultiMail.autoresponse_pattern &&
          message.subject &&
          message.subject[MultiMail.autoresponse_pattern]
        )
      )
    end
  end
end

require 'multi_mail/multimap'
require 'multi_mail/service'
require 'multi_mail/receiver'
require 'multi_mail/message/base'
require 'multi_mail/receiver/base'
require 'multi_mail/sender/base'
require 'multi_mail/cloudmailin/message'
require 'multi_mail/mailgun/message'
require 'multi_mail/mailgun/sender'
require 'multi_mail/mandrill/message'
require 'multi_mail/mandrill/sender'
require 'multi_mail/postmark/message'
require 'multi_mail/postmark/sender'
require 'multi_mail/sendgrid/message'
require 'multi_mail/sendgrid/sender'