fluent-plugin-mail 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +16 -3
- data/{example.conf → example/example.conf} +5 -3
- data/example/to_cc_bcc_key.conf +23 -0
- data/fluent-plugin-mail.gemspec +1 -2
- data/lib/fluent/plugin/out_mail.rb +58 -16
- data/test/plugin/test_out_mail.rb +29 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 481b1b97a2f2766802bcbd11bb3eb4d351e59fc6
|
4
|
+
data.tar.gz: 68d5a406f5cba6041b7086ced8234d40050685cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d934bc3e3e385f876ef068a213738f28a752046a24922bb76f69ba684d820a138f23d7daedc2d134815586165aeaf7b3447740878f206617f31ce700d983de5e
|
7
|
+
data.tar.gz: fb72bf8db210ef6e3606583b5446a1a5b284c77349e9167e7f04f115ccdaa0306c8358388cae11959b2ca419404b320fa9d39702915fef81cc2e6d6213a1a9c3
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -205,10 +205,23 @@ log server("/etc/td-agent/td-agent.conf")
|
|
205
205
|
</match>
|
206
206
|
|
207
207
|
|
208
|
+
### Dynamic identiciation of mail destination (to, cc, bcc)
|
208
209
|
|
209
|
-
|
210
|
+
You can dynamically identify mail destination (to, cc, bcc) from event records as:
|
210
211
|
|
211
|
-
|
212
|
+
|
213
|
+
```
|
214
|
+
<match mail.test>
|
215
|
+
type mail
|
216
|
+
from from@example.com
|
217
|
+
to_key to
|
218
|
+
cc_key cc
|
219
|
+
bcc_key bcc
|
220
|
+
....
|
221
|
+
</match>
|
222
|
+
```
|
223
|
+
|
224
|
+
With this example, `to`, `cc`, `bcc` are dynamically extracted from `record["to"]`, `record["cc"]`, `record["bcc"]` respectively.
|
212
225
|
|
213
226
|
## ChangeLog
|
214
227
|
|
@@ -228,7 +241,7 @@ It starts STMP server on localhost:1025, and has Web UI running on localhost:108
|
|
228
241
|
Run Fluentd as:
|
229
242
|
|
230
243
|
```
|
231
|
-
$ bundle exec fluentd -c example.conf
|
244
|
+
$ bundle exec fluentd -c example/example.conf
|
232
245
|
```
|
233
246
|
|
234
247
|
Put a message to the Fluentd as:
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# echo '{"message":"This is a test"}' | bundle exec fluent-cat mail.test
|
2
|
+
|
1
3
|
<source>
|
2
4
|
type forward
|
3
5
|
</source>
|
@@ -7,9 +9,9 @@
|
|
7
9
|
log_level debug
|
8
10
|
host localhost
|
9
11
|
port 1025
|
10
|
-
from
|
11
|
-
to
|
12
|
-
bcc
|
12
|
+
from from@example.com
|
13
|
+
to to@example.com
|
14
|
+
bcc bcc@example.com
|
13
15
|
subject this is a test
|
14
16
|
message Hello from out_mail\n[%s] %s
|
15
17
|
message_out_keys time,message
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# echo '{"message":"This is a test","bcc":"bcc@example.com"}' | bundle exec fluent-cat mail.test
|
2
|
+
|
3
|
+
<source>
|
4
|
+
type forward
|
5
|
+
</source>
|
6
|
+
|
7
|
+
<match mail.test>
|
8
|
+
type mail
|
9
|
+
log_level debug
|
10
|
+
host localhost
|
11
|
+
port 1025
|
12
|
+
from from@example.com
|
13
|
+
to to@example.com
|
14
|
+
to_key to
|
15
|
+
bcc_key bcc
|
16
|
+
subject this is a test
|
17
|
+
message Hello from out_mail\n[%s] %s
|
18
|
+
message_out_keys time,message
|
19
|
+
time_key time
|
20
|
+
time_locale Asia/Taipei
|
21
|
+
# localtime false
|
22
|
+
time_format %Y-%m-%d %H:%M:%S %z
|
23
|
+
</match>
|
data/fluent-plugin-mail.gemspec
CHANGED
@@ -6,13 +6,12 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.description = %q{output plugin for Mail}
|
7
7
|
gem.summary = %q{output plugin for Mail}
|
8
8
|
gem.homepage = "https://github.com/u-ichi/fluent-plugin-mail"
|
9
|
-
gem.rubyforge_project = "fluent-plugin-mail"
|
10
9
|
gem.files = `git ls-files`.split($\)
|
11
10
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
11
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
12
|
gem.name = "fluent-plugin-mail"
|
14
13
|
gem.require_paths = ["lib"]
|
15
|
-
gem.version = '0.2.
|
14
|
+
gem.version = '0.2.4'
|
16
15
|
gem.license = "Apache-2.0"
|
17
16
|
|
18
17
|
gem.add_runtime_dependency "fluentd"
|
@@ -42,8 +42,14 @@ class Fluent::MailOutput < Fluent::Output
|
|
42
42
|
config_param :to, :string, :default => ''
|
43
43
|
desc "Mail destination (Cc)"
|
44
44
|
config_param :cc, :string, :default => ''
|
45
|
-
desc "Mail destination (
|
45
|
+
desc "Mail destination (Bcc)"
|
46
46
|
config_param :bcc, :string, :default => ''
|
47
|
+
desc "Dyanmically identify mail destination (To) from records"
|
48
|
+
config_param :to_key, :string, :default => nil
|
49
|
+
desc "Dynamically identify mail destination (Cc) from records"
|
50
|
+
config_param :cc_key, :string, :default => nil
|
51
|
+
desc "Dynamically identify mail destination (Bcc) from records"
|
52
|
+
config_param :bcc_key, :string, :default => nil
|
47
53
|
desc "Format string to construct mail subject"
|
48
54
|
config_param :subject, :string, :default => 'Fluent::MailOutput plugin'
|
49
55
|
desc "Specify comma delimited keys output to `subject`"
|
@@ -90,6 +96,35 @@ class Fluent::MailOutput < Fluent::Output
|
|
90
96
|
@create_message_proc = Proc.new {|tag, time, record| create_key_value_message(tag, time, record) }
|
91
97
|
end
|
92
98
|
|
99
|
+
if @to_key or @cc_key or @bcc_key
|
100
|
+
@process_event_stream_proc = Proc.new {|tag, es|
|
101
|
+
messages = []
|
102
|
+
subjects = []
|
103
|
+
dests = []
|
104
|
+
|
105
|
+
es.each do |time, record|
|
106
|
+
messages << @create_message_proc.call(tag, time, record)
|
107
|
+
subjects << create_formatted_subject(tag, time, record)
|
108
|
+
dests << %w(to cc bcc).each_with_object({}){|t, dest| dest[t] = create_dest_addr(t, record) }
|
109
|
+
end
|
110
|
+
|
111
|
+
[messages, subjects, dests]
|
112
|
+
}
|
113
|
+
else
|
114
|
+
@process_event_stream_proc = Proc.new {|tag, es|
|
115
|
+
messages = []
|
116
|
+
subjects = []
|
117
|
+
dests = []
|
118
|
+
|
119
|
+
es.each do |time, record|
|
120
|
+
messages << @create_message_proc.call(tag, time, record)
|
121
|
+
subjects << create_formatted_subject(tag, time, record)
|
122
|
+
end
|
123
|
+
|
124
|
+
[messages, subjects, dests]
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
93
128
|
begin
|
94
129
|
@subject % (['1'] * @subject_out_keys.length)
|
95
130
|
rescue ArgumentError
|
@@ -104,19 +139,13 @@ class Fluent::MailOutput < Fluent::Output
|
|
104
139
|
end
|
105
140
|
|
106
141
|
def emit(tag, es, chain)
|
107
|
-
messages =
|
108
|
-
subjects = []
|
142
|
+
messages, subjects, dests = @process_event_stream_proc.call(tag, es)
|
109
143
|
|
110
|
-
|
111
|
-
messages << @create_message_proc.call(tag, time, record)
|
112
|
-
subjects << create_formatted_subject(tag, time, record)
|
113
|
-
}
|
114
|
-
|
115
|
-
(0...messages.size).each do |i|
|
116
|
-
message = messages[i]
|
144
|
+
messages.each_with_index do |message, i|
|
117
145
|
subject = subjects[i]
|
146
|
+
dest = dests[i]
|
118
147
|
begin
|
119
|
-
sendmail(subject, message)
|
148
|
+
sendmail(subject, message, dest)
|
120
149
|
rescue => e
|
121
150
|
log.warn "out_mail: failed to send notice to #{@host}:#{@port}, subject: #{subject}, message: #{message}, " <<
|
122
151
|
"error_class: #{e.class}, error_message: #{e.message}, error_backtrace: #{e.backtrace.first}"
|
@@ -179,7 +208,7 @@ class Fluent::MailOutput < Fluent::Output
|
|
179
208
|
@subject % values
|
180
209
|
end
|
181
210
|
|
182
|
-
def sendmail(subject, msg)
|
211
|
+
def sendmail(subject, msg, dest = nil)
|
183
212
|
smtp = Net::SMTP.new(@host, @port)
|
184
213
|
|
185
214
|
if @user and @password
|
@@ -193,6 +222,9 @@ class Fluent::MailOutput < Fluent::Output
|
|
193
222
|
|
194
223
|
subject = subject.force_encoding('binary')
|
195
224
|
body = msg.force_encoding('binary')
|
225
|
+
to = (dest && dest['to']) ? dest['to'] : @to
|
226
|
+
cc = (dest && dest['cc']) ? dest['cc'] : @cc
|
227
|
+
bcc = (dest && dest['bcc']) ? dest['bcc'] : @bcc
|
196
228
|
|
197
229
|
# Date: header has timezone, so usually it is not necessary to set locale explicitly
|
198
230
|
# But, for people who would see mail header text directly, the locale information may help something
|
@@ -203,9 +235,9 @@ class Fluent::MailOutput < Fluent::Output
|
|
203
235
|
content = <<EOF
|
204
236
|
Date: #{date}
|
205
237
|
From: #{@from}
|
206
|
-
To: #{
|
207
|
-
Cc: #{
|
208
|
-
Bcc: #{
|
238
|
+
To: #{to}
|
239
|
+
Cc: #{cc}
|
240
|
+
Bcc: #{bcc}
|
209
241
|
Subject: #{subject}
|
210
242
|
Message-Id: #{mid}
|
211
243
|
Mime-Version: 1.0
|
@@ -213,7 +245,7 @@ Content-Type: #{@content_type}
|
|
213
245
|
|
214
246
|
#{body}
|
215
247
|
EOF
|
216
|
-
response = smtp.send_mail(content, @from,
|
248
|
+
response = smtp.send_mail(content, @from, to.split(/,/), cc.split(/,/), bcc.split(/,/))
|
217
249
|
log.debug "out_mail: content: #{content.gsub("\n", "\\n")}"
|
218
250
|
log.debug "out_mail: email send response: #{response.string.chomp}"
|
219
251
|
smtp.finish
|
@@ -245,4 +277,14 @@ EOF
|
|
245
277
|
retry
|
246
278
|
end
|
247
279
|
end
|
280
|
+
|
281
|
+
def create_dest_addr(dest_type, record)
|
282
|
+
addr = instance_variable_get(:"@#{dest_type}")
|
283
|
+
dest_key = instance_variable_get(:"@#{dest_type}_key")
|
284
|
+
if dest_key
|
285
|
+
return record[dest_key] || addr
|
286
|
+
else
|
287
|
+
return addr
|
288
|
+
end
|
289
|
+
end
|
248
290
|
end
|
@@ -46,6 +46,21 @@ class MailOutputTest < Test::Unit::TestCase
|
|
46
46
|
to localhost@localdomain
|
47
47
|
]
|
48
48
|
|
49
|
+
CONFIG_DEST_ADDR = %[
|
50
|
+
out_keys tag,time,value
|
51
|
+
time_key time
|
52
|
+
time_format %Y/%m/%d %H:%M:%S
|
53
|
+
tag_key tag
|
54
|
+
subject Fluentd Notification Alarm %s
|
55
|
+
subject_out_keys tag
|
56
|
+
host localhost
|
57
|
+
port 25
|
58
|
+
from localhost@localdomain
|
59
|
+
to_key to
|
60
|
+
cc_key cc
|
61
|
+
bcc_key bcc
|
62
|
+
]
|
63
|
+
|
49
64
|
def create_driver(conf=CONFIG_OUT_KEYS,tag='test')
|
50
65
|
Fluent::Test::OutputTestDriver.new(Fluent::MailOutput, tag).configure(conf)
|
51
66
|
end
|
@@ -75,6 +90,20 @@ class MailOutputTest < Test::Unit::TestCase
|
|
75
90
|
end
|
76
91
|
end
|
77
92
|
|
93
|
+
def test_dest_addr
|
94
|
+
d = create_driver(CONFIG_DEST_ADDR)
|
95
|
+
time = Time.now.to_i
|
96
|
+
d.run do
|
97
|
+
d.emit({
|
98
|
+
'value' => "message mail from fluentd out_mail",
|
99
|
+
'to' => "localhost@localdomain",
|
100
|
+
'cc' => "localhost@localdomain",
|
101
|
+
'bcc' => "localhost@localdomain",
|
102
|
+
},
|
103
|
+
time)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
78
107
|
def test_with_scrub
|
79
108
|
d = create_driver(CONFIG_MESSAGE)
|
80
109
|
invalid_string = "\xff".force_encoding('UTF-8')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-mail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuichi UEMURA
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
@@ -69,7 +69,8 @@ files:
|
|
69
69
|
- LICENSE
|
70
70
|
- README.md
|
71
71
|
- Rakefile
|
72
|
-
- example.conf
|
72
|
+
- example/example.conf
|
73
|
+
- example/to_cc_bcc_key.conf
|
73
74
|
- fluent-plugin-mail.gemspec
|
74
75
|
- lib/fluent/plugin/out_mail.rb
|
75
76
|
- test/helper.rb
|
@@ -93,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
94
|
- !ruby/object:Gem::Version
|
94
95
|
version: '0'
|
95
96
|
requirements: []
|
96
|
-
rubyforge_project:
|
97
|
+
rubyforge_project:
|
97
98
|
rubygems_version: 2.5.1
|
98
99
|
signing_key:
|
99
100
|
specification_version: 4
|