sisimai 5.6.0-java → 5.7.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rake-test.yml +0 -4
- data/ChangeLog.md +32 -0
- data/README-JA.md +19 -16
- data/README.md +23 -21
- data/lib/sisimai/address.rb +8 -31
- data/lib/sisimai/arf.rb +3 -5
- data/lib/sisimai/fact.rb +12 -37
- data/lib/sisimai/lhost/activehunter.rb +0 -2
- data/lib/sisimai/lhost/amazonses.rb +6 -8
- data/lib/sisimai/lhost/apachejames.rb +0 -1
- data/lib/sisimai/lhost/biglobe.rb +0 -16
- data/lib/sisimai/lhost/courier.rb +5 -4
- data/lib/sisimai/lhost/deutschetelekom.rb +120 -0
- data/lib/sisimai/lhost/domino.rb +0 -3
- data/lib/sisimai/lhost/dragonfly.rb +0 -27
- data/lib/sisimai/lhost/einsundeins.rb +1 -10
- data/lib/sisimai/lhost/exchange2003.rb +4 -4
- data/lib/sisimai/lhost/exchange2007.rb +3 -4
- data/lib/sisimai/lhost/exim.rb +30 -78
- data/lib/sisimai/lhost/ezweb.rb +12 -49
- data/lib/sisimai/lhost/fml.rb +4 -29
- data/lib/sisimai/lhost/gmail.rb +0 -23
- data/lib/sisimai/lhost/gmx.rb +7 -24
- data/lib/sisimai/lhost/googlegroups.rb +3 -3
- data/lib/sisimai/lhost/googleworkspace.rb +0 -4
- data/lib/sisimai/lhost/imailserver.rb +3 -9
- data/lib/sisimai/lhost/kddi.rb +6 -20
- data/lib/sisimai/lhost/mailfoundry.rb +0 -2
- data/lib/sisimai/lhost/mailmarshal.rb +1 -3
- data/lib/sisimai/lhost/messagingserver.rb +4 -15
- data/lib/sisimai/lhost/mfilter.rb +0 -1
- data/lib/sisimai/lhost/mimecast.rb +0 -1
- data/lib/sisimai/lhost/notes.rb +1 -2
- data/lib/sisimai/lhost/opensmtpd.rb +0 -40
- data/lib/sisimai/lhost/postfix.rb +10 -11
- data/lib/sisimai/lhost/qmail.rb +14 -81
- data/lib/sisimai/lhost/sendmail.rb +4 -4
- data/lib/sisimai/lhost/trendmicro.rb +3 -3
- data/lib/sisimai/lhost/v5sendmail.rb +0 -1
- data/lib/sisimai/lhost/verizon.rb +1 -2
- data/lib/sisimai/lhost/x1.rb +1 -2
- data/lib/sisimai/lhost/x2.rb +0 -2
- data/lib/sisimai/lhost/x3.rb +4 -9
- data/lib/sisimai/lhost/x6.rb +0 -1
- data/lib/sisimai/lhost/zoho.rb +0 -12
- data/lib/sisimai/lhost.rb +38 -19
- data/lib/sisimai/message.rb +1 -1
- data/lib/sisimai/order.rb +4 -1
- data/lib/sisimai/reason/authfailure.rb +2 -2
- data/lib/sisimai/reason/contenterror.rb +2 -0
- data/lib/sisimai/reason/emailtoolarge.rb +1 -1
- data/lib/sisimai/reason/expired.rb +13 -2
- data/lib/sisimai/reason/hostunknown.rb +9 -0
- data/lib/sisimai/reason/mailboxfull.rb +3 -2
- data/lib/sisimai/reason/networkerror.rb +13 -1
- data/lib/sisimai/reason/norelaying.rb +4 -3
- data/lib/sisimai/reason/notaccept.rb +10 -3
- data/lib/sisimai/reason/notcompliantrfc.rb +1 -0
- data/lib/sisimai/reason/policyviolation.rb +6 -1
- data/lib/sisimai/reason/rejected.rb +6 -0
- data/lib/sisimai/reason/securityerror.rb +1 -0
- data/lib/sisimai/reason/suspend.rb +4 -0
- data/lib/sisimai/reason/syntaxerror.rb +1 -8
- data/lib/sisimai/reason/systemerror.rb +18 -0
- data/lib/sisimai/reason/userunknown.rb +2 -0
- data/lib/sisimai/reason.rb +7 -7
- data/lib/sisimai/rfc1123.rb +1 -1
- data/lib/sisimai/rfc1894.rb +7 -6
- data/lib/sisimai/rfc2045.rb +2 -2
- data/lib/sisimai/rfc3464/thirdparty.rb +1 -1
- data/lib/sisimai/rfc3464.rb +10 -14
- data/lib/sisimai/rfc3834.rb +3 -4
- data/lib/sisimai/rfc791.rb +3 -38
- data/lib/sisimai/rhost/microsoft.rb +4 -0
- data/lib/sisimai/rhost.rb +1 -1
- data/lib/sisimai/smtp/status.rb +23 -19
- data/lib/sisimai/string.rb +0 -12
- data/lib/sisimai/version.rb +1 -1
- data/set-of-emails/maildir/bsd/lhost-deutschetelekom-01.eml +66 -0
- data/set-of-emails/maildir/bsd/lhost-deutschetelekom-02.eml +68 -0
- data/set-of-emails/maildir/bsd/lhost-deutschetelekom-03.eml +50 -0
- data/set-of-emails/should-not-crash/p5-664-iomart-mail-filter.eml +258 -0
- data/set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet/.gitkeep +0 -0
- metadata +8 -2
data/lib/sisimai/rfc1123.rb
CHANGED
|
@@ -125,7 +125,7 @@ module Sisimai
|
|
|
125
125
|
sourcetext = sourcetext.gsub("[", " [").gsub("(", " (").gsub("<", " <") # Prefix a space character before each bracket
|
|
126
126
|
sourcetext = sourcetext.gsub("]", "] ").gsub(")", ") ").gsub(">", "> ") # Suffix a space character behind each bracket
|
|
127
127
|
sourcetext = sourcetext.gsub(":", ": ").gsub(";", "; ") # Suffix a space character behind : and ;
|
|
128
|
-
sourcetext =
|
|
128
|
+
sourcetext = sourcetext.split.join(" ")
|
|
129
129
|
|
|
130
130
|
catch :MAKELIST do
|
|
131
131
|
Sandwiched.each do |e|
|
data/lib/sisimai/rfc1894.rb
CHANGED
|
@@ -146,7 +146,7 @@ module Sisimai
|
|
|
146
146
|
return nil if argv0.empty?
|
|
147
147
|
label = Sisimai::RFC1894.label(argv0)
|
|
148
148
|
group = FieldGroup[label] || ''
|
|
149
|
-
parts = argv0.split(":", 2); parts[1] = parts[1].nil? ? "" :
|
|
149
|
+
parts = argv0.split(":", 2); parts[1] = parts[1].nil? ? "" : parts[1].split.join(" ")
|
|
150
150
|
return nil if group.empty? || CapturesOn[group].nil?
|
|
151
151
|
|
|
152
152
|
# Try to match with each pattern of Per-Message field, Per-Recipient field
|
|
@@ -157,24 +157,25 @@ module Sisimai
|
|
|
157
157
|
# - 4: Comment
|
|
158
158
|
table = [label, "", "", group, ""]
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
case group
|
|
161
|
+
when "addr", "code", "host"
|
|
161
162
|
# - Final-Recipient: RFC822; kijitora@nyaan.jp
|
|
162
163
|
# - Diagnostic-Code: SMTP; 550 5.1.1 <kijitora@example.jp>... User Unknown
|
|
163
164
|
# - Remote-MTA: DNS; mx.example.jp
|
|
164
165
|
if parts[1].include?(";")
|
|
165
166
|
# There is a valid sub type (including ";")
|
|
166
167
|
v = parts[1].split(";", 2)
|
|
167
|
-
table[1] =
|
|
168
|
-
table[2] =
|
|
168
|
+
table[1] = v[0].split.join(" ").upcase if v.size > 0
|
|
169
|
+
table[2] = v[1].split.join(" ") if v.size > 1
|
|
169
170
|
else
|
|
170
171
|
# There is no sub type like "Diagnostic-Code: 550 5.1.1 <kijitora@example.jp>..."
|
|
171
|
-
table[2] =
|
|
172
|
+
table[2] = parts[1]
|
|
172
173
|
table[1] = SubtypeSet[group] || ""
|
|
173
174
|
end
|
|
174
175
|
table[2] = table[2].downcase if group == "host"
|
|
175
176
|
table[2] = "" if table[2] =~ /\A\s+\z/
|
|
176
177
|
|
|
177
|
-
|
|
178
|
+
when "list"
|
|
178
179
|
# Action: failed
|
|
179
180
|
# Check that the value is an available value defined in "ActionList" or not.
|
|
180
181
|
# When the value is invalid, convert to an available value defined in "Correction"
|
data/lib/sisimai/rfc2045.rb
CHANGED
|
@@ -146,7 +146,7 @@ module Sisimai
|
|
|
146
146
|
return nil if block.empty?
|
|
147
147
|
|
|
148
148
|
(upperchunk, lowerchunk) = block.split("\n\n", 2)
|
|
149
|
-
return ['', ''] if upperchunk.nil? || upperchunk.empty?
|
|
149
|
+
return ['', ''] if upperchunk.nil? || upperchunk.empty? || lowerchunk.nil?
|
|
150
150
|
return ['', ''] if upperchunk.index('Content-Type').nil?
|
|
151
151
|
|
|
152
152
|
headerpart = ['', ''] # ["text/plain; charset=iso-2022-jp; ...", "quoted-printable"]
|
|
@@ -263,7 +263,7 @@ module Sisimai
|
|
|
263
263
|
# @return [String] Message body
|
|
264
264
|
def makeflat(argv0 = '', argv1 = '')
|
|
265
265
|
return "" if argv0.nil? || argv1.nil?
|
|
266
|
-
return "" if argv0.index('multipart/') == false || argv0.index('boundary=') == false
|
|
266
|
+
return "" if argv0.downcase.index('multipart/') == false || argv0.downcase.index('boundary=') == false
|
|
267
267
|
|
|
268
268
|
# Some bounce messages include lower-cased "content-type:" field such as the followings:
|
|
269
269
|
# - content-type: message/delivery-status => Content-Type: message/delivery-status
|
|
@@ -71,7 +71,7 @@ module Sisimai
|
|
|
71
71
|
fieldparts = argv1.split(":", 2)
|
|
72
72
|
xfieldname = fieldparts[0].downcase
|
|
73
73
|
xgroupname = FieldGroup[xfieldname]; return [] if xgroupname.nil?
|
|
74
|
-
xfieldlist = ["", "",
|
|
74
|
+
xfieldlist = ["", "", fieldparts[1].split.join(" "), xgroupname, "", "PowerMTA"]
|
|
75
75
|
|
|
76
76
|
# - 0: Field-Name
|
|
77
77
|
# - 1: Sub Type: RFC822, DNS, X-Unix, and so on)
|
data/lib/sisimai/rfc3464.rb
CHANGED
|
@@ -109,16 +109,12 @@ module Sisimai
|
|
|
109
109
|
if isboundary.any? { |a| e == a } then goestonext = false; break; end
|
|
110
110
|
if e.start_with?("Content-Type:")
|
|
111
111
|
# Content-Type: field in multipart/*
|
|
112
|
-
|
|
112
|
+
case
|
|
113
113
|
# Content-Type: multipart/alternative; boundary=aa00220022222222ffeebb
|
|
114
114
|
# Pick the boundary string and store it into "isboucdary"
|
|
115
|
-
isboundary << Sisimai::RFC2045.boundary(e, 0)
|
|
116
|
-
|
|
117
|
-
#
|
|
118
|
-
goestonext = false
|
|
119
|
-
else
|
|
120
|
-
# Other types: for example, text/html, image/jpg, and so on
|
|
121
|
-
goestonext = true
|
|
115
|
+
when e.include?("multipart/") then isboundary << Sisimai::RFC2045.boundary(e, 0)
|
|
116
|
+
when e.include?("text/plain") then goestonext = false
|
|
117
|
+
else goestonext = true # Other types: for example, text/html, image/jpg, and so on
|
|
122
118
|
end
|
|
123
119
|
break
|
|
124
120
|
end
|
|
@@ -145,7 +141,8 @@ module Sisimai
|
|
|
145
141
|
next unless o = Sisimai::RFC1894.field(e)
|
|
146
142
|
v = dscontents[-1]
|
|
147
143
|
|
|
148
|
-
|
|
144
|
+
case o[3]
|
|
145
|
+
when "addr"
|
|
149
146
|
# Final-Recipient: rfc822; kijitora@example.jp
|
|
150
147
|
# X-Actual-Recipient: rfc822; kijitora@example.co.jp
|
|
151
148
|
if o[0] == "final-recipient"
|
|
@@ -165,7 +162,7 @@ module Sisimai
|
|
|
165
162
|
# X-Actual-Recipient: rfc822; kijitora@example.co.jp
|
|
166
163
|
v["alias"] = o[2]
|
|
167
164
|
end
|
|
168
|
-
|
|
165
|
+
when "code"
|
|
169
166
|
# Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
|
|
170
167
|
v["spec"] = o[1]
|
|
171
168
|
v["diagnosis"] = o[2]
|
|
@@ -212,7 +209,7 @@ module Sisimai
|
|
|
212
209
|
# Diagnostic-Code: SMTP; 550-5.7.26 The MAIL FROM domain [email.example.jp]
|
|
213
210
|
# has an SPF record with a hard fail
|
|
214
211
|
next if e.start_with?(" ") == false
|
|
215
|
-
v["diagnosis"] += "
|
|
212
|
+
v["diagnosis"] += " " + e
|
|
216
213
|
end
|
|
217
214
|
end
|
|
218
215
|
end
|
|
@@ -232,7 +229,7 @@ module Sisimai
|
|
|
232
229
|
|
|
233
230
|
if beforemesg != ""
|
|
234
231
|
# Pick some values of $dscontents from the string before StartingOf[:message]
|
|
235
|
-
beforemesg =
|
|
232
|
+
beforemesg = beforemesg.split.join(" ")
|
|
236
233
|
alternates["command"] = Sisimai::SMTP::Command.find(beforemesg)
|
|
237
234
|
alternates["replycode"] = Sisimai::SMTP::Reply.find(beforemesg, dscontents[0]["status"])
|
|
238
235
|
alternates["status"] = Sisimai::SMTP::Status.find(beforemesg, alternates["replycode"])
|
|
@@ -242,7 +239,6 @@ module Sisimai
|
|
|
242
239
|
dscontents.each do |e|
|
|
243
240
|
# Set default values stored in "permessage" if each value in "dscontents" is empty.
|
|
244
241
|
permessage.each_key { |a| e[a] ||= permessage[a] || '' }
|
|
245
|
-
e["diagnosis"] = Sisimai::String.sweep(e["diagnosis"])
|
|
246
242
|
lowercased = e["diagnosis"].downcase
|
|
247
243
|
|
|
248
244
|
if recipients == 1
|
|
@@ -254,7 +250,7 @@ module Sisimai
|
|
|
254
250
|
else
|
|
255
251
|
# The value of e["diagnosis"] is not contained in $beforemesg
|
|
256
252
|
# There may be an important error message in $beforemesg
|
|
257
|
-
e["diagnosis"] =
|
|
253
|
+
e["diagnosis"] = sprintf("%s %s", beforemesg, e["diagnosis"])
|
|
258
254
|
end
|
|
259
255
|
end
|
|
260
256
|
e["command"] = Sisimai::SMTP::Command.find(e["diagnosis"])
|
data/lib/sisimai/rfc3834.rb
CHANGED
|
@@ -116,8 +116,7 @@ module Sisimai
|
|
|
116
116
|
break if haveloaded >= maxmsgline
|
|
117
117
|
end
|
|
118
118
|
v['diagnosis'] ||= mhead['subject']
|
|
119
|
-
v['
|
|
120
|
-
v['reason'] = 'vacation'
|
|
119
|
+
v['reason'] = 'vacation'
|
|
121
120
|
|
|
122
121
|
cv = v['diagnosis'].downcase
|
|
123
122
|
Suspending.each do |e|
|
|
@@ -127,8 +126,8 @@ module Sisimai
|
|
|
127
126
|
break
|
|
128
127
|
end
|
|
129
128
|
|
|
130
|
-
v['date']
|
|
131
|
-
v['status']
|
|
129
|
+
v['date'] = mhead['date']
|
|
130
|
+
v['status'] = ''
|
|
132
131
|
|
|
133
132
|
if cv = lower['subject'].match(SubjectSet)
|
|
134
133
|
# Get the Subject header from the original message
|
data/lib/sisimai/rfc791.rb
CHANGED
|
@@ -12,8 +12,7 @@ module Sisimai
|
|
|
12
12
|
|
|
13
13
|
octet.each do |e|
|
|
14
14
|
# Check each octet is between 0 and 255
|
|
15
|
-
return false unless e =~ /\A[0-9]{1,3}\z
|
|
16
|
-
v = e.to_i
|
|
15
|
+
return false unless e =~ /\A[0-9]{1,3}\z/; v = e.to_i
|
|
17
16
|
return false if v < 0 || v > 255
|
|
18
17
|
end
|
|
19
18
|
return true
|
|
@@ -27,42 +26,8 @@ module Sisimai
|
|
|
27
26
|
return nil if argv0.to_s.empty?
|
|
28
27
|
return [] if argv0.size < 7
|
|
29
28
|
|
|
30
|
-
given = argv0.dup
|
|
31
|
-
|
|
32
|
-
%w|( ) [ ] ,|.each do |e|
|
|
33
|
-
# Rewrite: "mx.example.jp[192.0.2.1]" => "mx.example.jp 192.0.2.1"
|
|
34
|
-
p0 = given.index(e); next if p0.nil?
|
|
35
|
-
given[p0, 1] = ' '
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
given.split(' ').each do |e|
|
|
39
|
-
# Find string including an IPv4 address
|
|
40
|
-
next if e.index('.').nil? # IPv4 address must include "." character
|
|
41
|
-
|
|
42
|
-
lx = e.size; next if lx < 7 || lx > 17 # 0.0.0.0 = 7, [255.255.255.255] = 17
|
|
43
|
-
cu = 0 # Cursor for seeking each octet of an IPv4 address
|
|
44
|
-
as = '' # ASCII Code of each character
|
|
45
|
-
eo = '' # Buffer of each octet of IPv4 Address
|
|
46
|
-
|
|
47
|
-
while cu < lx
|
|
48
|
-
# Check whether each character is a number or "." or not
|
|
49
|
-
as = e[cu, 1].ord
|
|
50
|
-
cu += 1
|
|
51
|
-
|
|
52
|
-
if as < 48 || as > 57
|
|
53
|
-
# The character is not a number(0-9)
|
|
54
|
-
break if as != 46 # The character is not "."
|
|
55
|
-
next if eo == '' # The current buffer is empty
|
|
56
|
-
break if eo.to_i > 255 # The current buffer is greater than 255
|
|
57
|
-
eo = ''
|
|
58
|
-
next
|
|
59
|
-
end
|
|
60
|
-
eo += as.chr
|
|
61
|
-
break if eo.to_i > 255
|
|
62
|
-
end
|
|
63
|
-
ipv4a << e if eo.size > 0 && eo.to_i < 256
|
|
64
|
-
end
|
|
65
|
-
return ipv4a
|
|
29
|
+
given = argv0.dup.tr('()[],', ' ').squeeze(' ')
|
|
30
|
+
return given.split(' ').select { |e| is_ipv4address(e) }
|
|
66
31
|
end
|
|
67
32
|
|
|
68
33
|
end
|
|
@@ -505,6 +505,10 @@ module Sisimai
|
|
|
505
505
|
# can change this.
|
|
506
506
|
['5.7.136', 0, 0, 'sender was not authenticated'],
|
|
507
507
|
|
|
508
|
+
# - 550 5.7.193 UnifiedGroupAgent; Delivery failed because the sender isn't a group
|
|
509
|
+
# member or external senders aren't permitted to send to this group.
|
|
510
|
+
["5.7.193", 0, 0, "sender isn't a group member or external senders aren't permitted"],
|
|
511
|
+
|
|
508
512
|
# - The sending account has been banned due to detected spam activity.
|
|
509
513
|
# - For details, see Fix email delivery issues for error code 451 5.7.500-699 (ASxxx)
|
|
510
514
|
# in Exchange Online.
|
data/lib/sisimai/rhost.rb
CHANGED
|
@@ -24,7 +24,7 @@ module Sisimai
|
|
|
24
24
|
"Spectrum" => ["charter.net"],
|
|
25
25
|
"Tencent" => [".qq.com"],
|
|
26
26
|
"YahooInc" => [".yahoodns.net"],
|
|
27
|
-
"Zoho" => [".zoho.com", ".zoho.eu"],
|
|
27
|
+
"Zoho" => [".zoho.com", ".zoho.eu", ".zoho.jp", ".zoho.com.au", ".zoho.com.cn", ".zoho.in"],
|
|
28
28
|
}.freeze
|
|
29
29
|
|
|
30
30
|
# Returns the rhost class name
|
data/lib/sisimai/smtp/status.rb
CHANGED
|
@@ -155,6 +155,12 @@
|
|
|
155
155
|
# X.3.5 --- System incorrectly configured:(RFC 3463)
|
|
156
156
|
# The system is not configured in a manner that will permit it to accept this
|
|
157
157
|
# message.
|
|
158
|
+
#
|
|
159
|
+
# X.3.6 250 Requested priority was changed:(RFC 6710)
|
|
160
|
+
# 251 The message was accepted for relay/delivery, but the requested priority (possibly
|
|
161
|
+
# the implied default) was not honored. The human readable text after the status
|
|
162
|
+
# code contains the new priority, followed by SP (space) and explanatory human
|
|
163
|
+
# readable text.
|
|
158
164
|
# -------------------------------------------------------------------------------------------------
|
|
159
165
|
# X.4.0 --- Other or undefined network or routing status:(RFC 3463)
|
|
160
166
|
# Something went wrong with the networking, but it is not clear what the problem is,
|
|
@@ -391,7 +397,7 @@
|
|
|
391
397
|
# 5xx temporary, for example the server is operating in a mode where only higher
|
|
392
398
|
# priority messages below certain size are accepted for transfer and delivery.
|
|
393
399
|
#
|
|
394
|
-
# X.7.17 5xx Mailbox owner has changed:(RFC
|
|
400
|
+
# X.7.17 5xx Mailbox owner has changed:(RFC 7293)
|
|
395
401
|
# This status code is returned when a message is received with a
|
|
396
402
|
# Require-Recipient-Valid-Since field or RRVS extension and the receiving system is
|
|
397
403
|
# able to determine that the intended recipient mailbox has not been under
|
|
@@ -680,12 +686,10 @@ module Sisimai
|
|
|
680
686
|
def find(argv1 = nil, argv2 = '0')
|
|
681
687
|
return "" if argv1.to_s.empty? || argv1.size < 7
|
|
682
688
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
['5.', '4.', '2.']
|
|
688
|
-
end
|
|
689
|
+
case argv2[0, 1]
|
|
690
|
+
when '2', '4', '5' then eestatuses = [argv2[0, 1] + '.']
|
|
691
|
+
else eestatuses = ['5.', '4.', '2.']
|
|
692
|
+
end
|
|
689
693
|
esmtperror = ' ' + argv1 + ' ' # Why 3 space characters? see https://github.com/sisimai/p5-sisimai/issues/574
|
|
690
694
|
lookingfor = []
|
|
691
695
|
|
|
@@ -822,22 +826,22 @@ module Sisimai
|
|
|
822
826
|
end
|
|
823
827
|
|
|
824
828
|
return statuscode if zeroindex2['error'] > 0 # An SMTP status code is "X.0.0"
|
|
825
|
-
return codeinmesg if statuscode == '4.4.7' # "4.4.7" is an ambiguous code
|
|
826
|
-
return codeinmesg if statuscode == '4.7.0' # "4.7.0" indicates "too many errors"
|
|
827
829
|
return codeinmesg if statuscode.start_with?('5.3.') # "5.3.Z" is an error of a system
|
|
828
|
-
return codeinmesg if statuscode.end_with?('.5.1'
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
830
|
+
return codeinmesg if statuscode.end_with?('.5.1', '.5.2', '.5.4', '.5.5')
|
|
831
|
+
|
|
832
|
+
case statuscode
|
|
833
|
+
# - "4.4.7" is an ambigous code
|
|
834
|
+
# - "4.7.0" indicates "too many errors"
|
|
835
|
+
# - "X.5.1" indicates an invalid command
|
|
836
|
+
# - "X.5.2" indicates a syntax error
|
|
837
|
+
# - "X.5.4" indicates an invalid command argument
|
|
838
|
+
# - "X.5.5" indicates a wrong protocol version
|
|
839
|
+
when "4.4.7", "4.7.0" then return codeinmesg
|
|
840
|
+
when "5.1.3" then return codeinmesg if codeinmesg.start_with?('5.7.')
|
|
841
|
+
when "5.1.1"
|
|
834
842
|
# "5.1.1" is a code of "userunknown"
|
|
835
843
|
return statuscode if codeinmesg.start_with?('5.5.') || zeroindex1['error'] > 0
|
|
836
844
|
return codeinmesg
|
|
837
|
-
|
|
838
|
-
elsif statuscode == '5.1.3'
|
|
839
|
-
# "5.1.3"
|
|
840
|
-
return codeinmesg if codeinmesg.start_with?('5.7.')
|
|
841
845
|
end
|
|
842
846
|
|
|
843
847
|
return statuscode
|
data/lib/sisimai/string.rb
CHANGED
|
@@ -17,18 +17,6 @@ module Sisimai
|
|
|
17
17
|
return false
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
# Clean the string out
|
|
21
|
-
# @param [String] argv1 String to be cleaned
|
|
22
|
-
# @return [String] Cleaned out string
|
|
23
|
-
# @example Clean up text
|
|
24
|
-
# sweep(' neko ') #=> 'neko'
|
|
25
|
-
def sweep(argv1)
|
|
26
|
-
return argv1 if argv1.is_a?(::String) == false
|
|
27
|
-
argv1 = argv1.chomp.squeeze(' ').strip
|
|
28
|
-
argv1 = argv1.sub(/ [-]{2,}[^ ].+\z/, '')
|
|
29
|
-
return argv1
|
|
30
|
-
end
|
|
31
|
-
|
|
32
20
|
# Check if each element of the 2nd argument is aligned in the 1st argument or not
|
|
33
21
|
# @param [String] argv1 String to be checked
|
|
34
22
|
# @param [Array] argv2 List including the ordered strings
|
data/lib/sisimai/version.rb
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Received-SPF: None (no SPF record) identity=helo; client-ip=192.0.2.1; helo=mailout11.t-online.de; envelope-from=<>; receiver=mail.example.com
|
|
2
|
+
Received: from mailout11.t-online.de (mailout11.t-online.de [192.0.2.1])
|
|
3
|
+
by mail.example.com (Postfix) with ESMTPS id 2A29623F0
|
|
4
|
+
for <returnpath@mail.example.com>; Wed, 03 Jun 2026 17:30:52 +0000 (UTC)
|
|
5
|
+
Received: from mailin42.aul.t-online.de (mailin42.aul.t-online.de [192.51.100.1])
|
|
6
|
+
by mailout11.t-online.de (Postfix) with SMTP id 05E5A1CAC0
|
|
7
|
+
for <returnpath@mail.example.com>; Wed, 3 Jun 2026 19:23:42 +0200 (CEST)
|
|
8
|
+
X-Failed-Recipients: example@t-online.de
|
|
9
|
+
From: Mail Delivery System <Mailer-Daemon@t-online.de>
|
|
10
|
+
To: returnpath@mail.example.com
|
|
11
|
+
Subject: Mail delivery failed: returning message to sender
|
|
12
|
+
Message-Id: <xxxyyyzzzaaabbccc.aul.t-online.de>
|
|
13
|
+
Date: Wed, 3 Jun 2026 19:23:17 +0200
|
|
14
|
+
X-TOI-MSGID: c9412855-531f-497b-b007-5ffc033877a0
|
|
15
|
+
Authentication-Results: mailin42.aul.t-online.de; dkim=none;
|
|
16
|
+
dkim-atps=neutral
|
|
17
|
+
|
|
18
|
+
|------------------------- Failed addresses follow: ---------------------|
|
|
19
|
+
<example@t-online.de>
|
|
20
|
+
552 5.2.2 <example@t-online.de> Quota exceeded (mailbox for user is full)
|
|
21
|
+
|
|
22
|
+
|------------------------- Message header follows: ----------------------|
|
|
23
|
+
Received: from mail.example.com ([152.53.207.210]) by mailin42.t-online.de
|
|
24
|
+
with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)
|
|
25
|
+
esmtp id 1wUpJD-0ZWsnR0; Wed, 3 Jun 2026 19:23:15 +0200
|
|
26
|
+
Received: by mail.example.com (Postfix)
|
|
27
|
+
id AD20B29490; Tue, 02 Jun 2026 20:17:41 +0000 (UTC)
|
|
28
|
+
Date: Tue, 02 Jun 2026 20:17:41 +0000
|
|
29
|
+
From: some corp <somecorp@example.com>
|
|
30
|
+
Reply-To: some corp <somecorp@example.com>
|
|
31
|
+
To: example@t-online.de
|
|
32
|
+
Message-ID: <outgoingmessageid>
|
|
33
|
+
Subject: Subject omitted for privacy
|
|
34
|
+
Mime-Version: 1.0
|
|
35
|
+
Content-Type: multipart/mixed;
|
|
36
|
+
boundary="--==_mimepart_6a1f3a659c89f_79afe920227275f";
|
|
37
|
+
charset=UTF-8
|
|
38
|
+
Content-Transfer-Encoding: 7bit
|
|
39
|
+
|
|
40
|
+
|----------- Message text follows: (body too large, truncated) ----------|
|
|
41
|
+
|
|
42
|
+
----==_mimepart_6a1f3a659c89f_79afe920227275f
|
|
43
|
+
Content-Type: text/html;
|
|
44
|
+
charset=UTF-8
|
|
45
|
+
Content-Transfer-Encoding: quoted-printable
|
|
46
|
+
|
|
47
|
+
<!DOCTYPE html>
|
|
48
|
+
<html>
|
|
49
|
+
<head>
|
|
50
|
+
<meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Content-Type">=
|
|
51
|
+
|
|
52
|
+
<style>
|
|
53
|
+
#footer {
|
|
54
|
+
font-size: 11px;
|
|
55
|
+
border-top: 1px solid #666;
|
|
56
|
+
color: #333;
|
|
57
|
+
margin-top: 1em;
|
|
58
|
+
padding-top: 1em;
|
|
59
|
+
}
|
|
60
|
+
</style>
|
|
61
|
+
|
|
62
|
+
</head>
|
|
63
|
+
<body>
|
|
64
|
+
<p>Hello there, fellow some corp user!</p><p>I would like to inform you a=
|
|
65
|
+
about the upcoming team event next we
|
|
66
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Received-SPF: None (no SPF record) identity=helo; client-ip=192.0.2.1; helo=mailout11.t-online.de; envelope-from=<>; receiver=mail.example.com
|
|
2
|
+
Received: from mailout11.t-online.de (mailout11.t-online.de [192.0.2.1])
|
|
3
|
+
by mail.example.com (Postfix) with ESMTPS id 2A29623F0
|
|
4
|
+
for <returnpath@mail.example.com>; Wed, 03 Jun 2026 17:30:52 +0000 (UTC)
|
|
5
|
+
Received: from mailin42.aul.t-online.de (mailin42.aul.t-online.de [192.51.100.1])
|
|
6
|
+
by mailout11.t-online.de (Postfix) with SMTP id 05E5A1CAC0
|
|
7
|
+
for <returnpath@mail.example.com>; Wed, 3 Jun 2026 19:23:42 +0200 (CEST)
|
|
8
|
+
X-Failed-Recipients: example@t-online.de
|
|
9
|
+
From: Mail Delivery System <Mailer-Daemon@t-online.de>
|
|
10
|
+
To: returnpath@mail.example.com
|
|
11
|
+
Subject: Mail delivery failed: returning message to sender
|
|
12
|
+
Message-Id: <xxxyyyzzzaaabbccc.aul.t-online.de>
|
|
13
|
+
Date: Wed, 3 Jun 2026 19:23:17 +0200
|
|
14
|
+
X-TOI-MSGID: c9412855-531f-497b-b007-5ffc033877a0
|
|
15
|
+
Authentication-Results: mailin42.aul.t-online.de; dkim=none;
|
|
16
|
+
dkim-atps=neutral
|
|
17
|
+
|
|
18
|
+
|------------------------- Failed addresses follow: ---------------------|
|
|
19
|
+
<example1@t-online.de>
|
|
20
|
+
552 5.2.2 <example1@t-online.de> Quota exceeded (mailbox for user is full)
|
|
21
|
+
<example2@t-online.de>
|
|
22
|
+
550 5.1.1 <example2@t-online.de> unknown user
|
|
23
|
+
|
|
24
|
+
|------------------------- Message header follows: ----------------------|
|
|
25
|
+
Received: from mail.example.com ([152.53.207.210]) by mailin42.t-online.de
|
|
26
|
+
with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)
|
|
27
|
+
esmtp id 1wUpJD-0ZWsnR0; Wed, 3 Jun 2026 19:23:15 +0200
|
|
28
|
+
Received: by mail.example.com (Postfix)
|
|
29
|
+
id AD20B29490; Tue, 02 Jun 2026 20:17:41 +0000 (UTC)
|
|
30
|
+
Date: Tue, 02 Jun 2026 20:17:41 +0000
|
|
31
|
+
From: some corp <somecorp@example.com>
|
|
32
|
+
Reply-To: some corp <somecorp@example.com>
|
|
33
|
+
To: <example1@t-online.de>, <example2@t-online.de>
|
|
34
|
+
Message-ID: <outgoingmessageid>
|
|
35
|
+
Subject: Subject omitted for privacy
|
|
36
|
+
Mime-Version: 1.0
|
|
37
|
+
Content-Type: multipart/mixed;
|
|
38
|
+
boundary="--==_mimepart_6a1f3a659c89f_79afe920227275f";
|
|
39
|
+
charset=UTF-8
|
|
40
|
+
Content-Transfer-Encoding: 7bit
|
|
41
|
+
|
|
42
|
+
|----------- Message text follows: (body too large, truncated) ----------|
|
|
43
|
+
|
|
44
|
+
----==_mimepart_6a1f3a659c89f_79afe920227275f
|
|
45
|
+
Content-Type: text/html;
|
|
46
|
+
charset=UTF-8
|
|
47
|
+
Content-Transfer-Encoding: quoted-printable
|
|
48
|
+
|
|
49
|
+
<!DOCTYPE html>
|
|
50
|
+
<html>
|
|
51
|
+
<head>
|
|
52
|
+
<meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Content-Type">=
|
|
53
|
+
|
|
54
|
+
<style>
|
|
55
|
+
#footer {
|
|
56
|
+
font-size: 11px;
|
|
57
|
+
border-top: 1px solid #666;
|
|
58
|
+
color: #333;
|
|
59
|
+
margin-top: 1em;
|
|
60
|
+
padding-top: 1em;
|
|
61
|
+
}
|
|
62
|
+
</style>
|
|
63
|
+
|
|
64
|
+
</head>
|
|
65
|
+
<body>
|
|
66
|
+
<p>Hello there, fellow some corp user!</p><p>I would like to inform you a=
|
|
67
|
+
about the upcoming team event next we
|
|
68
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
Return-Path: <kijitora-nyaan@example.org>
|
|
2
|
+
Delivered-To: sironeko@example.jp
|
|
3
|
+
Received: from example.com (unknown [192.0.2.250])
|
|
4
|
+
by r1.example.co.jp (Postfix) with ESMTP id FFFFFFFF00
|
|
5
|
+
for <sironeko@example.jp>; Thu, 29 Apr 2006 23:34:45 +0000 (UTC)
|
|
6
|
+
Received: from r2.example.org (r2.example.org [192.0.2.25])
|
|
7
|
+
by smtp.nyaan.example.net (8.10.1/8.10.1) with ESMTP id k3k000000000
|
|
8
|
+
for <sironeko@nyaan.example.net>; Thu,29 Apr 2006 23:34:45 +0000
|
|
9
|
+
Received: from [203.0.113.25] (helo=r9.example.net)
|
|
10
|
+
by r2.example.org with esmtp (Exim 3.21 #1)
|
|
11
|
+
id AAAAAA-000000-22
|
|
12
|
+
for kijitora-nyaan@example.org; Thu, 29 Apr 2006 23:34:45 +0000
|
|
13
|
+
Received: from smtp1.r.example.net ([209.196.123.3])
|
|
14
|
+
by mx7.example.net with smtp (Exim 3.16 #10)
|
|
15
|
+
id BBBBBB-111111-22
|
|
16
|
+
for kijitora-nyaan@example.org; Thu, 29 Apr 2006 23:34:45 +0000
|
|
17
|
+
Message-Id: <ffffffffffffffff1@smtp1.r.example.net>
|
|
18
|
+
From: <MAILER-DAEMON@example.net>
|
|
19
|
+
To: kijitora-nyaan@example.org
|
|
20
|
+
Date: Thu, 29 Apr 2006 23:34:45 +0000 (UTC)
|
|
21
|
+
Subject: mail failed, returning to sender
|
|
22
|
+
|
|
23
|
+
|------------------------- Message log follows: -------------------------|
|
|
24
|
+
no valid recipients were found for this message
|
|
25
|
+
|------------------------- Failed addresses follow: ---------------------|
|
|
26
|
+
kijitora@neko.nyaan.example.com ... unknown host
|
|
27
|
+
|------------------------- Message text follows: ------------------------|
|
|
28
|
+
Received: from r2.example.org ([192.0.2.25])
|
|
29
|
+
by mx1.example.net with esmtp (Exim 3.22 #2)
|
|
30
|
+
id aaaaaa-444444-22
|
|
31
|
+
for kijitora@neosoft.com; Thu, 29 Apr 2006 23:34:45 +0000
|
|
32
|
+
Received: from localhost.localdomain ([127.0.0.1] helo=r2.example.org)
|
|
33
|
+
by r2.example.org with esmtp (Exim 3.22 #2)
|
|
34
|
+
id 000000-000000-00; Thu, 29 Apr 2006 23:34:45 +0000
|
|
35
|
+
Received: from [203.0.113.1] (helo=[127.0.0.1])
|
|
36
|
+
by r2.example.org with smtp (Exim 3.22 #2)
|
|
37
|
+
id eeeeee-rrrrrr-22
|
|
38
|
+
for neko-nyaan@example.org; Thu, 29 Apr 2006 23:34:45 +0000
|
|
39
|
+
Message-Id: <ffffffffffff000000002222000000000@e3.example.com>
|
|
40
|
+
To: kijitora@neko.nyaan.example.com
|
|
41
|
+
From: Neko <sironeko@example.jp>
|
|
42
|
+
Cc: neko-nyaan@example.org
|
|
43
|
+
Mime-Version: 1.0
|
|
44
|
+
Content-Type: text/plain; charset="us-ascii"; format=flowed
|
|
45
|
+
Date: Thu, 29 Apr 2006 23:34:45 +0000
|
|
46
|
+
Subject: Nyaan
|
|
47
|
+
|
|
48
|
+
Nyaan
|
|
49
|
+
|
|
50
|
+
|