bulkmail 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ *0.2*
2
+
3
+ * Updated README.
4
+
5
+ * Set batch size at 10.
6
+
7
+ * Fixed script to use new version.
8
+
9
+ * Removed actionmailer dependancy.
10
+
11
+ * Rewrote to use Net::SMTP directly.
12
+
1
13
  *0.1*
2
14
 
3
15
  * Add INT trap.
data/README CHANGED
@@ -21,22 +21,21 @@ where the options are:
21
21
 
22
22
  You can also include headers in the content file, provided they are followed by a blank line. For example:
23
23
 
24
- Subject: Baroque Concert this Thursday
24
+ Subject: My New Thing
25
+ Content-Type: text/html; charset=UTF-8
25
26
 
26
- Hello Baroque Lovers,
27
- A special concert is about to take place this Thursday at...
27
+ <html><body><h1>My New Thing!</h1></body></html>
28
28
 
29
29
  === From Ruby
30
30
 
31
- BulkMail.send(options)
31
+ BulkMail.send_bulk(sender, recipients, content, headers)
32
32
 
33
- Valid options are:
34
- [:recipients_file] recipients file name
35
- [:content_file] content file name
36
- [:subject] subject
37
- [:from] from
38
- [:additional_headers] additional headers
33
+ Where:
34
+ [sender] is the sender address. This address will also be used as in the form and to headers.
35
+ [recipients] is an array of email addresses
36
+ [content] is the message content
37
+ [headers] is an array containing message headers.
39
38
 
40
- You can set server settings in the same fashion as ActionMailer by using the convenience method:
39
+ You can change server settings by using BulkMail.server_settings:
41
40
 
42
- BulkMail.server_settings[:address] = 'mail.example.com'
41
+ BulkMail.server_settings[:host] = 'mail.example.com'
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ require 'fileutils'
7
7
  include FileUtils
8
8
 
9
9
  NAME = "bulkmail"
10
- VERS = "0.1"
10
+ VERS = "0.2"
11
11
  CLEAN.include ['**/.*.sw?', '*.gem', '.config']
12
12
  RDOC_OPTS = ['--quiet', '--title', "Bulkmail Documentation",
13
13
  "--opname", "index.html",
@@ -44,7 +44,6 @@ spec = Gem::Specification.new do |s|
44
44
  s.homepage = 'http://code.google.com/p/bulkmail/'
45
45
  s.executables = ['bulkmail']
46
46
 
47
- s.add_dependency('actionmailer')
48
47
  s.required_ruby_version = '>= 1.8.2'
49
48
 
50
49
  s.files = %w(COPYING README Rakefile) + Dir.glob("{bin,doc,lib}/**/*")
@@ -2,9 +2,27 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'optparse'
5
+ require 'bulkmail'
6
+
7
+ $sender = nil
8
+ $recipients = []
9
+ $content = nil
10
+ $headers = {}
5
11
 
6
- config = {
7
- }
12
+ def parse_file(fn)
13
+ lines = IO.readlines(fn)
14
+ while line = lines.shift
15
+ break if line.empty?
16
+ if line =~ /^(.+):\s?(.*)$/
17
+ $headers ||= {}
18
+ $headers[$1] = $2
19
+ else
20
+ lines.unshift(line)
21
+ break
22
+ end
23
+ end
24
+ $content = lines.join
25
+ end
8
26
 
9
27
  opts = OptionParser.new do |opts|
10
28
  opts.banner = "Usage: bulkmail <options>"
@@ -13,39 +31,39 @@ opts = OptionParser.new do |opts|
13
31
  opts.separator "Options:"
14
32
 
15
33
  opts.on("-h", "--host HOSTNAME", "SMPT host name. Default is localhost.") do |v|
16
- config[:host] = v
34
+ BulkMail.server_settings[:host] = v
17
35
  end
18
36
 
19
- opts.on("-r", "--recipients filename", "Recipients file name") do |v|
20
- config[:recipients_file] = v
37
+ opts.on("-u", "--user username", "User name (for authentication)") do |v|
38
+ BulkMail.server_settings[:user] = v
21
39
  end
22
40
 
23
- opts.on("-c", "--content filename", "Content file name") do |v|
24
- config[:content_file] = v
41
+ opts.on("-p", "--password password", "Password (for authentication)") do |v|
42
+ BulkMail.server_settings[:password] = v
25
43
  end
26
44
 
27
- opts.on("-s", "--subject subject", "Subject line") do |v|
28
- config[:subject] = v
45
+ opts.on("-a", "--authentication type", "Authentication type") do |v|
46
+ BulkMail.server_settings[:auth] = v
29
47
  end
30
48
 
31
- opts.on("-f", "--from from", "From address") do |v|
32
- config[:from] = v
49
+ opts.on("-r", "--recipients filename", "Recipients file name") do |v|
50
+ $recipients = IO.readlines(v).map {|l| l =~ /(.*)(\r\n|\n)$/; $1}
33
51
  end
34
52
 
35
- opts.on("-u", "--user username", "User name (for authentication)") do |v|
36
- config[:user] = v
53
+ opts.on("-c", "--content filename", "Content file name") do |v|
54
+ parse_file(v)
37
55
  end
38
56
 
39
- opts.on("-p", "--password password", "Password (for authentication)") do |v|
40
- config[:password] = v
57
+ opts.on("-s", "--subject subject", "Subject line") do |v|
58
+ $headers[:subject] = v
41
59
  end
42
60
 
43
- opts.on("-a", "--authentication type", "Authentication type") do |v|
44
- config[:authentication] = v
61
+ opts.on("-f", "--from from", "From address") do |v|
62
+ $sender = v
45
63
  end
46
64
 
47
65
  opts.on("-m", "--mime type", "MIME type") do |v|
48
- config[:content_type] = v
66
+ $headers[:content_type] = v
49
67
  end
50
68
 
51
69
  # No argument, shows at tail. This will print an options summary.
@@ -68,24 +86,17 @@ begin
68
86
  opts.parse! ARGV
69
87
  rescue => e
70
88
  puts e.message
89
+ puts e.backtrace.first
71
90
  exit
72
91
  end
73
92
 
74
- unless config[:recipients_file] && config[:content_file]
93
+ unless $content
75
94
  puts opts
76
95
  exit
77
96
  end
78
97
 
79
- require 'bulkmail'
80
-
81
- BulkMail.server_settings[:address] = config[:host] if config[:host]
82
- BulkMail.server_settings[:user_name] = config[:user] if config[:user]
83
- BulkMail.server_settings[:password] = config[:password] if config[:password]
84
- BulkMail.server_settings[:authentication] = config[:authentication].to_sym if config[:authentication]
85
-
86
- p BulkMail.server_settings
98
+ trap('INT') {exit}
87
99
 
88
- job = BulkMail.send(config)
89
- trap('INT') {job.thread.exit;}
90
- job.thread.join
91
- puts "Message sent to #{job.delivered} of #{job.total} recipients."
100
+ puts "Please hold on..."
101
+ $sender ||= $headers['From']
102
+ BulkMail.send_bulk($sender, $recipients, $content, $headers)
@@ -0,0 +1,155 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: Array</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">Array</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/bulkmail_rb.html">
59
+ lib/bulkmail.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ Object
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+
82
+
83
+ </div>
84
+
85
+ <div id="method-list">
86
+ <h3 class="section-bar">Methods</h3>
87
+
88
+ <div class="name-list">
89
+ <a href="#M000007">split</a>&nbsp;&nbsp;
90
+ </div>
91
+ </div>
92
+
93
+ </div>
94
+
95
+
96
+ <!-- if includes -->
97
+
98
+ <div id="section">
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+ <!-- if method_list -->
108
+ <div id="methods">
109
+ <h3 class="section-bar">Public Instance methods</h3>
110
+
111
+ <div id="method-M000007" class="method-detail">
112
+ <a name="M000007"></a>
113
+
114
+ <div class="method-heading">
115
+ <a href="#M000007" class="method-signature">
116
+ <span class="method-name">split</span><span class="method-args">(batch)</span>
117
+ </a>
118
+ </div>
119
+
120
+ <div class="method-description">
121
+ <p>
122
+ Splits the array into smaller arrays of fixed size
123
+ </p>
124
+ <p><a class="source-toggle" href="#"
125
+ onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
126
+ <div class="method-source-code" id="M000007-source">
127
+ <pre>
128
+ <span class="ruby-comment cmt"># File lib/bulkmail.rb, line 27</span>
129
+ 27: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">split</span>(<span class="ruby-identifier">batch</span>)
130
+ 28: <span class="ruby-identifier">result</span> = []
131
+ 29: <span class="ruby-identifier">idx</span> = <span class="ruby-value">0</span>
132
+ 30: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">idx</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">size</span>
133
+ 31: <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">slice</span>(<span class="ruby-identifier">idx</span>, <span class="ruby-identifier">batch</span>)
134
+ 32: <span class="ruby-identifier">idx</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">batch</span>
135
+ 33: <span class="ruby-keyword kw">end</span>
136
+ 34: <span class="ruby-identifier">result</span>
137
+ 35: <span class="ruby-keyword kw">end</span>
138
+ </pre>
139
+ </div>
140
+ </div>
141
+ </div>
142
+
143
+
144
+ </div>
145
+
146
+
147
+ </div>
148
+
149
+
150
+ <div id="validator-badges">
151
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
152
+ </div>
153
+
154
+ </body>
155
+ </html>
@@ -0,0 +1,310 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: BulkMail</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">BulkMail</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/bulkmail_rb.html">
59
+ lib/bulkmail.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ Object
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+
82
+
83
+ </div>
84
+
85
+ <div id="method-list">
86
+ <h3 class="section-bar">Methods</h3>
87
+
88
+ <div class="name-list">
89
+ <a href="#M000002">format_headers</a>&nbsp;&nbsp;
90
+ <a href="#M000005">send_bulk</a>&nbsp;&nbsp;
91
+ <a href="#M000004">send_message</a>&nbsp;&nbsp;
92
+ <a href="#M000001">server_settings</a>&nbsp;&nbsp;
93
+ <a href="#M000003">smtp</a>&nbsp;&nbsp;
94
+ </div>
95
+ </div>
96
+
97
+ </div>
98
+
99
+
100
+ <!-- if includes -->
101
+
102
+ <div id="section">
103
+
104
+
105
+ <div id="constants-list">
106
+ <h3 class="section-bar">Constants</h3>
107
+
108
+ <div class="name-list">
109
+ <table summary="Constants">
110
+ <tr class="top-aligned-row context-row">
111
+ <td class="context-item-name">LINE_BREAK</td>
112
+ <td>=</td>
113
+ <td class="context-item-value">&quot;\r\n&quot;</td>
114
+ </tr>
115
+ <tr class="top-aligned-row context-row">
116
+ <td class="context-item-name">HEADER_FMT</td>
117
+ <td>=</td>
118
+ <td class="context-item-value">&quot;%s: %s\r\n&quot;.freeze</td>
119
+ </tr>
120
+ </table>
121
+ </div>
122
+ </div>
123
+
124
+
125
+
126
+
127
+
128
+
129
+ <!-- if method_list -->
130
+ <div id="methods">
131
+ <h3 class="section-bar">Public Class methods</h3>
132
+
133
+ <div id="method-M000002" class="method-detail">
134
+ <a name="M000002"></a>
135
+
136
+ <div class="method-heading">
137
+ <a href="#M000002" class="method-signature">
138
+ <span class="method-name">format_headers</span><span class="method-args">(headers)</span>
139
+ </a>
140
+ </div>
141
+
142
+ <div class="method-description">
143
+ <p>
144
+ Returns the message headers formatted
145
+ </p>
146
+ <p><a class="source-toggle" href="#"
147
+ onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
148
+ <div class="method-source-code" id="M000002-source">
149
+ <pre>
150
+ <span class="ruby-comment cmt"># File lib/bulkmail.rb, line 57</span>
151
+ 57: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">format_headers</span>(<span class="ruby-identifier">headers</span>)
152
+ 58: <span class="ruby-identifier">headers</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-value str">''</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span>, <span class="ruby-identifier">kv</span><span class="ruby-operator">|</span>
153
+ 59: <span class="ruby-identifier">m</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">HEADER_FMT</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">kv</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">to_header</span>, <span class="ruby-identifier">kv</span>[<span class="ruby-value">1</span>]])
154
+ 60: <span class="ruby-keyword kw">end</span>
155
+ 61: <span class="ruby-keyword kw">end</span>
156
+ </pre>
157
+ </div>
158
+ </div>
159
+ </div>
160
+
161
+ <div id="method-M000005" class="method-detail">
162
+ <a name="M000005"></a>
163
+
164
+ <div class="method-heading">
165
+ <a href="#M000005" class="method-signature">
166
+ <span class="method-name">send_bulk</span><span class="method-args">(sender, recipients, body, headers)</span>
167
+ </a>
168
+ </div>
169
+
170
+ <div class="method-description">
171
+ <p>
172
+ Sends bulk mail to a large number of recipients.
173
+ </p>
174
+ <p><a class="source-toggle" href="#"
175
+ onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
176
+ <div class="method-source-code" id="M000005-source">
177
+ <pre>
178
+ <span class="ruby-comment cmt"># File lib/bulkmail.rb, line 89</span>
179
+ 89: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">send_bulk</span>(<span class="ruby-identifier">sender</span>, <span class="ruby-identifier">recipients</span>, <span class="ruby-identifier">body</span>, <span class="ruby-identifier">headers</span>)
180
+ 90: <span class="ruby-identifier">failed</span> = []
181
+ 91: <span class="ruby-identifier">succeeded</span> = []
182
+ 92: <span class="ruby-identifier">headers</span>[<span class="ruby-identifier">:from</span>] = <span class="ruby-identifier">headers</span>[<span class="ruby-identifier">:to</span>] = <span class="ruby-identifier">sender</span>
183
+ 93: <span class="ruby-identifier">recipients</span> = <span class="ruby-identifier">recipients</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">email_addr</span>}.<span class="ruby-identifier">compact</span>
184
+ 94: <span class="ruby-identifier">recipients</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value">10</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">list</span><span class="ruby-operator">|</span>
185
+ 95: <span class="ruby-keyword kw">begin</span>
186
+ 96: <span class="ruby-identifier">smtp</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">send_message</span>(<span class="ruby-identifier">s</span>, <span class="ruby-identifier">sender</span>.<span class="ruby-identifier">email_addr</span>, <span class="ruby-identifier">list</span>, <span class="ruby-identifier">body</span>, <span class="ruby-identifier">headers</span>)}
187
+ 97: <span class="ruby-identifier">succeeded</span>.<span class="ruby-identifier">concat</span> <span class="ruby-identifier">list</span>
188
+ 98: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Sent message to #{list.join(', ')}&quot;</span>
189
+ 99: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
190
+ 100: <span class="ruby-identifier">failed</span>.<span class="ruby-identifier">concat</span> <span class="ruby-identifier">list</span>
191
+ 101: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Failed to send to #{list.join(', ')}: #{e.message}\r\n#{e.backtrace.first}&quot;</span>
192
+ 102: <span class="ruby-keyword kw">end</span>
193
+ 103: <span class="ruby-keyword kw">end</span>
194
+ 104: <span class="ruby-comment cmt"># log failed addresses</span>
195
+ 105: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">failed</span>.<span class="ruby-identifier">empty?</span>
196
+ 106: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-value str">'failed.bulkmail'</span>, <span class="ruby-value str">'w'</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">failed</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">l</span><span class="ruby-operator">|</span><span class="ruby-identifier">f</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">l</span>}}
197
+ 107: <span class="ruby-keyword kw">end</span>
198
+ 108: <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Message to sent to #{succeeded.size} of #{recipients.size} recipients&quot;</span>
199
+ 109: <span class="ruby-keyword kw">end</span>
200
+ </pre>
201
+ </div>
202
+ </div>
203
+ </div>
204
+
205
+ <div id="method-M000004" class="method-detail">
206
+ <a name="M000004"></a>
207
+
208
+ <div class="method-heading">
209
+ <a href="#M000004" class="method-signature">
210
+ <span class="method-name">send_message</span><span class="method-args">(smtp, from, to, body, headers = nil)</span>
211
+ </a>
212
+ </div>
213
+
214
+ <div class="method-description">
215
+ <p>
216
+ Sends an email
217
+ </p>
218
+ <p><a class="source-toggle" href="#"
219
+ onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
220
+ <div class="method-source-code" id="M000004-source">
221
+ <pre>
222
+ <span class="ruby-comment cmt"># File lib/bulkmail.rb, line 77</span>
223
+ 77: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">send_message</span>(<span class="ruby-identifier">smtp</span>, <span class="ruby-identifier">from</span>, <span class="ruby-identifier">to</span>, <span class="ruby-identifier">body</span>, <span class="ruby-identifier">headers</span> = <span class="ruby-keyword kw">nil</span>)
224
+ 78: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">headers</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">headers</span>.<span class="ruby-identifier">empty?</span>
225
+ 79: <span class="ruby-identifier">msg</span> = <span class="ruby-identifier">format_headers</span>(<span class="ruby-identifier">headers</span>)
226
+ 80: <span class="ruby-keyword kw">else</span>
227
+ 81: <span class="ruby-identifier">msg</span> = <span class="ruby-constant">LINE_BREAK</span>
228
+ 82: <span class="ruby-keyword kw">end</span>
229
+ 83: <span class="ruby-identifier">msg</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">LINE_BREAK</span>
230
+ 84: <span class="ruby-identifier">msg</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">body</span>
231
+ 85: <span class="ruby-identifier">smtp</span>.<span class="ruby-identifier">send_message</span> <span class="ruby-identifier">msg</span>, <span class="ruby-identifier">from</span>, <span class="ruby-identifier">to</span>
232
+ 86: <span class="ruby-keyword kw">end</span>
233
+ </pre>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ <div id="method-M000001" class="method-detail">
239
+ <a name="M000001"></a>
240
+
241
+ <div class="method-heading">
242
+ <a href="#M000001" class="method-signature">
243
+ <span class="method-name">server_settings</span><span class="method-args">()</span>
244
+ </a>
245
+ </div>
246
+
247
+ <div class="method-description">
248
+ <p>
249
+ Returns the <a href="BulkMail.html#M000001">server_settings</a> hash
250
+ </p>
251
+ <p><a class="source-toggle" href="#"
252
+ onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
253
+ <div class="method-source-code" id="M000001-source">
254
+ <pre>
255
+ <span class="ruby-comment cmt"># File lib/bulkmail.rb, line 49</span>
256
+ 49: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">server_settings</span>
257
+ 50: <span class="ruby-ivar">@@server_settings</span>
258
+ 51: <span class="ruby-keyword kw">end</span>
259
+ </pre>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ <div id="method-M000003" class="method-detail">
265
+ <a name="M000003"></a>
266
+
267
+ <div class="method-heading">
268
+ <a href="#M000003" class="method-signature">
269
+ <span class="method-name">smtp</span><span class="method-args">() {|smtp| ...}</span>
270
+ </a>
271
+ </div>
272
+
273
+ <div class="method-description">
274
+ <p>
275
+ Starts an SMTP session and yields
276
+ </p>
277
+ <p><a class="source-toggle" href="#"
278
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
279
+ <div class="method-source-code" id="M000003-source">
280
+ <pre>
281
+ <span class="ruby-comment cmt"># File lib/bulkmail.rb, line 64</span>
282
+ 64: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">smtp</span>
283
+ 65: <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SMTP</span>.<span class="ruby-identifier">start</span>(
284
+ 66: <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:host</span>],
285
+ 67: <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:port</span>],
286
+ 68: <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:helo_domain</span>] <span class="ruby-operator">||</span> <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:host</span>],
287
+ 69: <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:user</span>],
288
+ 70: <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:password</span>],
289
+ 71: <span class="ruby-ivar">@@server_settings</span>[<span class="ruby-identifier">:auth</span>]) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">smtp</span><span class="ruby-operator">|</span>
290
+ 72: <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">smtp</span>
291
+ 73: <span class="ruby-keyword kw">end</span>
292
+ 74: <span class="ruby-keyword kw">end</span>
293
+ </pre>
294
+ </div>
295
+ </div>
296
+ </div>
297
+
298
+
299
+ </div>
300
+
301
+
302
+ </div>
303
+
304
+
305
+ <div id="validator-badges">
306
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
307
+ </div>
308
+
309
+ </body>
310
+ </html>