rss2mail 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README +2 -2
- data/Rakefile +1 -1
- data/lib/rss2mail/feed.rb +35 -35
- data/lib/rss2mail/rss.rb +9 -5
- data/lib/rss2mail/transport.rb +124 -0
- data/lib/rss2mail/version.rb +2 -2
- data/lib/rss2mail.rb +5 -1
- metadata +30 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ab6a446362c67e63d9cb8f6df6c7944ebf57fde
|
4
|
+
data.tar.gz: 26ac3bb913287311660c844bda123d634417ce50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf4cb4d6742279b979a8ac46c4118599567ec307d6fac41c9908f87762861e396c0f5da9330acf9ee2a719ddb7019028b0aafcb445da841ee6a16323e65c288c
|
7
|
+
data.tar.gz: 5760b2a4d4957335de6eb4ffa32ec4328e9c5f9cdd956320a6aac01d3c2c1dd7b5e47f530692cc17a2ea19b2d057c6173fbcba82942c3fef4771becd97402ec4
|
data/README
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
== VERSION
|
4
4
|
|
5
|
-
This documentation refers to rss2mail version 0.
|
5
|
+
This documentation refers to rss2mail version 0.3.0
|
6
6
|
|
7
7
|
|
8
8
|
== DESCRIPTION
|
@@ -26,7 +26,7 @@ RubyGem:: http://rubygems.org/gems/rss2mail
|
|
26
26
|
|
27
27
|
== LICENSE AND COPYRIGHT
|
28
28
|
|
29
|
-
Copyright (C) 2007-
|
29
|
+
Copyright (C) 2007-2014 Jens Wille
|
30
30
|
|
31
31
|
rss2mail is free software: you can redistribute it and/or modify it under
|
32
32
|
the terms of the GNU Affero General Public License as published by the Free
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ begin
|
|
10
10
|
:summary => %q{Send RSS feeds as e-mail},
|
11
11
|
:author => %q{Jens Wille},
|
12
12
|
:email => %q{jens.wille@gmail.com},
|
13
|
-
:license => %q{AGPL},
|
13
|
+
:license => %q{AGPL-3.0},
|
14
14
|
:homepage => :blackwinter,
|
15
15
|
:extra_files => FileList['templates/*'].to_a,
|
16
16
|
:dependencies => %w[nokogiri ruby-nuggets simple-rss sinatra blackwinter-unidecoder]
|
data/lib/rss2mail/feed.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# #
|
4
4
|
# A component of rss2mail, the RSS to e-mail forwarder. #
|
5
5
|
# #
|
6
|
-
# Copyright (C) 2007-
|
6
|
+
# Copyright (C) 2007-2014 Jens Wille #
|
7
7
|
# #
|
8
8
|
# Authors: #
|
9
9
|
# Jens Wille <jens.wille@gmail.com> #
|
@@ -25,9 +25,6 @@
|
|
25
25
|
#++
|
26
26
|
|
27
27
|
require 'erb'
|
28
|
-
require 'open3'
|
29
|
-
require 'nuggets/file/which'
|
30
|
-
require 'nuggets/string/evaluate'
|
31
28
|
|
32
29
|
module RSS2Mail
|
33
30
|
|
@@ -35,19 +32,17 @@ module RSS2Mail
|
|
35
32
|
|
36
33
|
include Util
|
37
34
|
|
38
|
-
unless MAIL = File.which(mail = 'mail'.freeze)
|
39
|
-
class << MAIL; self; end.send(:define_method, :to_s) { mail }
|
40
|
-
end
|
41
|
-
|
42
|
-
HOST = ENV['HOSTNAME'] || ENV['HOST'] || %x{hostname}.chomp.freeze
|
43
|
-
|
44
|
-
FROM = "From: rss2mail@#{HOST}".freeze
|
45
|
-
|
46
35
|
KEEP = 100
|
47
36
|
|
48
37
|
def initialize(feed, options = {})
|
49
38
|
raise TypeError, "Hash expected, got #{feed.class}" unless feed.is_a?(Hash)
|
50
39
|
|
40
|
+
required = [:url, :to, :title].delete_if { |key| feed.key?(key) }
|
41
|
+
|
42
|
+
unless required.empty?
|
43
|
+
raise ArgumentError, "Feed incomplete: #{required.join(', ')} missing"
|
44
|
+
end
|
45
|
+
|
51
46
|
@feed = feed
|
52
47
|
@simple = feed[:simple]
|
53
48
|
@updated = feed[:updated]
|
@@ -56,20 +51,18 @@ module RSS2Mail
|
|
56
51
|
@verbose = options[:verbose]
|
57
52
|
@debug = options[:debug]
|
58
53
|
|
59
|
-
|
60
|
-
|
54
|
+
klass, opt = transport_from(options)
|
55
|
+
@transport = "#{klass.name.split('::').last} @ #{opt}"
|
61
56
|
|
62
|
-
|
63
|
-
raise ArgumentError, "Feed incomplete: #{required.join(', ')} missing"
|
64
|
-
end
|
57
|
+
extend klass
|
65
58
|
end
|
66
59
|
|
67
60
|
attr_reader :feed, :simple, :updated,
|
68
61
|
:reload, :verbose, :debug,
|
69
|
-
:content, :rss
|
62
|
+
:transport, :content, :rss
|
70
63
|
|
71
64
|
def deliver(templates)
|
72
|
-
|
65
|
+
check_deliver_requirements if respond_to?(:check_deliver_requirements)
|
73
66
|
|
74
67
|
if (to = Array(feed[:to])).empty?
|
75
68
|
log 'No one to send to'
|
@@ -86,12 +79,11 @@ module RSS2Mail
|
|
86
79
|
return
|
87
80
|
end
|
88
81
|
|
89
|
-
type
|
90
|
-
encoding = feed[:encoding] || 'UTF-8'
|
91
|
-
|
92
|
-
type_header = "Content-type: #{type}; charset=#{encoding}"
|
82
|
+
type = feed[:content_type] || 'text/html'
|
93
83
|
|
94
|
-
|
84
|
+
if template = templates[type[/\/(.*)/, 1]]
|
85
|
+
type = "Content-type: #{type}; charset=#{feed[:encoding] || 'UTF-8'}"
|
86
|
+
else
|
95
87
|
log "Template not found: #{type}"
|
96
88
|
return
|
97
89
|
end
|
@@ -102,7 +94,7 @@ module RSS2Mail
|
|
102
94
|
items.each { |item|
|
103
95
|
link, subject, body = render(feed, item, template)
|
104
96
|
|
105
|
-
send_mail(
|
97
|
+
send_mail(to, "[#{title}] #{subject}", body, type) {
|
106
98
|
sent << link
|
107
99
|
count += 1
|
108
100
|
}
|
@@ -117,6 +109,18 @@ module RSS2Mail
|
|
117
109
|
|
118
110
|
private
|
119
111
|
|
112
|
+
def transport_from(options)
|
113
|
+
if lmtp = options[:lmtp]
|
114
|
+
@lmtp = lmtp.split(':')
|
115
|
+
[Transport::LMTP, lmtp]
|
116
|
+
elsif smtp = options[:smtp]
|
117
|
+
@smtp = smtp.split(':')
|
118
|
+
[Transport::SMTP, smtp]
|
119
|
+
else
|
120
|
+
[klass = Transport::Mail, "#{klass::CMD} = #{klass::BIN.inspect}"]
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
120
124
|
def get(reload = reload)
|
121
125
|
conditions = {}
|
122
126
|
|
@@ -158,8 +162,8 @@ module RSS2Mail
|
|
158
162
|
}
|
159
163
|
|
160
164
|
log feed.values_at(:etag, :mtime, :updated).inspect, debug
|
161
|
-
rescue OpenURI::HTTPError
|
162
|
-
log
|
165
|
+
rescue OpenURI::HTTPError => err
|
166
|
+
log "Feed not found or unchanged: #{err} (#{err.class})"
|
163
167
|
rescue Exception => err
|
164
168
|
error err, 'while getting feed'
|
165
169
|
end
|
@@ -207,18 +211,14 @@ module RSS2Mail
|
|
207
211
|
[link, subject, ERB.new(template).result(binding)]
|
208
212
|
end
|
209
213
|
|
210
|
-
def send_mail(
|
214
|
+
def send_mail(*args)
|
211
215
|
return if debug
|
212
216
|
|
213
|
-
|
214
|
-
'-s', "[#{title}] #{subject}", *to) { |mail, _, _|
|
215
|
-
mail.puts body
|
216
|
-
mail.close
|
217
|
-
}
|
217
|
+
deliver_mail(*args)
|
218
218
|
|
219
219
|
yield if block_given?
|
220
|
-
rescue
|
221
|
-
error err, 'while sending mail',
|
220
|
+
rescue Exception => err
|
221
|
+
error err, 'while sending mail', transport
|
222
222
|
end
|
223
223
|
|
224
224
|
def log(msg, verbose = verbose)
|
data/lib/rss2mail/rss.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
# #
|
6
6
|
# A component of rss2mail, the RSS to e-mail forwarder. #
|
7
7
|
# #
|
8
|
-
# Copyright (C) 2007-
|
8
|
+
# Copyright (C) 2007-2014 Jens Wille #
|
9
9
|
# #
|
10
10
|
# Authors: #
|
11
11
|
# Jens Wille <jens.wille@gmail.com> #
|
@@ -56,8 +56,8 @@ module RSS2Mail
|
|
56
56
|
|
57
57
|
def feed(*args)
|
58
58
|
new(*args)
|
59
|
-
rescue
|
60
|
-
yield
|
59
|
+
rescue Exception => err
|
60
|
+
block_given? ? yield(err) : raise
|
61
61
|
end
|
62
62
|
|
63
63
|
end
|
@@ -80,7 +80,11 @@ module RSS2Mail
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def parse
|
83
|
-
|
83
|
+
strict_parse || simple_parse
|
84
|
+
end
|
85
|
+
|
86
|
+
def strict_parse
|
87
|
+
::RSS::Parser.parse(content, false)
|
84
88
|
end
|
85
89
|
|
86
90
|
def simple_parse
|
@@ -182,7 +186,7 @@ module RSS2Mail
|
|
182
186
|
|
183
187
|
body.encode!(encoding) if encoding
|
184
188
|
body
|
185
|
-
rescue OpenURI::HTTPError, EOFError
|
189
|
+
rescue OpenURI::HTTPError, EOFError, SocketError
|
186
190
|
end
|
187
191
|
|
188
192
|
def extract_body(expr, attribute = nil)
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
#--
|
4
|
+
###############################################################################
|
5
|
+
# #
|
6
|
+
# A component of rss2mail, the RSS to e-mail forwarder. #
|
7
|
+
# #
|
8
|
+
# Copyright (C) 2007-2014 Jens Wille #
|
9
|
+
# #
|
10
|
+
# Authors: #
|
11
|
+
# Jens Wille <jens.wille@gmail.com> #
|
12
|
+
# #
|
13
|
+
# rss2mail is free software; you can redistribute it and/or modify it under #
|
14
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
15
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
16
|
+
# any later version. #
|
17
|
+
# #
|
18
|
+
# rss2mail is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
21
|
+
# more details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU Affero General Public License #
|
24
|
+
# along with rss2mail. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
module RSS2Mail
|
30
|
+
|
31
|
+
module Transport
|
32
|
+
|
33
|
+
HOST = ENV['HOSTNAME'] || ENV['HOST'] || %x{hostname}.chomp.freeze
|
34
|
+
|
35
|
+
FROM = "From: rss2mail@#{HOST}".freeze
|
36
|
+
|
37
|
+
module Mail
|
38
|
+
|
39
|
+
require 'open3'
|
40
|
+
require 'nuggets/file/which'
|
41
|
+
|
42
|
+
CMD = ENV['RSS2MAIL_MAIL_CMD'] || 'mail'.freeze
|
43
|
+
|
44
|
+
BIN = ENV['RSS2MAIL_MAIL_BIN'] || File.which(CMD)
|
45
|
+
|
46
|
+
def check_deliver_requirements
|
47
|
+
raise "Mail command not found: #{CMD}" unless BIN
|
48
|
+
end
|
49
|
+
|
50
|
+
def deliver_mail(to, subject, body, type)
|
51
|
+
Open3.popen3(
|
52
|
+
BIN, '-e',
|
53
|
+
'-a', type,
|
54
|
+
'-a', FROM,
|
55
|
+
'-s', subject,
|
56
|
+
*to
|
57
|
+
) { |mail, _, _|
|
58
|
+
mail.puts body
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
module SMTP
|
65
|
+
|
66
|
+
require 'net/smtp'
|
67
|
+
require 'securerandom'
|
68
|
+
|
69
|
+
def deliver_mail(to, *args)
|
70
|
+
deliver_smtp(Net::SMTP, @smtp, [to], *args)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def deliver_smtp(klass, args, to, subject, body, type)
|
76
|
+
klass.start(*args) { |smtp|
|
77
|
+
to.each { |_to|
|
78
|
+
smtp.send_message(<<-EOT, FROM, *_to)
|
79
|
+
#{FROM}
|
80
|
+
To: #{Array(_to).join(', ')}
|
81
|
+
Date: #{Time.now.rfc822}
|
82
|
+
Subject: #{subject}
|
83
|
+
Message-Id: #{SecureRandom.uuid}
|
84
|
+
#{type}
|
85
|
+
|
86
|
+
#{body}
|
87
|
+
EOT
|
88
|
+
}
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
module LMTP
|
95
|
+
|
96
|
+
include SMTP
|
97
|
+
|
98
|
+
def deliver_mail(to, *args)
|
99
|
+
deliver_smtp(Net::LMTP, @lmtp, to, *args)
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
module Net
|
109
|
+
|
110
|
+
class LMTP < SMTP
|
111
|
+
|
112
|
+
# Send LMTP's LHLO command instead of SMTP's HELO command
|
113
|
+
def helo(domain)
|
114
|
+
getok("LHLO #{domain}")
|
115
|
+
end
|
116
|
+
|
117
|
+
# Send LMTP's LHLO command instead of ESMTP's EHLO command
|
118
|
+
def ehlo(domain)
|
119
|
+
getok("LHLO #{domain}")
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
data/lib/rss2mail/version.rb
CHANGED
data/lib/rss2mail.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# #
|
4
4
|
# rss2mail -- Send RSS feeds as e-mail #
|
5
5
|
# #
|
6
|
-
# Copyright (C) 2007-
|
6
|
+
# Copyright (C) 2007-2014 Jens Wille #
|
7
7
|
# #
|
8
8
|
# Authors: #
|
9
9
|
# Jens Wille <jens.wille@gmail.com> #
|
@@ -24,9 +24,13 @@
|
|
24
24
|
###############################################################################
|
25
25
|
#++
|
26
26
|
|
27
|
+
require 'rss2mail/transport'
|
27
28
|
require 'rss2mail/util'
|
28
29
|
require 'rss2mail/feed'
|
29
30
|
require 'rss2mail/rss'
|
30
31
|
|
31
32
|
module RSS2Mail
|
32
33
|
end
|
34
|
+
|
35
|
+
require 'nuggets/pluggable'
|
36
|
+
Nuggets::Pluggable.load_plugins_for(RSS2Mail)
|
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rss2mail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Wille
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ruby-nuggets
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: simple-rss
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sinatra
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: blackwinter-unidecoder
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: Send RSS feeds as e-mail
|
@@ -90,50 +90,51 @@ extra_rdoc_files:
|
|
90
90
|
- COPYING
|
91
91
|
- ChangeLog
|
92
92
|
files:
|
93
|
+
- COPYING
|
94
|
+
- ChangeLog
|
95
|
+
- README
|
96
|
+
- Rakefile
|
97
|
+
- bin/rss2mail
|
98
|
+
- example/config.ru
|
99
|
+
- example/feeds.yaml
|
93
100
|
- lib/rss2mail.rb
|
94
101
|
- lib/rss2mail/app.rb
|
95
102
|
- lib/rss2mail/feed.rb
|
96
103
|
- lib/rss2mail/rss.rb
|
104
|
+
- lib/rss2mail/transport.rb
|
97
105
|
- lib/rss2mail/util.rb
|
98
106
|
- lib/rss2mail/version.rb
|
99
|
-
- bin/rss2mail
|
100
107
|
- templates/html.erb
|
101
108
|
- templates/plain.erb
|
102
|
-
- COPYING
|
103
|
-
- ChangeLog
|
104
|
-
- README
|
105
|
-
- Rakefile
|
106
|
-
- example/config.ru
|
107
|
-
- example/feeds.yaml
|
108
109
|
homepage: http://github.com/blackwinter/rss2mail
|
109
110
|
licenses:
|
110
|
-
- AGPL
|
111
|
+
- AGPL-3.0
|
111
112
|
metadata: {}
|
112
113
|
post_install_message:
|
113
114
|
rdoc_options:
|
114
|
-
- --
|
115
|
+
- "--title"
|
116
|
+
- rss2mail Application documentation (v0.3.0)
|
117
|
+
- "--charset"
|
115
118
|
- UTF-8
|
116
|
-
- --line-numbers
|
117
|
-
- --all
|
118
|
-
- --
|
119
|
-
- rss2mail Application documentation (v0.2.2)
|
120
|
-
- --main
|
119
|
+
- "--line-numbers"
|
120
|
+
- "--all"
|
121
|
+
- "--main"
|
121
122
|
- README
|
122
123
|
require_paths:
|
123
124
|
- lib
|
124
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
126
|
requirements:
|
126
|
-
- -
|
127
|
+
- - ">="
|
127
128
|
- !ruby/object:Gem::Version
|
128
129
|
version: '0'
|
129
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
131
|
requirements:
|
131
|
-
- -
|
132
|
+
- - ">="
|
132
133
|
- !ruby/object:Gem::Version
|
133
134
|
version: '0'
|
134
135
|
requirements: []
|
135
136
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.
|
137
|
+
rubygems_version: 2.2.2
|
137
138
|
signing_key:
|
138
139
|
specification_version: 4
|
139
140
|
summary: Send RSS feeds as e-mail
|