deliverer.rb
3.67 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
117
118
119
120
121
122
123
124
125
126
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}")
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.join(";") if rails_message[key]
end
if rails_message.attachments.present?
sendcloud_message[:attachments] = transform_attachments(rails_message)
end
return sendcloud_message
end
def transform_attachments(rails_message)
attachment = rails_message.attachments.first
filename = attachment.filename
file_path = File.join(Dir.tmpdir, filename)
File.open(file_path, "wb") do |file|
file.write(attachment.body.decoded)
end
File.open(file_path)
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