jpmckinney/multi_mail

View on GitHub
bin/multi_mail_post

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

require 'optparse'
require 'securerandom'

require 'multi_mail'
require 'multi_mail/version'

secret = nil

opts = OptionParser.new do |opts|
  opts.banner = "Usage: #{opts.program_name} [options] URL < INPUT"
  opts.on('-s', '--secret SECRET', 'A secret key to ensure that requests are authentic') do |v|
    secret = v
  end
  opts.on_tail('-h', '--help', 'Show this message') do
    puts opts
    exit
  end
  opts.on_tail('-v', '--version', 'Show version') do
    puts MultiMail::VERSION
    exit
  end
end

rest = opts.parse!(ARGV)

if rest.empty?
  puts opts.banner
  exit
end

url = rest.shift

begin
  url = URI.parse(url)
rescue URI::InvalidURIError
  abort "#{url} is not a valid URI"
end

unless url.scheme && url.host
  abort "#{url} is not a valid URI"
end

service = MultiMail::Receiver.new({
  :provider => :simple,
  :secret => secret,
})

params = {
  'message' => STDIN.read,
  'timestamp' => Time.now.to_i,
  'token' => SecureRandom.hash,
}

params['signature'] = service.signature(params) if secret

connection = Faraday.new(:url => "#{url.scheme}://#{url.host}:#{url.port}") do |conn|
  conn.basic_auth url.user, url.password if url.user || url.password
  conn.request :url_encoded
  conn.adapter Faraday.default_adapter
end

response = connection.post(url.path, params)

if response.status != 200
  headers = response.headers.map do |key,value|
    "#{key.gsub(/\b([a-z])/) {$1.capitalize}}: #{value}"
  end
  abort (headers + ['', response.body]).join("\r\n")
end