1
1
# frozen_string_literal: true
2
2
require 'mail/smtp_envelope'
3
+ require 'mail/utilities'
3
4
4
5
module Mail
5
6
# == Sending Email with SMTP
@@ -23,6 +24,7 @@ module Mail
23
24
# :password => '<password>',
24
25
# :authentication => 'plain',
25
26
# :enable_starttls_auto => true }
27
+ #
26
28
# end
27
29
#
28
30
# === Sending via GMail
@@ -35,8 +37,20 @@ module Mail
35
37
# :password => '<password>',
36
38
# :authentication => 'plain',
37
39
# :enable_starttls_auto => true }
40
+ #
41
+ # # ...or using the url-attribute (note the URL-encoded userinfo):
42
+ # delivery_method :smtp,
43
+ # { :url => 'smtps://user%40gmail.com:[email protected] ' }
38
44
# end
39
45
#
46
+ # === Sending via Fastmail
47
+ #
48
+ # Mail.defaults do
49
+ # delivery_method :smtp,
50
+ # { :url => 'smtps://user%40fastmail.fm:[email protected] ' }
51
+ # end
52
+ #
53
+ #
40
54
# === Certificate verification
41
55
#
42
56
# When using TLS, some mail servers provide certificates that are self-signed
@@ -74,6 +88,68 @@ module Mail
74
88
#
75
89
# mail.deliver!
76
90
class SMTP
91
+ class UrlResolver
92
+
93
+ DEFAULTS = {
94
+ "smtp" => {
95
+ :address => 'localhost' ,
96
+ :port => 25 ,
97
+ :domain => 'localhost.localdomain' ,
98
+ :enable_starttls_auto => true
99
+ } ,
100
+ "smtps" => {
101
+ :address => 'localhost' ,
102
+ :port => 465 ,
103
+ :domain => 'localhost.localdomain' ,
104
+ :enable_starttls_auto => false ,
105
+ :tls => true
106
+ }
107
+ }
108
+
109
+ def initialize ( url )
110
+ @uri = url . is_a? ( URI ) ? url : uri_parser . parse ( url )
111
+ unless DEFAULTS . has_key? ( @uri . scheme )
112
+ raise ArgumentError , "#{ url } is not a valid SMTP-url. Required format: smtp(s)://host?domain=sender.org"
113
+ end
114
+ @query = uri . query
115
+ end
116
+
117
+ def to_hash
118
+ config = raw_config
119
+ config . map { |key , value | config [ key ] = uri_parser . unescape ( value ) if value . is_a? String }
120
+ config
121
+ end
122
+
123
+ private
124
+ attr_reader :uri
125
+
126
+ def raw_config
127
+ scheme_defaults . merge ( query_hash ) . merge ( {
128
+ :address => uri . host ,
129
+ :port => uri . port ,
130
+ :user_name => uri . user ,
131
+ :password => uri . password
132
+ } . delete_if { |_key , value | Utilities . blank? ( value ) } )
133
+ end
134
+
135
+ def uri_parser
136
+ Utilities . uri_parser
137
+ end
138
+
139
+ def query_hash
140
+ @query_hash = begin
141
+ result = Hash [ ( @query || "" ) . split ( "&" ) . map { |pair | k , v = pair . split ( "=" ) ; [ k . to_sym , v ] } ]
142
+ result [ :open_timeout ] &&= result [ :open_timeout ] . to_i
143
+ result [ :read_timeout ] &&= result [ :read_timeout ] . to_i
144
+ result
145
+ end
146
+ end
147
+
148
+ def scheme_defaults
149
+ DEFAULTS [ uri . scheme ]
150
+ end
151
+ end
152
+
77
153
attr_accessor :settings
78
154
79
155
DEFAULTS = {
@@ -92,8 +168,13 @@ class SMTP
92
168
:read_timeout => nil
93
169
}
94
170
95
- def initialize ( values )
96
- self . settings = DEFAULTS . merge ( values )
171
+ def initialize ( config )
172
+ settings = DEFAULTS
173
+
174
+ if config . has_key? ( :url )
175
+ settings = settings . merge ( UrlResolver . new ( config . delete ( :url ) ) . to_hash )
176
+ end
177
+ self . settings = settings . merge ( config )
97
178
end
98
179
99
180
def deliver! ( mail )
0 commit comments