feed2email 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 0.2.0
2
+
3
+ * Add support for sending mail via SMTP
4
+ * Replace command-line configuration with a config file
5
+
1
6
  ### 0.1.0
2
7
 
3
8
  * Skip entry if pubDate is in the future
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- feed2email (0.0.2)
4
+ feed2email (0.2.0)
5
5
  feedzirra
6
6
  mail
7
7
 
data/README.md CHANGED
@@ -6,7 +6,7 @@ RSS/Atom feed updates in your email
6
6
 
7
7
  I don't like having a separate application for feeds when I'm already checking my email. I also never read a thing when feeds are kept in a separate place.
8
8
 
9
- The script was written primarily as a replacement of [rss2email][] and aims to be simpler, faster, smaller and easier to use.
9
+ feed2email was written primarily as a replacement of [rss2email][] and aims to be simpler, faster, smaller and easier to use.
10
10
 
11
11
  [rss2email]: http://www.allthingsrss.com/rss2email/
12
12
 
@@ -18,37 +18,82 @@ Install as a [gem][] from [RubyGems][]:
18
18
  $ gem install feed2email
19
19
  ~~~
20
20
 
21
- You also need to have [Sendmail][] working in your system to send mail. I use [msmtp][] which is a nice alternative with a compatible Sendmail interface.
22
-
23
21
  [gem]: http://rubygems.org/gems/feed2email
24
22
  [RubyGems]: http://rubygems.org/
25
- [Sendmail]: http://en.wikipedia.org/wiki/Sendmail
26
- [msmtp]: http://msmtp.sourceforge.net/
27
23
 
28
- ## Use
24
+ ## Configuration
29
25
 
30
- Create `~/.feed2email/feeds.yml` and add the address of each feed you want to subscribe to, prefixed with a dash and a space.
26
+ Since version 0.2.0, feed2email no longer supports command-line arguments and is configured through a [YAML][] configuration file located under `~/.feed2email/config.yml`.
31
27
 
32
- When run for the first time, the script enters "dry run" mode and exits almost immediately. During dry run mode:
28
+ There are two ways to send mail: SMTP and Sendmail. If `config.yml` contains options for both, feed2email will use SMTP.
33
29
 
34
- * No feeds are fetched and, thus, no email is sent (existing feed entries are considered already seen)
35
- * `~/.feed2email/state.yml` is created containing the timestamp of when each feed was last fetched
30
+ [YAML]: http://en.wikipedia.org/wiki/YAML
36
31
 
37
- If you want to receive existing entries from a specific feed, you can manually alter the timestamp for that feed in `state.yml` to a value in the past. Next time you run the script, all entries published past that timestamp will be sent with email.
32
+ ### SMTP
38
33
 
39
- To run the script:
34
+ Since version 0.2.0, it is possible to send mail via SMTP.
40
35
 
41
- ~~~ sh
42
- $ feed2email name@example.com
36
+ Here's a sample `config.yml` file:
37
+
38
+ ~~~ yaml
39
+ recipient: johndoe@example.org
40
+ smtp_host: mail.example.org
41
+ smtp_port: 587
42
+ smtp_user: johndoe
43
+ smtp_pass: 12345
44
+ smtp_tls: true
45
+ smtp_auth: login
43
46
  ~~~
44
47
 
45
- It's also possible to override the path to the [Sendmail][] binary:
48
+ A short explanation of the available options:
49
+
50
+ * `recipient` is the email address to send updates to
51
+ * `smtp_host` is the SMTP service hostname to connect to
52
+ * `smtp_port` is the SMTP service port to connect to
53
+ * `smtp_user` is the username of your mail account
54
+ * `smtp_pass` is the password of your mail account (see the warning below)
55
+ * `smtp_tls` (optional) controls TLS (default is `true`; can also be `false`)
56
+ * `smtp_auth` (optional) controls the authentication method (default is `login`; can also be `plain` or `cram_md5`)
57
+
58
+ **Warning:** Unless it has correct restricted permissions, anyone with access in your system will be able to read `config.yml` and your password. To prevent this, feed2email will not run and complain if it detects the wrong permissions. You can set the correct permissions with `chmod 600 ~/.feed2email/config.yml`.
59
+
60
+ ### Sendmail
61
+
62
+ For this method you need to have [Sendmail][] setup and working in your system. It is also possible to use [a program with a Sendmail-compatible interface][msmtp].
63
+
64
+ Assuming you have everything setup and working, here's a sample `config.yml` file:
65
+
66
+ ~~~ yaml
67
+ recipient: johndoe@example.org
68
+ sendmail_path: /usr/sbin/sendmail
69
+ ~~~
70
+
71
+ A short explanation of the available options:
72
+
73
+ * `recipient` is the email address to send updates to
74
+ * `sendmail_path` (optional) is the path to the Sendmail binary (default is `/usr/sbin/sendmail`)
75
+
76
+ [Sendmail]: http://en.wikipedia.org/wiki/Sendmail
77
+ [msmtp]: http://msmtp.sourceforge.net/
78
+
79
+ ## Use
80
+
81
+ Create `~/.feed2email/feeds.yml` and add the address of each feed you want to subscribe to, prefixed with a dash and a space.
82
+
83
+ Then run it:
46
84
 
47
85
  ~~~ sh
48
- $ SENDMAIL=/path/to/sendmail feed2email name@example.com
86
+ $ feed2email
49
87
  ~~~
50
88
 
51
- You can use [cron][] to run the script e.g. once every hour.
89
+ When run for the first time, feed2email enters "dry run" mode and exits almost immediately. During dry run mode:
90
+
91
+ * No feeds are fetched and, thus, no email is sent (existing feed entries are considered already seen)
92
+ * `~/.feed2email/state.yml` is created containing the timestamp of when each feed was last fetched
93
+
94
+ If you want to receive existing entries from a specific feed, you can manually alter the timestamp for that feed in `state.yml` to a value in the past. Next time you run feed2email, all entries published past that timestamp will be sent with email.
95
+
96
+ You can use [cron][] to run feed2email automatically e.g. once every hour.
52
97
 
53
98
  [cron]: http://en.wikipedia.org/wiki/Cron
54
99
 
data/bin/feed2email CHANGED
@@ -1,10 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if %w{-h --help}.include?(ARGV[0]) || (ARGV[0].nil? && ENV['MAILTO'].nil?)
4
- $stderr.puts "usage: #{$0} <recipient>"
5
- exit 1
6
- end
7
-
8
3
  require 'feed2email'
9
4
 
10
- Feed2Email::Feed.process_all(:recipient => ARGV[0] || ENV['MAILTO'])
5
+ Feed2Email::Feed.process_all
data/lib/feed2email.rb CHANGED
@@ -2,6 +2,7 @@ require 'cgi'
2
2
  require 'feedzirra'
3
3
  require 'fileutils'
4
4
  require 'mail'
5
+ require 'net/smtp'
5
6
  require 'yaml'
6
7
 
7
8
  require 'feed2email/version'
@@ -1,29 +1,51 @@
1
1
  module Feed2Email
2
- FEEDS_FILE = File.expand_path('~/.feed2email/feeds.yml')
3
- STATE_FILE = File.expand_path('~/.feed2email/state.yml')
4
- USER_AGENT = "feed2email/#{VERSION}"
2
+ CONFIG_DIR = File.expand_path('~/.feed2email')
3
+ CONFIG_FILE = File.join(CONFIG_DIR, 'config.yml')
4
+ FEEDS_FILE = File.join(CONFIG_DIR, 'feeds.yml')
5
+ STATE_FILE = File.join(CONFIG_DIR, 'state.yml')
6
+ USER_AGENT = "feed2email/#{VERSION}"
5
7
 
6
8
  class Feed
7
- def self.process(uri, options)
8
- Feed.new(uri, options).process
9
+ def self.process(uri)
10
+ Feed.new(uri).process
9
11
  end
10
12
 
11
- def self.process_all(options)
12
- FileUtils.mkdir_p(File.dirname(STATE_FILE)) rescue nil
13
+ def self.process_all
14
+ FileUtils.mkdir_p(CONFIG_DIR)
15
+
16
+ $config = YAML.load(open(CONFIG_FILE)) rescue nil
17
+
18
+ if !$config.is_a? Hash
19
+ $stderr.puts "Error: missing or invalid config file #{CONFIG_FILE}"
20
+ exit 1
21
+ end
22
+
23
+ if '%o' % (File.stat(CONFIG_FILE).mode & 0777) != '600'
24
+ $stderr.puts "Error: invalid permissions for config file #{CONFIG_FILE}"
25
+ exit 2
26
+ end
27
+
28
+ if $config['recipient'].nil?
29
+ $stderr.puts "Error: recipient missing from config file #{CONFIG_FILE}"
30
+ exit 3
31
+ end
32
+
33
+ feed_uris = YAML.load(open(FEEDS_FILE)) rescue nil
34
+
35
+ if !feed_uris.is_a? Array
36
+ $stderr.puts "Error: missing or invalid feeds file #{FEEDS_FILE}"
37
+ exit 4
38
+ end
13
39
 
14
40
  @@fetch_times = YAML.load(open(STATE_FILE)) rescue {}
15
41
 
16
- feed_uris = YAML.load(open(FEEDS_FILE)) rescue []
17
- feed_uris.each {|uri| Feed.process(uri, options) }
42
+ feed_uris.each {|uri| Feed.process(uri) }
18
43
 
19
44
  open(STATE_FILE, 'w') {|f| f.write(@@fetch_times.to_yaml) }
20
45
  end
21
46
 
22
- attr_reader :options
23
-
24
- def initialize(uri, options)
47
+ def initialize(uri)
25
48
  @uri = uri
26
- @options = options
27
49
  end
28
50
 
29
51
  def fetch_time
@@ -1,11 +1,22 @@
1
1
  module Feed2Email
2
- SENDMAIL = ENV['SENDMAIL'] || '/usr/sbin/sendmail'
3
-
4
2
  class Mail
5
3
  def initialize(entry)
6
4
  @entry = entry
7
5
  end
8
6
 
7
+ def send
8
+ if $config['smtp_host'] &&
9
+ $config['smtp_port'] &&
10
+ $config['smtp_user'] &&
11
+ $config['smtp_pass']
12
+ send_with_smtp
13
+ else
14
+ send_with_sendmail
15
+ end
16
+ end
17
+
18
+ private
19
+
9
20
  def body
10
21
  body_data = {
11
22
  :uri => @entry.uri.escape_html,
@@ -29,14 +40,17 @@ module Feed2Email
29
40
  def from
30
41
  from_data = {
31
42
  :name => @entry.feed.title,
32
- :email => @entry.author,
43
+ :email => from_address,
33
44
  }
45
+ '"%{name}" <%{email}>' % from_data
46
+ end
34
47
 
35
- if from_data[:email].nil? || from_data[:email]['@'].nil?
36
- from_data[:email] = to
48
+ def from_address
49
+ if @entry.author && @entry.author['@']
50
+ @entry.author
51
+ else
52
+ to
37
53
  end
38
-
39
- '"%{name}" <%{email}>' % from_data
40
54
  end
41
55
 
42
56
  def html_part
@@ -52,21 +66,40 @@ module Feed2Email
52
66
  m.to = to
53
67
  m.subject = subject
54
68
  m.html_part = html_part
55
- end
69
+ end.to_s
56
70
  end
57
71
 
58
- def send
59
- open("|#{SENDMAIL} #{to}", 'w') do |f|
72
+ def send_with_sendmail
73
+ open("|#{sendmail_bin} #{to}", 'w') do |f|
60
74
  f.write(mail)
61
75
  end
62
76
  end
63
77
 
78
+ def send_with_smtp
79
+ host = $config['smtp_host']
80
+ port = $config['smtp_port']
81
+ user = $config['smtp_user']
82
+ pass = $config['smtp_pass']
83
+ tls = $config['smtp_tls'] || $config['smtp_tls'].nil? # on by default
84
+ auth = ($config['smtp_auth'] || 'login').to_sym # login by default
85
+
86
+ smtp = Net::SMTP.new(host, port)
87
+ smtp.enable_starttls if tls
88
+ smtp.start('localhost', user, pass, auth) do
89
+ smtp.send_message(mail, from_address, to)
90
+ end
91
+ end
92
+
93
+ def sendmail_bin
94
+ $config['sendmail_path'] || '/usr/sbin/sendmail'
95
+ end
96
+
64
97
  def subject
65
98
  @entry.title
66
99
  end
67
100
 
68
101
  def to
69
- @entry.feed.options[:recipient]
102
+ $config['recipient']
70
103
  end
71
104
  end
72
105
  end
@@ -1,3 +1,3 @@
1
1
  module Feed2Email
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feed2email
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-05 00:00:00.000000000 Z
12
+ date: 2013-04-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: feedzirra
@@ -79,12 +79,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
79
  - - ! '>='
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
+ segments:
83
+ - 0
84
+ hash: 2515505025282581014
82
85
  required_rubygems_version: !ruby/object:Gem::Requirement
83
86
  none: false
84
87
  requirements:
85
88
  - - ! '>='
86
89
  - !ruby/object:Gem::Version
87
90
  version: '0'
91
+ segments:
92
+ - 0
93
+ hash: 2515505025282581014
88
94
  requirements: []
89
95
  rubyforge_project:
90
96
  rubygems_version: 1.8.23
@@ -92,4 +98,3 @@ signing_key:
92
98
  specification_version: 3
93
99
  summary: RSS/Atom feed updates in your email
94
100
  test_files: []
95
- has_rdoc: