lib/multi_mail.rb
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'