deliverer.rb
3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
module Sendcloud
class Deliverer
attr_accessor :settings
def initialize(settings)
self.settings = settings
end
def api_user
self.settings[:api_user]
end
def api_key
self.settings[:api_key]
end
def api_url
self.settings[:api_url]
end
def deliver!(rails_message)
options = build_sendcloud_message_for(rails_message)
response = sendcloud_client.send_message options
# Rails.logger.info("from:#{options[:from]} to:#{options[:to]} res:#{response}")
rails_message.api_response = response
if response.code == 200
sendcloud_message_id = JSON.parse(response.to_str)["id"]
rails_message.message_id = sendcloud_message_id
end
response
end
private
def build_sendcloud_message_for(rails_message)
sendcloud_message = build_basic_sendcloud_message_for rails_message
transform_sendcloud_attributes_from_rails rails_message, sendcloud_message
remove_empty_values sendcloud_message
sendcloud_message
end
def build_basic_sendcloud_message_for(rails_message)
sendcloud_message = {
apiUser: api_user,
apiKey: api_key,
from: rails_message[:from].formatted.join(";"),
to: rails_message[:to].formatted.join(";"),
subject: rails_message.subject,
html: extract_html(rails_message),
plain: extract_text(rails_message),
fromName: rails_message['from-name']
}
[:cc, :bcc].each do |key|
sendcloud_message[key] = rails_message[key].formatted if rails_message[key]
end
return sendcloud_message
end
def transform_sendcloud_attributes_from_rails(rails_message, sendcloud_message)
transform_reply_to rails_message, sendcloud_message if rails_message.reply_to
transform_label_id rails_message, sendcloud_message
transform_custom_headers rails_message, sendcloud_message
end
def transform_reply_to(rails_message, sendcloud_message)
sendcloud_message['h:Reply-To'] = rails_message[:reply_to].formatted.first
end
def transform_label_id(rails_message, sendcloud_message)
id = label_id(rails_message)
sendcloud_message['labelId'] = id if id
end
def extract_html(rails_message)
if rails_message.html_part
rails_message.html_part.body.decoded
else
rails_message.content_type =~ /text\/html/ ? rails_message.body.decoded : nil
end
end
def extract_text(rails_message)
if rails_message.multipart?
rails_message.text_part ? rails_message.text_part.body.decoded : nil
else
rails_message.content_type =~ /text\/plain/ ? rails_message.body.decoded : nil
end
end
def transform_custom_headers(rails_message, sendcloud_message)
rails_message.sendcloud_headers.try(:each) do |name, value|
sendcloud_message["h:#{name}"] = value
end
end
def remove_empty_values(sendcloud_message)
sendcloud_message.delete_if { |key, value| value.nil? }
end
def sendcloud_client
@sendcloud_client ||= Client.new(api_url)
end
def label_id rails_message
rails_message.header.fields.find { |f| f.name == 'label-id' }.try :value
end
end
end
ActionMailer::Base.add_delivery_method :sendcloud, Sendcloud::Deliverer