command_line_email 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -8
- data/command_line_email.gemspec +2 -0
- data/lib/command_line_email/cle_optparse.rb +65 -0
- data/lib/command_line_email/command_line_email.rb +6 -87
- data/lib/command_line_email/deliver_email.rb +36 -0
- data/lib/command_line_email/{send_mail_setup.rb → send_email_setup.rb} +19 -6
- data/lib/command_line_email/version.rb +1 -1
- data/lib/command_line_email.rb +1 -0
- data/spec/command_line_email/cle_optparse_spec.rb +8 -0
- data/spec/command_line_email/command_line_email_spec.rb +39 -0
- data/spec/command_line_email/deliver_email_spec.rb +8 -0
- data/spec/command_line_email/send_email_setup_spec.rb +8 -0
- data/spec/spec_helper.rb +6 -0
- metadata +50 -5
data/README.md
CHANGED
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
Send email from the Linux or Mac command line. Attach specific file(s) or all files in a directory. Specify email body as CLI string or load from a file.
|
4
4
|
|
5
|
-
## WARNING - NOT YET FULLY IMPLEMENTED
|
6
|
-
|
7
|
-
This program still needs some work before I finish gemifying it. I have not yet created the bin/ directory file and currently run this by calling lib/command_line_email.rb directly.
|
8
|
-
|
9
5
|
## Installation
|
10
6
|
|
11
7
|
Install command_line_email as:
|
@@ -26,13 +22,13 @@ This gem is useful for anyone who wishes to send email from a server using only
|
|
26
22
|
|
27
23
|
## Usage
|
28
24
|
|
29
|
-
Once set up (see "Configuration File" below), you can send an email using various options (see "Command Line Options" below). Here's one example:
|
25
|
+
Once set up (see "Configuration File" below), you can send an email using "clemail" plus various options (see "Command Line Options" below). Here's one example:
|
30
26
|
|
31
|
-
|
27
|
+
clemail -t "me@myaddress.com" -t "my_friend@her_address.com" -s "Subject line text" -b "First body paragraph" -b "Second body paragraph"
|
32
28
|
|
33
29
|
### Configuration File
|
34
30
|
|
35
|
-
The first time you run command_line_email, it will create a YAML file at ~/.command_line_email.yml. You edit this file to set your email configuration and, optionally, create mailing lists. A configuration file looks something like this:
|
31
|
+
The first time you run command_line_email, it will create a YAML file at ~/.command_line_email.yml (NOT YET IMPLEMENTED). You edit this file to set your email configuration and, optionally, create mailing lists. A configuration file looks something like this:
|
36
32
|
|
37
33
|
---
|
38
34
|
:connection:
|
@@ -69,7 +65,7 @@ The following command line options are available:
|
|
69
65
|
|
70
66
|
-c (--cc) takes the same values as -t/--to and sets the email's "carbon copy" recipients
|
71
67
|
|
72
|
-
-
|
68
|
+
-F (--file) takes a string representing the path to a file you wish to attach to the email. This flag can be used multiple times, each with a different file.
|
73
69
|
|
74
70
|
-d (--directory) takes a string with a directory path. If provided with the -f/--file option, it is presumed that all files are in the directory specified by the -d/--directory option. If no -f/--file option is present, ALL files within the -d/--directory directory will be attached.
|
75
71
|
|
data/command_line_email.gemspec
CHANGED
@@ -13,6 +13,8 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.homepage = "https://github.com/JamesLavin/command_line_email"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.add_development_dependency 'rspec'
|
17
|
+
gem.add_development_dependency 'fakefs'
|
16
18
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
19
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
20
|
gem.require_paths = ["lib"]
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module CommandLineEmail
|
2
|
+
|
3
|
+
class CleOptparse
|
4
|
+
|
5
|
+
def self.parse(args, user_config)
|
6
|
+
|
7
|
+
mail_attrs = {to: []}
|
8
|
+
|
9
|
+
option_parser = OptionParser.new do |opts|
|
10
|
+
|
11
|
+
opts.on("-t TO","--to TO") do |to|
|
12
|
+
mail_attrs[:to] = to_string_to_mailing_list(user_config, to, mail_attrs[:to])
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on("-f FROM","--from FROM") do |from|
|
16
|
+
mail_attrs[:from] = from
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("-b BODY","--body BODY") do |body|
|
20
|
+
mail_attrs[:body] ||= ""
|
21
|
+
mail_attrs[:body] << body + "\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on("-s SUBJECT","--subject SUBJECT") do |subject|
|
25
|
+
mail_attrs[:subject] = subject
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on("-c CC","--cc CC") do |cc|
|
29
|
+
if user_config.mailing_lists.has_key? cc.to_sym
|
30
|
+
mail_attrs[:cc] = user_config.mailing_lists[cc.to_sym]
|
31
|
+
else
|
32
|
+
mail_attrs[:cc] = cc
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on("-F FILE","--file FILE") do |file|
|
37
|
+
mail_attrs[:files] ||= []
|
38
|
+
mail_attrs[:files] << file
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on("-d DIRECTORY","--directory DIRECTORY") do |directory|
|
42
|
+
mail_attrs[:directory] = directory
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
option_parser.parse!(args)
|
48
|
+
|
49
|
+
mail_attrs
|
50
|
+
|
51
|
+
end # parse()
|
52
|
+
|
53
|
+
def self.to_string_to_mailing_list(user_config, to, list=[])
|
54
|
+
# takes optional list in case you want to add to an existing list
|
55
|
+
if user_config.mailing_lists.has_key? to.to_sym
|
56
|
+
Array(user_config.mailing_lists[to.to_sym]).each { |address| list << address }
|
57
|
+
else
|
58
|
+
list << to
|
59
|
+
end
|
60
|
+
list
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -3,99 +3,18 @@
|
|
3
3
|
require 'mail'
|
4
4
|
require 'yaml'
|
5
5
|
require 'optparse'
|
6
|
-
require '
|
6
|
+
require 'send_email_setup'
|
7
|
+
require 'cle_optparse'
|
8
|
+
require 'deliver_email'
|
7
9
|
|
8
|
-
user_config = CommandLineEmail::
|
10
|
+
user_config = CommandLineEmail::SendEmailSetup.new
|
9
11
|
|
10
12
|
Mail.defaults do
|
11
13
|
delivery_method :smtp, user_config.mail_options
|
12
14
|
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
def self.parse(args, user_config)
|
17
|
-
|
18
|
-
mail_attrs = {to: []}
|
19
|
-
|
20
|
-
option_parser = OptionParser.new do |opts|
|
21
|
-
|
22
|
-
opts.on("-t TO","--to TO") do |to|
|
23
|
-
mail_attrs[:to] = to_string_to_mailing_list(user_config, to, mail_attrs[:to])
|
24
|
-
end
|
25
|
-
|
26
|
-
opts.on("-f FROM","--from FROM") do |from|
|
27
|
-
mail_attrs[:from] = from
|
28
|
-
end
|
29
|
-
|
30
|
-
opts.on("-b BODY","--body BODY") do |body|
|
31
|
-
mail_attrs[:body] ||= ""
|
32
|
-
mail_attrs[:body] << body + "\n"
|
33
|
-
end
|
34
|
-
|
35
|
-
opts.on("-s SUBJECT","--subject SUBJECT") do |subject|
|
36
|
-
mail_attrs[:subject] = subject
|
37
|
-
end
|
38
|
-
|
39
|
-
opts.on("-c CC","--cc CC") do |cc|
|
40
|
-
if user_config.mailing_lists.has_key? cc.to_sym
|
41
|
-
mail_attrs[:cc] = user_config.mailing_lists[cc.to_sym]
|
42
|
-
else
|
43
|
-
mail_attrs[:cc] = cc
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
opts.on("-f FILE","--add-file FILE") do |file|
|
48
|
-
mail_attrs[:files] ||= []
|
49
|
-
mail_attrs[:files] << file
|
50
|
-
end
|
51
|
-
|
52
|
-
opts.on("-d DIRECTORY","--directory DIRECTORY") do |directory|
|
53
|
-
mail_attrs[:directory] = directory
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
option_parser.parse!(args)
|
59
|
-
|
60
|
-
mail_attrs
|
61
|
-
|
62
|
-
end # parse()
|
63
|
-
|
64
|
-
def self.to_string_to_mailing_list(user_config, to, list=[])
|
65
|
-
# takes optional list in case you want to add to an existing list
|
66
|
-
if user_config.mailing_lists.has_key? to.to_sym
|
67
|
-
Array(user_config.mailing_lists[to.to_sym]).each { |address| list << address }
|
68
|
-
else
|
69
|
-
list << to
|
70
|
-
end
|
71
|
-
list
|
72
|
-
end
|
73
|
-
|
74
|
-
end # class CleOptparse
|
75
|
-
|
76
|
-
mail_attrs = CleOptparse.parse(ARGV, user_config)
|
16
|
+
mail_attrs = CommandLineEmail::CleOptparse.parse(ARGV, user_config)
|
77
17
|
|
78
18
|
puts mail_attrs
|
79
19
|
|
80
|
-
|
81
|
-
if File.exists?(filename_or_text)
|
82
|
-
File.open(filename_or_text,'r').read
|
83
|
-
else
|
84
|
-
filename_or_text
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
mail = Mail.new do
|
89
|
-
from mail_attrs[:from] || user_config.defaults[:from]
|
90
|
-
to mail_attrs[:to] || user_config.defaults[:to]
|
91
|
-
cc mail_attrs[:cc] || user_config.defaults[:cc] || nil
|
92
|
-
subject mail_attrs[:subject] || user_config.defaults[:subject] || ''
|
93
|
-
body mail_attrs[:body] ? grab_text_from_filename_if_file_exists(mail_attrs[:body]) : ''
|
94
|
-
if mail_attrs[:files]
|
95
|
-
attach_selected(mail_attrs[:files], mail_attrs[:directory] || '')
|
96
|
-
elsif mail_attrs[:directory]
|
97
|
-
attach_all_from_directory(mail_attrs[:directory])
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
mail.deliver!
|
20
|
+
CommandLineEmail::DeliverEmail.deliver(user_config, mail_attrs)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module CommandLineEmail
|
2
|
+
|
3
|
+
class DeliverEmail
|
4
|
+
|
5
|
+
def self.deliver(user_config, mail_attrs)
|
6
|
+
|
7
|
+
mail = Mail.new do
|
8
|
+
from mail_attrs[:from] || user_config.defaults[:from]
|
9
|
+
to mail_attrs[:to] || user_config.defaults[:to]
|
10
|
+
cc mail_attrs[:cc] || user_config.defaults[:cc] || nil
|
11
|
+
subject mail_attrs[:subject] || user_config.defaults[:subject] || ''
|
12
|
+
body mail_attrs[:body] ? grab_text_from_filename_if_file_exists(mail_attrs[:body]) : ''
|
13
|
+
if mail_attrs[:files]
|
14
|
+
attach_selected(mail_attrs[:files], mail_attrs[:directory] || '')
|
15
|
+
elsif mail_attrs[:directory]
|
16
|
+
attach_all_from_directory(mail_attrs[:directory])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
mail.deliver!
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def self.grab_text_from_filename_if_file_exists(filename_or_text)
|
27
|
+
if File.exists?(filename_or_text)
|
28
|
+
File.open(filename_or_text,'r').read
|
29
|
+
else
|
30
|
+
filename_or_text
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module CommandLineEmail
|
4
4
|
|
5
|
-
class
|
5
|
+
class SendEmailSetup
|
6
6
|
|
7
7
|
class ConfigFileNotFound < StandardError
|
8
8
|
def initialize(msg)
|
@@ -14,7 +14,8 @@ module CommandLineEmail
|
|
14
14
|
attr_reader :mail_options, :mail_config_file
|
15
15
|
|
16
16
|
def initialize(config_file = nil)
|
17
|
-
|
17
|
+
set_mail_config_file(config_file)
|
18
|
+
ensure_config_file_exists
|
18
19
|
set_mail_options
|
19
20
|
end
|
20
21
|
|
@@ -28,14 +29,26 @@ module CommandLineEmail
|
|
28
29
|
|
29
30
|
private
|
30
31
|
|
32
|
+
def ensure_config_file_exists
|
33
|
+
# nil to use default msg; [] to avoid printing ugly backtrace
|
34
|
+
raise(ConfigFileNotFound, nil, []) unless config_file_exists?
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_mail_config_file(config_file)
|
38
|
+
config_file ||= '~/.command_line_email.yml'
|
39
|
+
@mail_config_file = File.expand_path(config_file)
|
40
|
+
end
|
41
|
+
|
42
|
+
def config_file_exists?
|
43
|
+
File.exists? mail_config_file
|
44
|
+
end
|
45
|
+
|
31
46
|
def mail_config
|
32
|
-
@mail_config ||=
|
47
|
+
@mail_config ||= load_mail_config(mail_config_file)
|
33
48
|
end
|
34
49
|
|
35
|
-
def
|
50
|
+
def load_mail_config(mail_config_file)
|
36
51
|
YAML::load(File.open(mail_config_file))
|
37
|
-
rescue
|
38
|
-
raise ConfigFileNotFound, nil, [] # turn off ugly backtrace
|
39
52
|
end
|
40
53
|
|
41
54
|
def set_mail_options
|
data/lib/command_line_email.rb
CHANGED
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift("#{File.expand_path(File.dirname(__FILE__))}/command_line_ema
|
|
4
4
|
|
5
5
|
require "mail"
|
6
6
|
require "mail/message"
|
7
|
+
require "extruby/mail/message"
|
7
8
|
require "command_line_email/version"
|
8
9
|
require "command_line_email/send_mail_setup"
|
9
10
|
require "command_line_email/command_line_email"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "calling command_line_email" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
$stdout = StringIO.new # suppress command line output
|
7
|
+
end
|
8
|
+
|
9
|
+
context "when config file not present" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
CommandLineEmail::SendEmailSetup.any_instance.stub(:config_file_exists?).and_return(false)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should raise ConfigFileNotFound" do
|
16
|
+
expect { require "command_line_email" }.to raise_error(CommandLineEmail::SendEmailSetup::ConfigFileNotFound)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when config file present" do
|
22
|
+
|
23
|
+
before do
|
24
|
+
CommandLineEmail::SendEmailSetup.any_instance.stub(:config_file_exists?).and_return(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not raise ConfigFileNotFound" do
|
28
|
+
expect { require "command_line_email" }.to_not raise_error(CommandLineEmail::SendEmailSetup::ConfigFileNotFound)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "other stuff" do
|
36
|
+
|
37
|
+
include FakeFS::SpecHelpers
|
38
|
+
|
39
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: command_line_email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,40 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-12-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: fakefs
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
14
46
|
description: Send email from the Linux or Mac command line
|
15
47
|
email:
|
16
48
|
- command_line_email@futureresearch.com
|
@@ -27,10 +59,17 @@ files:
|
|
27
59
|
- bin/clemail
|
28
60
|
- command_line_email.gemspec
|
29
61
|
- lib/command_line_email.rb
|
62
|
+
- lib/command_line_email/cle_optparse.rb
|
30
63
|
- lib/command_line_email/command_line_email.rb
|
31
|
-
- lib/command_line_email/
|
64
|
+
- lib/command_line_email/deliver_email.rb
|
65
|
+
- lib/command_line_email/send_email_setup.rb
|
32
66
|
- lib/command_line_email/version.rb
|
33
67
|
- lib/extruby/mail/message.rb
|
68
|
+
- spec/command_line_email/cle_optparse_spec.rb
|
69
|
+
- spec/command_line_email/command_line_email_spec.rb
|
70
|
+
- spec/command_line_email/deliver_email_spec.rb
|
71
|
+
- spec/command_line_email/send_email_setup_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
34
73
|
homepage: https://github.com/JamesLavin/command_line_email
|
35
74
|
licenses: []
|
36
75
|
post_install_message:
|
@@ -56,4 +95,10 @@ signing_key:
|
|
56
95
|
specification_version: 3
|
57
96
|
summary: Send email from the Linux or Mac command line. Can attach specific files
|
58
97
|
or all files in a directory. Can load email body from a file.
|
59
|
-
test_files:
|
98
|
+
test_files:
|
99
|
+
- spec/command_line_email/cle_optparse_spec.rb
|
100
|
+
- spec/command_line_email/command_line_email_spec.rb
|
101
|
+
- spec/command_line_email/deliver_email_spec.rb
|
102
|
+
- spec/command_line_email/send_email_setup_spec.rb
|
103
|
+
- spec/spec_helper.rb
|
104
|
+
has_rdoc:
|