sisimai 4.25.3-java → 4.25.4-java
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sisimai might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +1 -0
- data/ANALYTICAL-PRECISION +2 -4
- data/CONTRIBUTING +4 -0
- data/ChangeLog.md +39 -0
- data/Developers.mk +1 -72
- data/Makefile +4 -0
- data/README-JA.md +3 -0
- data/README.md +5 -2
- data/lib/sisimai.rb +4 -3
- data/lib/sisimai/arf.rb +6 -6
- data/lib/sisimai/bite.rb +8 -3
- data/lib/sisimai/bite/email.rb +7 -50
- data/lib/sisimai/bite/json.rb +5 -25
- data/lib/sisimai/data.rb +1 -1
- data/lib/sisimai/lhost.rb +101 -0
- data/lib/sisimai/{bite/email → lhost}/activehunter.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/amavis.rb +9 -9
- data/lib/sisimai/lhost/amazonses.rb +403 -0
- data/lib/sisimai/{bite/email → lhost}/amazonworkmail.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/aol.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/apachejames.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/bigfoot.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/biglobe.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/courier.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/domino.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/einsundeins.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/exchange2003.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/exchange2007.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/exim.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/ezweb.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/facebook.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/fml.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/gmx.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/google.rb +14 -14
- data/lib/sisimai/{bite/email → lhost}/gsuite.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/imailserver.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/interscanmss.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/kddi.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/mailfoundry.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/mailmarshalsmtp.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/mailru.rb +11 -11
- data/lib/sisimai/{bite/email → lhost}/mcafee.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/messagelabs.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/messagingserver.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/mfilter.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/mxlogic.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/notes.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/office365.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/opensmtpd.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/outlook.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/postfix.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/qmail.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/receivingses.rb +11 -11
- data/lib/sisimai/{bite/email → lhost}/sendgrid.rb +120 -11
- data/lib/sisimai/{bite/email → lhost}/sendmail.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/surfcontrol.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/userdefined.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/v5sendmail.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/verizon.rb +11 -11
- data/lib/sisimai/{bite/email → lhost}/x1.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/x2.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/x3.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/x4.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/x5.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/yahoo.rb +9 -9
- data/lib/sisimai/{bite/email → lhost}/yandex.rb +10 -10
- data/lib/sisimai/{bite/email → lhost}/zoho.rb +10 -10
- data/lib/sisimai/mda.rb +1 -1
- data/lib/sisimai/message.rb +535 -28
- data/lib/sisimai/message/email.rb +3 -454
- data/lib/sisimai/message/json.rb +3 -177
- data/lib/sisimai/order.rb +238 -4
- data/lib/sisimai/order/email.rb +5 -190
- data/lib/sisimai/order/json.rb +3 -39
- data/lib/sisimai/reason.rb +1 -1
- data/lib/sisimai/reason/norelaying.rb +1 -1
- data/lib/sisimai/reason/userunknown.rb +1 -1
- data/lib/sisimai/reason/virusdetected.rb +1 -0
- data/lib/sisimai/rfc1894.rb +2 -2
- data/lib/sisimai/rfc3464.rb +13 -13
- data/lib/sisimai/rfc3834.rb +3 -3
- data/lib/sisimai/rfc5322.rb +1 -1
- data/lib/sisimai/rhost.rb +5 -4
- data/lib/sisimai/rhost/exchangeonline.rb +1 -1
- data/lib/sisimai/rhost/franceptt.rb +1 -1
- data/lib/sisimai/rhost/godaddy.rb +1 -1
- data/lib/sisimai/rhost/iua.rb +39 -0
- data/lib/sisimai/version.rb +1 -1
- data/set-of-emails/README.md +0 -1
- data/set-of-emails/maildir/bsd/email-gsuite-13.eml +261 -0
- data/set-of-emails/maildir/bsd/email-postfix-62.eml +105 -0
- data/set-of-emails/maildir/bsd/email-postfix-63.eml +85 -0
- data/set-of-emails/maildir/bsd/rhost-iua-01.eml +70 -0
- metadata +75 -94
- data/fig/sisimai-architecture.png +0 -0
- data/lib/sisimai/bite/email/amazonses.rb +0 -186
- data/lib/sisimai/bite/json/amazonses.rb +0 -242
- data/lib/sisimai/bite/json/sendgrid.rb +0 -123
- data/set-of-emails/jsonobj/json-amazonses-01.json +0 -1
- data/set-of-emails/jsonobj/json-amazonses-02.json +0 -11
- data/set-of-emails/jsonobj/json-amazonses-03.json +0 -1
- data/set-of-emails/jsonobj/json-amazonses-04.json +0 -1
- data/set-of-emails/jsonobj/json-amazonses-05.json +0 -1
- data/set-of-emails/jsonobj/json-amazonses-06.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-01.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-02.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-03.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-04.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-05.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-06.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-07.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-08.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-09.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-10.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-11.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-12.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-13.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-14.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-15.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-16.json +0 -1
- data/set-of-emails/jsonobj/json-sendgrid-17.json +0 -1
data/lib/sisimai/message/json.rb
CHANGED
@@ -4,13 +4,7 @@ module Sisimai
|
|
4
4
|
# retrieved from some Cloud Email Deliveries API to data structure.
|
5
5
|
class JSON
|
6
6
|
# Imported from p5-Sisimail/lib/Sisimai/Message/JSON.pm
|
7
|
-
require 'sisimai/
|
8
|
-
|
9
|
-
@@ToBeLoaded = []
|
10
|
-
@@TryOnFirst = []
|
11
|
-
|
12
|
-
DefaultSet = Sisimai::Order::JSON.default
|
13
|
-
ObjectKeys = Sisimai::Order::JSON.by('keyname')
|
7
|
+
require 'sisimai/message'
|
14
8
|
|
15
9
|
# Make data structure from decoded JSON object
|
16
10
|
# @param [Hash] argvs Bounce object
|
@@ -20,176 +14,8 @@ module Sisimai
|
|
20
14
|
# @options argvs [Code] hook Reference to callback method
|
21
15
|
# @return [Hash] Resolved data structure
|
22
16
|
def self.make(argvs)
|
23
|
-
|
24
|
-
|
25
|
-
'from' => '', # From_ line
|
26
|
-
'header' => {}, # Email header
|
27
|
-
'rfc822' => '', # Original message part
|
28
|
-
'ds' => [], # Parsed data, Delivery Status
|
29
|
-
'catch' => nil, # Data parsed by callback method
|
30
|
-
}
|
31
|
-
methodargv = {
|
32
|
-
'load' => argvs['load'] || [],
|
33
|
-
'order' => argvs['order'] || []
|
34
|
-
}
|
35
|
-
@@ToBeLoaded = Sisimai::Message::JSON.load(methodargv)
|
36
|
-
@@TryOnFirst = Sisimai::Message::JSON.makeorder(argvs['data'])
|
37
|
-
|
38
|
-
# Rewrite message body for detecting the bounce reason
|
39
|
-
methodargv = { 'hook' => hookmethod, 'json' => argvs['data'] }
|
40
|
-
return nil unless bouncedata = Sisimai::Message::JSON.parse(methodargv)
|
41
|
-
return nil if bouncedata.empty?
|
42
|
-
|
43
|
-
processing['ds'] = bouncedata['ds']
|
44
|
-
processing['catch'] = bouncedata['catch']
|
45
|
-
processing['rfc822'] = bouncedata['rfc822']
|
46
|
-
return processing
|
47
|
-
end
|
48
|
-
|
49
|
-
# Load MTA(JSON) modules which specified at 'order' and 'load' in the argument
|
50
|
-
# @param [Hash] argvs Module information to be loaded
|
51
|
-
# @options argvs [Array] load User defined MTA(JSON) module list
|
52
|
-
# @options argvs [Array] order The order of MTA(JSON) modules
|
53
|
-
# @return [Array] Module list
|
54
|
-
# @since v4.20.0
|
55
|
-
def self.load(argvs)
|
56
|
-
modulelist = []
|
57
|
-
tobeloaded = []
|
58
|
-
|
59
|
-
%w[load order].each do |e|
|
60
|
-
# The order of MTA(JSON) modules specified by user
|
61
|
-
next unless argvs.key?(e)
|
62
|
-
next unless argvs[e].is_a? Array
|
63
|
-
next if argvs[e].empty?
|
64
|
-
|
65
|
-
modulelist += argvs['order'] if e == 'order'
|
66
|
-
next unless e == 'load'
|
67
|
-
|
68
|
-
# Load user defined MTA(JSON) module
|
69
|
-
argvs['load'].each do |v|
|
70
|
-
# Load user defined MTA(JSON) module
|
71
|
-
begin
|
72
|
-
require v.to_s.gsub('::', '/').downcase
|
73
|
-
rescue LoadError
|
74
|
-
warn ' ***warning: Failed to load ' << v
|
75
|
-
next
|
76
|
-
end
|
77
|
-
tobeloaded << v
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
modulelist.each do |e|
|
82
|
-
# Append the custom order of MTA(JSON) modules
|
83
|
-
next if tobeloaded.index(e)
|
84
|
-
tobeloaded << e
|
85
|
-
end
|
86
|
-
|
87
|
-
return tobeloaded
|
88
|
-
end
|
89
|
-
|
90
|
-
# Check the decoded JSON strucutre for detecting MTA(JSON) modules and
|
91
|
-
# returns the order of modules to be called.
|
92
|
-
# @param [Hash] heads Decoded JSON object
|
93
|
-
# @return [Array] Order of MTA(JSON) modules
|
94
|
-
def self.makeorder(argvs)
|
95
|
-
return [] unless argvs
|
96
|
-
return [] if argvs.empty?
|
97
|
-
order = []
|
98
|
-
|
99
|
-
# Seek some key names from given argument
|
100
|
-
ObjectKeys.each_key do |e|
|
101
|
-
# Get MTA(JSON) module list matched with a specified key
|
102
|
-
next unless argvs.key?(e)
|
103
|
-
order += ObjectKeys[e] # Matched and push it into the order list
|
104
|
-
break
|
105
|
-
end
|
106
|
-
return order
|
107
|
-
end
|
108
|
-
|
109
|
-
# Parse bounce object with each MTA(JSON) module
|
110
|
-
# @param [Hash] argvs Processing message entity.
|
111
|
-
# @param options argvs [Hash] json Decoded bounce object
|
112
|
-
# @param options argvs [Proc] hook Hook method to be called
|
113
|
-
# @return [Hash] Parsed and structured bounce mails
|
114
|
-
def self.parse(argvs)
|
115
|
-
bouncedata = argvs['json'] || {}
|
116
|
-
hookmethod = argvs['hook'] || nil
|
117
|
-
havecaught = nil
|
118
|
-
haveloaded = {}
|
119
|
-
hasadapted = nil
|
120
|
-
|
121
|
-
# Call the hook method
|
122
|
-
if hookmethod.is_a? Proc
|
123
|
-
# Execute hook method
|
124
|
-
begin
|
125
|
-
p = {
|
126
|
-
'datasrc' => 'json',
|
127
|
-
'headers' => nil,
|
128
|
-
'message' => nil,
|
129
|
-
'bounces' => argvs['json']
|
130
|
-
}
|
131
|
-
havecaught = hookmethod.call(p)
|
132
|
-
rescue StandardError => ce
|
133
|
-
warn ' ***warning: Something is wrong in hook method :' << ce.to_s
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
catch :ADAPTOR do
|
138
|
-
while true
|
139
|
-
# 1. User-Defined Module
|
140
|
-
# 2. MTA(JSON) Module Candidates to be tried on first
|
141
|
-
# 3. Sisimai::Bite::JSON::*
|
142
|
-
#
|
143
|
-
@@ToBeLoaded.each do |r|
|
144
|
-
# Call user defined MTA(JSON) modules
|
145
|
-
next if haveloaded[r]
|
146
|
-
begin
|
147
|
-
require r.gsub('::', '/').downcase
|
148
|
-
rescue LoadError => ce
|
149
|
-
warn ' ***warning: Failed to load ' << ce.to_s
|
150
|
-
next
|
151
|
-
end
|
152
|
-
hasadapted = Module.const_get(r).adapt(bouncedata)
|
153
|
-
haveloaded[r] = true
|
154
|
-
throw :ADAPTOR if hasadapted
|
155
|
-
end
|
156
|
-
|
157
|
-
@@TryOnFirst.each do |r|
|
158
|
-
# Try MTA(JSON) module candidates which are detected from object
|
159
|
-
# key names
|
160
|
-
next if haveloaded.key?(r)
|
161
|
-
begin
|
162
|
-
require r.gsub('::', '/').downcase
|
163
|
-
rescue LoadError => ce
|
164
|
-
warn ' ***warning: ' << ce.to_s
|
165
|
-
next
|
166
|
-
end
|
167
|
-
hasadapted = Module.const_get(r).adapt(bouncedata)
|
168
|
-
haveloaded[r] = true
|
169
|
-
throw :ADAPTOR if hasadapted
|
170
|
-
end
|
171
|
-
|
172
|
-
DefaultSet.each do |r|
|
173
|
-
# Default order of MTA(JSON) modules
|
174
|
-
next if haveloaded.key?(r)
|
175
|
-
begin
|
176
|
-
require r.gsub('::', '/').downcase
|
177
|
-
rescue => ce
|
178
|
-
warn ' ***warning: ' << ce.to_s
|
179
|
-
next
|
180
|
-
end
|
181
|
-
|
182
|
-
hasadapted = Module.const_get(r).adapt(bouncedata)
|
183
|
-
haveloaded[r] = true
|
184
|
-
throw :ADAPTOR if hasadapted
|
185
|
-
end
|
186
|
-
|
187
|
-
break # as of now, we have no sample JSON data for coding this block
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
hasadapted['catch'] = havecaught if hasadapted
|
192
|
-
return hasadapted
|
17
|
+
Sisimai::Message.warn(self.name, 'gone')
|
18
|
+
return Sisimai::Message.make(argvs)
|
193
19
|
end
|
194
20
|
|
195
21
|
end
|
data/lib/sisimai/order.rb
CHANGED
@@ -4,10 +4,244 @@ module Sisimai
|
|
4
4
|
module Order
|
5
5
|
# Imported from p5-Sisimail/lib/Sisimai/Order.pm
|
6
6
|
class << self
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
require 'sisimai/lhost'
|
8
|
+
|
9
|
+
OrderE1 = [
|
10
|
+
# These modules have many subject patterns or have MIME encoded subjects
|
11
|
+
# which is hard to code as regular expression
|
12
|
+
'Sisimai::Lhost::Exim',
|
13
|
+
'Sisimai::Lhost::Exchange2003',
|
14
|
+
].freeze
|
15
|
+
OrderE2 = [
|
16
|
+
# These modules have no MTA specific header and did not listed in the
|
17
|
+
# following subject header based regular expressions.
|
18
|
+
'Sisimai::Lhost::Exchange2007',
|
19
|
+
'Sisimai::Lhost::Facebook',
|
20
|
+
'Sisimai::Lhost::KDDI',
|
21
|
+
].freeze
|
22
|
+
OrderE3 = [
|
23
|
+
# These modules have no MTA specific header but listed in the following
|
24
|
+
# subject header based regular expressions.
|
25
|
+
'Sisimai::Lhost::Sendmail',
|
26
|
+
'Sisimai::Lhost::Postfix',
|
27
|
+
'Sisimai::Lhost::Qmail',
|
28
|
+
'Sisimai::Lhost::SendGrid',
|
29
|
+
'Sisimai::Lhost::Courier',
|
30
|
+
'Sisimai::Lhost::OpenSMTPD',
|
31
|
+
'Sisimai::Lhost::Notes',
|
32
|
+
'Sisimai::Lhost::MessagingServer',
|
33
|
+
'Sisimai::Lhost::Domino',
|
34
|
+
'Sisimai::Lhost::Bigfoot',
|
35
|
+
'Sisimai::Lhost::EinsUndEins',
|
36
|
+
'Sisimai::Lhost::MXLogic',
|
37
|
+
'Sisimai::Lhost::Amavis',
|
38
|
+
'Sisimai::Lhost::IMailServer',
|
39
|
+
'Sisimai::Lhost::X4',
|
40
|
+
].freeze
|
41
|
+
OrderE4 = [
|
42
|
+
# These modules have no MTA specific headers and there are few samples or
|
43
|
+
# too old MTA
|
44
|
+
'Sisimai::Lhost::Verizon',
|
45
|
+
'Sisimai::Lhost::InterScanMSS',
|
46
|
+
'Sisimai::Lhost::MailFoundry',
|
47
|
+
'Sisimai::Lhost::ApacheJames',
|
48
|
+
'Sisimai::Lhost::Biglobe',
|
49
|
+
'Sisimai::Lhost::EZweb',
|
50
|
+
'Sisimai::Lhost::X5',
|
51
|
+
'Sisimai::Lhost::X3',
|
52
|
+
'Sisimai::Lhost::X2',
|
53
|
+
'Sisimai::Lhost::X1',
|
54
|
+
'Sisimai::Lhost::V5sendmail',
|
55
|
+
].freeze
|
56
|
+
OrderE5 = [
|
57
|
+
# These modules have one or more MTA specific headers but other headers
|
58
|
+
# also required for detecting MTA name
|
59
|
+
'Sisimai::Lhost::Outlook',
|
60
|
+
'Sisimai::Lhost::MailRu',
|
61
|
+
'Sisimai::Lhost::MessageLabs',
|
62
|
+
'Sisimai::Lhost::MailMarshalSMTP',
|
63
|
+
'Sisimai::Lhost::MFILTER',
|
64
|
+
'Sisimai::Lhost::Google',
|
65
|
+
].freeze
|
66
|
+
OrderE9 = [
|
67
|
+
# These modules have one or more MTA specific headers
|
68
|
+
'Sisimai::Lhost::Aol',
|
69
|
+
'Sisimai::Lhost::Yahoo',
|
70
|
+
'Sisimai::Lhost::AmazonSES',
|
71
|
+
'Sisimai::Lhost::GMX',
|
72
|
+
'Sisimai::Lhost::Yandex',
|
73
|
+
'Sisimai::Lhost::Office365',
|
74
|
+
'Sisimai::Lhost::ReceivingSES',
|
75
|
+
'Sisimai::Lhost::AmazonWorkMail',
|
76
|
+
'Sisimai::Lhost::Zoho',
|
77
|
+
'Sisimai::Lhost::McAfee',
|
78
|
+
'Sisimai::Lhost::Activehunter',
|
79
|
+
'Sisimai::Lhost::SurfControl',
|
80
|
+
].freeze
|
81
|
+
|
82
|
+
OrderJ1 = [
|
83
|
+
# These modules support JSON structure
|
84
|
+
'Sisimai::Lhost::AmazonSES',
|
85
|
+
'Sisimai::Lhost::SendGrid',
|
86
|
+
].freeze
|
87
|
+
|
88
|
+
# This variable don't hold MTA name which have one or more MTA specific
|
89
|
+
# header such as X-AWS-Outgoing, X-Yandex-Uniq.
|
90
|
+
Pattern = {
|
91
|
+
'subject' => {
|
92
|
+
'delivery' => [
|
93
|
+
'Sisimai::Lhost::Exim',
|
94
|
+
'Sisimai::Lhost::Outlook',
|
95
|
+
'Sisimai::Lhost::Courier',
|
96
|
+
'Sisimai::Lhost::Domino',
|
97
|
+
'Sisimai::Lhost::OpenSMTPD',
|
98
|
+
'Sisimai::Lhost::EinsUndEins',
|
99
|
+
'Sisimai::Lhost::InterScanMSS',
|
100
|
+
'Sisimai::Lhost::MailFoundry',
|
101
|
+
'Sisimai::Lhost::X4',
|
102
|
+
'Sisimai::Lhost::X3',
|
103
|
+
'Sisimai::Lhost::X2',
|
104
|
+
'Sisimai::Lhost::Google',
|
105
|
+
],
|
106
|
+
'noti' => [
|
107
|
+
'Sisimai::Lhost::Sendmail',
|
108
|
+
'Sisimai::Lhost::Qmail',
|
109
|
+
'Sisimai::Lhost::Outlook',
|
110
|
+
'Sisimai::Lhost::Courier',
|
111
|
+
'Sisimai::Lhost::MessagingServer',
|
112
|
+
'Sisimai::Lhost::OpenSMTPD',
|
113
|
+
'Sisimai::Lhost::X4',
|
114
|
+
'Sisimai::Lhost::X3',
|
115
|
+
'Sisimai::Lhost::MFILTER',
|
116
|
+
'Sisimai::Lhost::Google',
|
117
|
+
],
|
118
|
+
'return' => [
|
119
|
+
'Sisimai::Lhost::Postfix',
|
120
|
+
'Sisimai::Lhost::Sendmail',
|
121
|
+
'Sisimai::Lhost::SendGrid',
|
122
|
+
'Sisimai::Lhost::Bigfoot',
|
123
|
+
'Sisimai::Lhost::EinsUndEins',
|
124
|
+
'Sisimai::Lhost::X1',
|
125
|
+
'Sisimai::Lhost::Biglobe',
|
126
|
+
'Sisimai::Lhost::V5sendmail',
|
127
|
+
],
|
128
|
+
'undeliver' => [
|
129
|
+
'Sisimai::Lhost::Postfix',
|
130
|
+
'Sisimai::Lhost::Office365',
|
131
|
+
'Sisimai::Lhost::Exchange2007',
|
132
|
+
'Sisimai::Lhost::Exchange2003',
|
133
|
+
'Sisimai::Lhost::SendGrid',
|
134
|
+
'Sisimai::Lhost::Notes',
|
135
|
+
'Sisimai::Lhost::Verizon',
|
136
|
+
'Sisimai::Lhost::Amavis',
|
137
|
+
'Sisimai::Lhost::IMailServer',
|
138
|
+
'Sisimai::Lhost::MailMarshalSMTP',
|
139
|
+
],
|
140
|
+
'failure' => [
|
141
|
+
'Sisimai::Lhost::Qmail',
|
142
|
+
'Sisimai::Lhost::Outlook',
|
143
|
+
'Sisimai::Lhost::MailRu',
|
144
|
+
'Sisimai::Lhost::Domino',
|
145
|
+
'Sisimai::Lhost::X4',
|
146
|
+
'Sisimai::Lhost::X2',
|
147
|
+
'Sisimai::Lhost::MFILTER',
|
148
|
+
'Sisimai::Lhost::Google',
|
149
|
+
],
|
150
|
+
'warning' => [
|
151
|
+
'Sisimai::Lhost::Postfix',
|
152
|
+
'Sisimai::Lhost::Sendmail',
|
153
|
+
'Sisimai::Lhost::Exim',
|
154
|
+
],
|
155
|
+
},
|
156
|
+
}.freeze
|
157
|
+
Skips = { 'return-path' => 1, 'x-mailer' => 1 }.freeze
|
158
|
+
|
159
|
+
# @abstract Check headers for detecting MTA module and returns the order
|
160
|
+
# of modules
|
161
|
+
# @param [Hash] heads Email header data
|
162
|
+
# @return [Array] Order of MTA modules
|
163
|
+
# @since v4.25.4
|
164
|
+
def make(heads = {})
|
165
|
+
return [] unless heads['subject']
|
166
|
+
|
167
|
+
# Try to match the value of "Subject" with patterns generated by
|
168
|
+
# Sisimai::Order->by('subject') method
|
169
|
+
order = []
|
170
|
+
title = heads['subject'].downcase
|
171
|
+
Subject.each_key do |e|
|
172
|
+
# Get MTA list from the subject header
|
173
|
+
next unless title.include?(e)
|
174
|
+
order = Subject[e]
|
175
|
+
break
|
176
|
+
end
|
177
|
+
|
178
|
+
return order
|
179
|
+
end
|
180
|
+
|
181
|
+
# @abstract Get regular expression patterns for specified field
|
182
|
+
# @param [String] group Group name for "ORDER BY"
|
183
|
+
# @return [Hash] Pattern table for the group
|
184
|
+
def by(group = '')
|
185
|
+
return {} if group.empty?
|
186
|
+
return Pattern[group] if Pattern.key?(group)
|
187
|
+
return {}
|
188
|
+
end
|
189
|
+
Subject = Sisimai::Order.by('subject').freeze
|
190
|
+
|
191
|
+
# @abstract Make default order of MTA modules to be loaded
|
192
|
+
# @return [Array] Default order list of MTA modules
|
193
|
+
def default
|
194
|
+
return Sisimai::Lhost.index.map { |e| 'Sisimai::Lhost::' << e }
|
195
|
+
end
|
196
|
+
|
197
|
+
# @abstract Make MTA module list as a spare
|
198
|
+
# @return [Array] Ordered module list
|
199
|
+
def another
|
200
|
+
rv = []
|
201
|
+
[OrderE1, OrderE2, OrderE3, OrderE4, OrderE5, OrderE9].each do |e|
|
202
|
+
rv += e
|
203
|
+
end
|
204
|
+
return rv
|
205
|
+
end
|
206
|
+
|
207
|
+
# @abstract Make email header list in each MTA module
|
208
|
+
# @return [Hash] Header list to be parsed
|
209
|
+
def headers
|
210
|
+
order = Sisimai::Lhost.heads.map { |e| 'Sisimai::Lhost::' << e }
|
211
|
+
table = {}
|
212
|
+
|
213
|
+
while e = order.shift do
|
214
|
+
# Load email headers from each MTA module
|
215
|
+
require e.gsub('::', '/').downcase
|
216
|
+
|
217
|
+
Module.const_get(e).headerlist.each do |v|
|
218
|
+
# Get header name which required each MTA module
|
219
|
+
next if Skips.key?(v)
|
220
|
+
table[v] ||= []
|
221
|
+
table[v] << e
|
222
|
+
end
|
223
|
+
end
|
224
|
+
return table
|
225
|
+
end
|
226
|
+
|
227
|
+
# @abstract Make default order of MTA(JSON) modules to be loaded
|
228
|
+
# @return [Array] Default order list of MTA(JSON) modules
|
229
|
+
# @until v4.25.5
|
230
|
+
def forjson; return OrderJ1; end
|
231
|
+
|
232
|
+
# @abstract Print warnings about an obsoleted method. This method will be
|
233
|
+
# removed at the future release of Sisimai
|
234
|
+
# @until v4.25.6
|
235
|
+
def warn(whois = '', useit = nil)
|
236
|
+
label = ' ***warning:'
|
237
|
+
methodname = caller[0][/`.*'/][1..-2]
|
238
|
+
messageset = sprintf("%s %s.%s is marked as obsoleted", label, whois, methodname)
|
239
|
+
|
240
|
+
useit ||= methodname
|
241
|
+
messageset << sprintf(" and will be removed at %s.", Sisimai::Lhost.removedat)
|
242
|
+
messageset << sprintf(" Use %s.%s instead.\n", self.name, useit) if useit != 'gone'
|
243
|
+
Kernel.warn messageset
|
244
|
+
end
|
11
245
|
|
12
246
|
end
|
13
247
|
end
|
data/lib/sisimai/order/email.rb
CHANGED
@@ -7,197 +7,12 @@ module Sisimai
|
|
7
7
|
module Email
|
8
8
|
# Imported from p5-Sisimail/lib/Sisimai/Order/Email.pm
|
9
9
|
class << self
|
10
|
-
require 'sisimai/
|
11
|
-
|
12
|
-
EngineOrder1 = [
|
13
|
-
# These modules have many subject patterns or have MIME encoded subjects
|
14
|
-
# which is hard to code as regular expression
|
15
|
-
'Sisimai::Bite::Email::Exim',
|
16
|
-
'Sisimai::Bite::Email::Exchange2003',
|
17
|
-
].freeze
|
18
|
-
EngineOrder2 = [
|
19
|
-
# These modules have no MTA specific header and did not listed in the
|
20
|
-
# following subject header based regular expressions.
|
21
|
-
'Sisimai::Bite::Email::Exchange2007',
|
22
|
-
'Sisimai::Bite::Email::Facebook',
|
23
|
-
'Sisimai::Bite::Email::KDDI',
|
24
|
-
].freeze
|
25
|
-
EngineOrder3 = [
|
26
|
-
# These modules have no MTA specific header but listed in the following
|
27
|
-
# subject header based regular expressions.
|
28
|
-
'Sisimai::Bite::Email::Sendmail',
|
29
|
-
'Sisimai::Bite::Email::Postfix',
|
30
|
-
'Sisimai::Bite::Email::Qmail',
|
31
|
-
'Sisimai::Bite::Email::SendGrid',
|
32
|
-
'Sisimai::Bite::Email::Courier',
|
33
|
-
'Sisimai::Bite::Email::OpenSMTPD',
|
34
|
-
'Sisimai::Bite::Email::Notes',
|
35
|
-
'Sisimai::Bite::Email::MessagingServer',
|
36
|
-
'Sisimai::Bite::Email::Domino',
|
37
|
-
'Sisimai::Bite::Email::Bigfoot',
|
38
|
-
'Sisimai::Bite::Email::EinsUndEins',
|
39
|
-
'Sisimai::Bite::Email::MXLogic',
|
40
|
-
'Sisimai::Bite::Email::Amavis',
|
41
|
-
'Sisimai::Bite::Email::IMailServer',
|
42
|
-
'Sisimai::Bite::Email::X4',
|
43
|
-
].freeze
|
44
|
-
EngineOrder4 = [
|
45
|
-
# These modules have no MTA specific headers and there are few samples or
|
46
|
-
# too old MTA
|
47
|
-
'Sisimai::Bite::Email::Verizon',
|
48
|
-
'Sisimai::Bite::Email::InterScanMSS',
|
49
|
-
'Sisimai::Bite::Email::MailFoundry',
|
50
|
-
'Sisimai::Bite::Email::ApacheJames',
|
51
|
-
'Sisimai::Bite::Email::Biglobe',
|
52
|
-
'Sisimai::Bite::Email::EZweb',
|
53
|
-
'Sisimai::Bite::Email::X5',
|
54
|
-
'Sisimai::Bite::Email::X3',
|
55
|
-
'Sisimai::Bite::Email::X2',
|
56
|
-
'Sisimai::Bite::Email::X1',
|
57
|
-
'Sisimai::Bite::Email::V5sendmail',
|
58
|
-
].freeze
|
59
|
-
EngineOrder5 = [
|
60
|
-
# These modules have one or more MTA specific headers but other headers
|
61
|
-
# also required for detecting MTA name
|
62
|
-
'Sisimai::Bite::Email::Outlook',
|
63
|
-
'Sisimai::Bite::Email::MailRu',
|
64
|
-
'Sisimai::Bite::Email::MessageLabs',
|
65
|
-
'Sisimai::Bite::Email::MailMarshalSMTP',
|
66
|
-
'Sisimai::Bite::Email::MFILTER',
|
67
|
-
'Sisimai::Bite::Email::Google',
|
68
|
-
].freeze
|
69
|
-
EngineOrder9 = [
|
70
|
-
# These modules have one or more MTA specific headers
|
71
|
-
'Sisimai::Bite::Email::Aol',
|
72
|
-
'Sisimai::Bite::Email::Yahoo',
|
73
|
-
'Sisimai::Bite::Email::AmazonSES',
|
74
|
-
'Sisimai::Bite::Email::GMX',
|
75
|
-
'Sisimai::Bite::Email::Yandex',
|
76
|
-
'Sisimai::Bite::Email::Office365',
|
77
|
-
'Sisimai::Bite::Email::ReceivingSES',
|
78
|
-
'Sisimai::Bite::Email::AmazonWorkMail',
|
79
|
-
'Sisimai::Bite::Email::Zoho',
|
80
|
-
'Sisimai::Bite::Email::McAfee',
|
81
|
-
'Sisimai::Bite::Email::Activehunter',
|
82
|
-
'Sisimai::Bite::Email::SurfControl',
|
83
|
-
].freeze
|
84
|
-
|
85
|
-
# This variable don't hold MTA name which have one or more MTA specific
|
86
|
-
# header such as X-AWS-Outgoing, X-Yandex-Uniq.
|
87
|
-
PatternTable = {
|
88
|
-
'subject' => {
|
89
|
-
'delivery' => [
|
90
|
-
'Sisimai::Bite::Email::Exim',
|
91
|
-
'Sisimai::Bite::Email::Outlook',
|
92
|
-
'Sisimai::Bite::Email::Courier',
|
93
|
-
'Sisimai::Bite::Email::Domino',
|
94
|
-
'Sisimai::Bite::Email::OpenSMTPD',
|
95
|
-
'Sisimai::Bite::Email::EinsUndEins',
|
96
|
-
'Sisimai::Bite::Email::InterScanMSS',
|
97
|
-
'Sisimai::Bite::Email::MailFoundry',
|
98
|
-
'Sisimai::Bite::Email::X4',
|
99
|
-
'Sisimai::Bite::Email::X3',
|
100
|
-
'Sisimai::Bite::Email::X2',
|
101
|
-
'Sisimai::Bite::Email::Google',
|
102
|
-
],
|
103
|
-
'noti' => [
|
104
|
-
'Sisimai::Bite::Email::Sendmail',
|
105
|
-
'Sisimai::Bite::Email::Qmail',
|
106
|
-
'Sisimai::Bite::Email::Outlook',
|
107
|
-
'Sisimai::Bite::Email::Courier',
|
108
|
-
'Sisimai::Bite::Email::MessagingServer',
|
109
|
-
'Sisimai::Bite::Email::OpenSMTPD',
|
110
|
-
'Sisimai::Bite::Email::X4',
|
111
|
-
'Sisimai::Bite::Email::X3',
|
112
|
-
'Sisimai::Bite::Email::MFILTER',
|
113
|
-
'Sisimai::Bite::Email::Google',
|
114
|
-
],
|
115
|
-
'return' => [
|
116
|
-
'Sisimai::Bite::Email::Postfix',
|
117
|
-
'Sisimai::Bite::Email::Sendmail',
|
118
|
-
'Sisimai::Bite::Email::SendGrid',
|
119
|
-
'Sisimai::Bite::Email::Bigfoot',
|
120
|
-
'Sisimai::Bite::Email::EinsUndEins',
|
121
|
-
'Sisimai::Bite::Email::X1',
|
122
|
-
'Sisimai::Bite::Email::Biglobe',
|
123
|
-
'Sisimai::Bite::Email::V5sendmail',
|
124
|
-
],
|
125
|
-
'undeliver' => [
|
126
|
-
'Sisimai::Bite::Email::Postfix',
|
127
|
-
'Sisimai::Bite::Email::Office365',
|
128
|
-
'Sisimai::Bite::Email::Exchange2007',
|
129
|
-
'Sisimai::Bite::Email::Exchange2003',
|
130
|
-
'Sisimai::Bite::Email::SendGrid',
|
131
|
-
'Sisimai::Bite::Email::Notes',
|
132
|
-
'Sisimai::Bite::Email::Verizon',
|
133
|
-
'Sisimai::Bite::Email::Amavis',
|
134
|
-
'Sisimai::Bite::Email::IMailServer',
|
135
|
-
'Sisimai::Bite::Email::MailMarshalSMTP',
|
136
|
-
],
|
137
|
-
'failure' => [
|
138
|
-
'Sisimai::Bite::Email::Qmail',
|
139
|
-
'Sisimai::Bite::Email::Outlook',
|
140
|
-
'Sisimai::Bite::Email::MailRu',
|
141
|
-
'Sisimai::Bite::Email::Domino',
|
142
|
-
'Sisimai::Bite::Email::X4',
|
143
|
-
'Sisimai::Bite::Email::X2',
|
144
|
-
'Sisimai::Bite::Email::MFILTER',
|
145
|
-
'Sisimai::Bite::Email::Google',
|
146
|
-
],
|
147
|
-
'warning' => [
|
148
|
-
'Sisimai::Bite::Email::Postfix',
|
149
|
-
'Sisimai::Bite::Email::Sendmail',
|
150
|
-
'Sisimai::Bite::Email::Exim',
|
151
|
-
],
|
152
|
-
},
|
153
|
-
}.freeze
|
154
|
-
Skips = { 'return-path' => 1, 'x-mailer' => 1 }.freeze
|
155
|
-
|
156
|
-
# @abstract Make default order of MTA modules to be loaded
|
157
|
-
# @return [Array] Default order list of MTA modules
|
158
|
-
def default
|
159
|
-
return Sisimai::Bite::Email.index.map { |e| 'Sisimai::Bite::Email::' << e }
|
160
|
-
end
|
161
|
-
|
162
|
-
# @abstract Get regular expression patterns for specified field
|
163
|
-
# @param [String] group Group name for "ORDER BY"
|
164
|
-
# @return [Hash] Pattern table for the group
|
165
|
-
def by(group = '')
|
166
|
-
return {} if group.empty?
|
167
|
-
return PatternTable[group] if PatternTable.key?(group)
|
168
|
-
return {}
|
169
|
-
end
|
170
|
-
|
171
|
-
# @abstract Make MTA module list as a spare
|
172
|
-
# @return [Array] Ordered module list
|
173
|
-
def another
|
174
|
-
rv = []
|
175
|
-
[EngineOrder1, EngineOrder2, EngineOrder3, EngineOrder4, EngineOrder5, EngineOrder9].each do |e|
|
176
|
-
rv += e
|
177
|
-
end
|
178
|
-
return rv
|
179
|
-
end
|
180
|
-
|
181
|
-
# @abstract Make email header list in each MTA module
|
182
|
-
# @return [Hash] Header list to be parsed
|
183
|
-
def headers
|
184
|
-
order = Sisimai::Bite::Email.heads.map { |e| 'Sisimai::Bite::Email::' << e }
|
185
|
-
table = {}
|
186
|
-
|
187
|
-
while e = order.shift do
|
188
|
-
# Load email headers from each MTA module
|
189
|
-
require e.gsub('::', '/').downcase
|
190
|
-
|
191
|
-
Module.const_get(e).headerlist.each do |v|
|
192
|
-
# Get header name which required each MTA module
|
193
|
-
next if Skips.key?(v)
|
194
|
-
table[v] ||= []
|
195
|
-
table[v] << e
|
196
|
-
end
|
197
|
-
end
|
198
|
-
return table
|
199
|
-
end
|
10
|
+
require 'sisimai/order'
|
200
11
|
|
12
|
+
def by(group); Sisimai::Order.warn; return Sisimai::Order.by(group); end
|
13
|
+
def default; Sisimai::Order.warn; return Sisimai::Order.default; end
|
14
|
+
def another; Sisimai::Order.warn; return Sisimai::Order.another; end
|
15
|
+
def headers; Sisimai::Order.warn; return Sisimai::Order.headers; end
|
201
16
|
end
|
202
17
|
end
|
203
18
|
end
|