Class: BulkMail

Inherits:
Object
  • Object
show all
Defined in:
lib/bulkmail.rb

Constant Summary collapse

LINE_BREAK =
"\r\n"
HEADER_FMT =
"%s: %s\r\n".freeze
@@server_settings =
{
  :host => 'localhost',
  :port => 25,
  :helo_domain => nil,
  :user => nil,
  :password => nil,
  :auth => :plain
}

Class Method Summary collapse

Class Method Details

.format_headers(headers) ⇒ Object

Returns the message headers formatted



57
58
59
60
61
# File 'lib/bulkmail.rb', line 57

def self.format_headers(headers)
  headers.inject('') do |m, kv|
    m << (HEADER_FMT % [kv[0].to_header, kv[1]])
  end
end

.send_bulk(sender, recipients, body, headers) ⇒ Object

Sends bulk mail to a large number of recipients.



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/bulkmail.rb', line 89

def self.send_bulk(sender, recipients, body, headers)
  failed = []
  succeeded = []
  headers[:from] = headers[:to] = sender
  recipients = recipients.map {|r| r.email_addr}.compact
  recipients.split(10).each do |list|
    begin
      smtp {|s| send_message(s, sender.email_addr, list, body, headers)}
      succeeded.concat list
      puts "Sent message to #{list.join(', ')}"
    rescue => e
      failed.concat list
      puts "Failed to send to #{list.join(', ')}: #{e.message}\r\n#{e.backtrace.first}"
    end
  end
  # log failed addresses
  unless failed.empty?
    File.open('failed.bulkmail', 'w') {|f| failed.each {|l|f.puts l}}
  end
  puts "Message to sent to #{succeeded.size} of #{recipients.size} recipients"
end

.send_message(smtp, from, to, body, headers = nil) ⇒ Object

Sends an email



77
78
79
80
81
82
83
84
85
86
# File 'lib/bulkmail.rb', line 77

def self.send_message(smtp, from, to, body, headers = nil)
  if headers && !headers.empty?
    msg = format_headers(headers)
  else
    msg = LINE_BREAK
  end
  msg << LINE_BREAK
  msg << body
  smtp.send_message msg, from, to
end

.server_settingsObject

Returns the server_settings hash



49
50
51
# File 'lib/bulkmail.rb', line 49

def self.server_settings
  @@server_settings
end

.smtpObject

Starts an SMTP session and yields



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/bulkmail.rb', line 64

def self.smtp
  Net::SMTP.start(
    @@server_settings[:host], 
    @@server_settings[:port], 
    @@server_settings[:helo_domain] || @@server_settings[:host],
    @@server_settings[:user], 
    @@server_settings[:password], 
    @@server_settings[:auth]) do |smtp|
    yield smtp
  end
end