Class: WCC::MailNotificator

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

Constant Summary collapse

@@main =
nil
@@bodies =
nil

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts) ⇒ MailNotificator

Returns a new instance of MailNotificator.



45
46
47
# File 'lib/wcc/mail.rb', line 45

def initialize(opts)
  @to = MailAddress.new(opts)
end

Class Method Details

.get_bodiesObject



144
145
146
147
148
149
150
151
152
# File 'lib/wcc/mail.rb', line 144

def self.get_bodies
  if @@bodies.nil?
    @@bodies = {
      :plain => WCC::Prog.load_template('mail-body.plain.erb'),
      :html => WCC::Prog.load_template('mail-body.html.erb')
    }
  end
  @@bodies
end

.get_mainObject

template loading



137
138
139
140
141
142
# File 'lib/wcc/mail.rb', line 137

def self.get_main
  if @@main.nil?
    @@main = WCC::Prog.load_template('mail.alt.erb')
  end
  @@main
end

.parse_conf(conf) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/wcc/mail.rb', line 76

def self.parse_conf(conf)
  if conf.is_a?(Hash)
    if conf['smtp'].is_a?(Hash)
      from_mail = MailAddress.new(conf['smtp']['from'] || "#{Etc.getlogin}@localhost")
      return {
        :mailer => 'smtp',
        :from_mail => from_mail,
        :smtp_host => conf['smtp']['host'] || 'localhost',
        :smtp_port => conf['smtp']['port'] || 25
      }
    elsif conf['fake_file'].is_a?(Hash)
      from_mail = MailAddress.new(conf['fake_file']['from'] || "#{Etc.getlogin}@localhost")
      return {
        :mailer => 'fake_file',
        :from_mail => from_mail
      }
    end
  end
  # default is smtp
  WCC.logger.debug "Using default SMTP configuration for MailNotificator"
  return {
    :mailer => 'smtp',
    :from_mail => MailAddress.new("#{Etc.getlogin}@localhost"),
    :smtp_host => 'localhost',
    :smtp_port => 25
  }
end

.send_fake_file(msg, from, to) ⇒ Object

This just dumps a mail’s contents into an eml file in the current working directory. This should be for TESTING ONLY as it doesn’t take care of standards and stuff like that…

Parameters:



130
131
132
133
134
# File 'lib/wcc/mail.rb', line 130

def self.send_fake_file(msg, from, to)
  # dump mail to eml-file
  filename = "#{Time.new.strftime('%Y%m%d-%H%M%S')} #{to.name}.eml"
  File.open(filename, 'w') { |f| f.write(msg) }
end

.send_smtp(msg, from, to, host, port) ⇒ Object

This is a specific implementation of an mail deliverer that does plain SMTP to host:port using [Net::SMTP].

Parameters:

  • msg (String)

    the mail

  • from (MailAddress)

    the From: address

  • to (MailAddress)

    array of To: address

  • host (String)

    the SMTP host

  • port (Integer)

    the SMTP port



114
115
116
117
118
119
120
121
# File 'lib/wcc/mail.rb', line 114

def self.send_smtp(msg, from, to, host, port)
  # send message
  Net::SMTP.start(host, port) do |smtp|
    smtp.send_message(msg, from.address, to.address)
  end
rescue => ex
  WCC.logger.fatal "Cannot send mail via SMTP to #{host}:#{port} : #{ex}"
end

.shut_downObject



104
# File 'lib/wcc/mail.rb', line 104

def self.shut_down; end

Instance Method Details

#notify!(data) ⇒ Object

Sends a mail built up from some [ERB] templates to the specified adresses.

Parameters:

  • data (Object)

    used to construct ERB binding



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/wcc/mail.rb', line 53

def notify!(data)
  # from/to addresses
  data.from = Conf[:from_mail]
  data.to = @to
  # generate a boundary that may be used for multipart
  data.boundary = "frontier-#{data.site.id}"
  # generate message
  data.bodies = {}
  # eval all body templates
  self.class.get_bodies.each do |name,template|
    data.bodies[name] = template.result(binding)
  end
  # eval main template
  msg = self.class.get_main.result(binding)
  
  case Conf[:mailer]
  when 'smtp'
    self.class.send_smtp(msg, Conf[:from_mail], @to, Conf[:smtp_host], Conf[:smtp_port])
  when 'fake_file'
    self.class.send_fake_file(msg, Conf[:from_mail], @to)
  end
end