sisimai 4.25.17 → 5.0.0
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/.travis.yml +3 -3
- data/ANALYTICAL-PRECISION +2 -2
- data/Benchmarks.mk +3 -3
- data/CONTRIBUTING +1 -1
- data/ChangeLog.md +406 -407
- data/Developers.mk +5 -6
- data/Gemfile +1 -1
- data/Makefile +12 -12
- data/README-JA.md +142 -94
- data/README.md +282 -150
- data/Rakefile +9 -3
- data/Repository.mk +2 -3
- data/lib/sisimai/address.rb +118 -74
- data/lib/sisimai/arf.rb +84 -82
- data/lib/sisimai/datetime.rb +5 -52
- data/lib/sisimai/{data → fact}/json.rb +7 -9
- data/lib/sisimai/fact/yaml.rb +31 -0
- data/lib/sisimai/fact.rb +468 -0
- data/lib/sisimai/lhost/activehunter.rb +12 -14
- data/lib/sisimai/lhost/amavis.rb +11 -14
- data/lib/sisimai/lhost/amazonses.rb +37 -41
- data/lib/sisimai/lhost/amazonworkmail.rb +15 -18
- data/lib/sisimai/lhost/aol.rb +12 -14
- data/lib/sisimai/lhost/apachejames.rb +19 -21
- data/lib/sisimai/lhost/barracuda.rb +10 -12
- data/lib/sisimai/lhost/bigfoot.rb +21 -21
- data/lib/sisimai/lhost/biglobe.rb +15 -16
- data/lib/sisimai/lhost/courier.rb +20 -20
- data/lib/sisimai/lhost/domino.rb +23 -19
- data/lib/sisimai/lhost/einsundeins.rb +20 -16
- data/lib/sisimai/lhost/exchange2003.rb +30 -29
- data/lib/sisimai/lhost/exchange2007.rb +70 -58
- data/lib/sisimai/lhost/exim.rb +175 -161
- data/lib/sisimai/lhost/ezweb.rb +31 -56
- data/lib/sisimai/lhost/facebook.rb +21 -33
- data/lib/sisimai/lhost/fml.rb +43 -48
- data/lib/sisimai/lhost/gmail.rb +29 -29
- data/lib/sisimai/lhost/gmx.rb +18 -17
- data/lib/sisimai/lhost/googlegroups.rb +9 -10
- data/lib/sisimai/lhost/gsuite.rb +21 -27
- data/lib/sisimai/lhost/imailserver.rb +25 -39
- data/lib/sisimai/lhost/interscanmss.rb +28 -31
- data/lib/sisimai/lhost/kddi.rb +22 -28
- data/lib/sisimai/lhost/mailfoundry.rb +11 -12
- data/lib/sisimai/lhost/mailmarshalsmtp.rb +25 -29
- data/lib/sisimai/lhost/mailru.rb +33 -27
- data/lib/sisimai/lhost/mcafee.rb +21 -31
- data/lib/sisimai/lhost/messagelabs.rb +17 -20
- data/lib/sisimai/lhost/messagingserver.rb +40 -37
- data/lib/sisimai/lhost/mfilter.rb +15 -16
- data/lib/sisimai/lhost/mxlogic.rb +24 -23
- data/lib/sisimai/lhost/notes.rb +17 -17
- data/lib/sisimai/lhost/office365.rb +63 -27
- data/lib/sisimai/lhost/opensmtpd.rb +12 -13
- data/lib/sisimai/lhost/outlook.rb +12 -15
- data/lib/sisimai/lhost/postfix.rb +179 -129
- data/lib/sisimai/lhost/powermta.rb +12 -14
- data/lib/sisimai/lhost/qmail.rb +44 -47
- data/lib/sisimai/lhost/receivingses.rb +15 -20
- data/lib/sisimai/lhost/sendgrid.rb +34 -32
- data/lib/sisimai/lhost/sendmail.rb +66 -53
- data/lib/sisimai/lhost/surfcontrol.rb +19 -19
- data/lib/sisimai/lhost/v5sendmail.rb +45 -39
- data/lib/sisimai/lhost/verizon.rb +35 -39
- data/lib/sisimai/lhost/x1.rb +18 -17
- data/lib/sisimai/lhost/x2.rb +17 -14
- data/lib/sisimai/lhost/x3.rb +19 -19
- data/lib/sisimai/lhost/x4.rb +72 -57
- data/lib/sisimai/lhost/x5.rb +17 -19
- data/lib/sisimai/lhost/x6.rb +41 -17
- data/lib/sisimai/lhost/yahoo.rb +17 -16
- data/lib/sisimai/lhost/yandex.rb +16 -20
- data/lib/sisimai/lhost/zoho.rb +16 -15
- data/lib/sisimai/lhost.rb +8 -10
- data/lib/sisimai/mail/maildir.rb +1 -3
- data/lib/sisimai/mail/mbox.rb +3 -4
- data/lib/sisimai/mail/memory.rb +0 -1
- data/lib/sisimai/mail/stdin.rb +1 -3
- data/lib/sisimai/mail.rb +3 -7
- data/lib/sisimai/mda.rb +28 -42
- data/lib/sisimai/message.rb +435 -325
- data/lib/sisimai/order.rb +5 -5
- data/lib/sisimai/reason/authfailure.rb +64 -0
- data/lib/sisimai/reason/badreputation.rb +53 -0
- data/lib/sisimai/reason/blocked.rb +94 -160
- data/lib/sisimai/reason/contenterror.rb +8 -9
- data/lib/sisimai/reason/delivered.rb +4 -6
- data/lib/sisimai/reason/exceedlimit.rb +10 -12
- data/lib/sisimai/reason/expired.rb +6 -8
- data/lib/sisimai/reason/feedback.rb +2 -3
- data/lib/sisimai/reason/filtered.rb +17 -19
- data/lib/sisimai/reason/hasmoved.rb +9 -10
- data/lib/sisimai/reason/hostunknown.rb +15 -15
- data/lib/sisimai/reason/mailboxfull.rb +10 -12
- data/lib/sisimai/reason/mailererror.rb +18 -20
- data/lib/sisimai/reason/mesgtoobig.rb +9 -11
- data/lib/sisimai/reason/networkerror.rb +5 -8
- data/lib/sisimai/reason/norelaying.rb +8 -11
- data/lib/sisimai/reason/notaccept.rb +13 -14
- data/lib/sisimai/reason/notcompliantrfc.rb +43 -0
- data/lib/sisimai/reason/onhold.rb +6 -9
- data/lib/sisimai/reason/policyviolation.rb +14 -12
- data/lib/sisimai/reason/rejected.rb +26 -24
- data/lib/sisimai/reason/requireptr.rb +69 -0
- data/lib/sisimai/reason/securityerror.rb +33 -36
- data/lib/sisimai/reason/spamdetected.rb +114 -147
- data/lib/sisimai/reason/speeding.rb +49 -0
- data/lib/sisimai/reason/suspend.rb +11 -11
- data/lib/sisimai/reason/syntaxerror.rb +11 -10
- data/lib/sisimai/reason/systemerror.rb +7 -9
- data/lib/sisimai/reason/systemfull.rb +7 -8
- data/lib/sisimai/reason/toomanyconn.rb +9 -11
- data/lib/sisimai/reason/undefined.rb +2 -3
- data/lib/sisimai/reason/userunknown.rb +129 -146
- data/lib/sisimai/reason/vacation.rb +3 -4
- data/lib/sisimai/reason/virusdetected.rb +10 -11
- data/lib/sisimai/reason.rb +59 -64
- data/lib/sisimai/rfc1894.rb +55 -28
- data/lib/sisimai/rfc2045.rb +373 -0
- data/lib/sisimai/rfc3464.rb +250 -308
- data/lib/sisimai/rfc3834.rb +42 -45
- data/lib/sisimai/rfc5322.rb +75 -100
- data/lib/sisimai/rfc5965.rb +31 -0
- data/lib/sisimai/rhost/cox.rb +5 -6
- data/lib/sisimai/rhost/franceptt.rb +6 -8
- data/lib/sisimai/rhost/godaddy.rb +12 -12
- data/lib/sisimai/rhost/{googleapps.rb → google.rb} +80 -72
- data/lib/sisimai/rhost/iua.rb +9 -10
- data/lib/sisimai/rhost/kddi.rb +6 -8
- data/lib/sisimai/rhost/{exchangeonline.rb → microsoft.rb} +115 -114
- data/lib/sisimai/rhost/mimecast.rb +42 -40
- data/lib/sisimai/rhost/nttdocomo.rb +13 -18
- data/lib/sisimai/rhost/spectrum.rb +10 -12
- data/lib/sisimai/rhost/{tencentqq.rb → tencent.rb} +7 -8
- data/lib/sisimai/rhost.rb +23 -31
- data/lib/sisimai/smtp/command.rb +59 -0
- data/lib/sisimai/smtp/error.rb +4 -7
- data/lib/sisimai/smtp/reply.rb +161 -74
- data/lib/sisimai/smtp/status.rb +504 -393
- data/lib/sisimai/smtp/transcript.rb +124 -0
- data/lib/sisimai/smtp.rb +0 -1
- data/lib/sisimai/string.rb +74 -5
- data/lib/sisimai/time.rb +1 -2
- data/lib/sisimai/version.rb +1 -1
- data/lib/sisimai.rb +35 -21
- data/set-of-emails/maildir/bsd/lhost-domino-02.eml +6 -3
- data/set-of-emails/maildir/bsd/lhost-googlegroups-15.eml +174 -0
- data/set-of-emails/maildir/bsd/lhost-gsuite-15.eml +229 -0
- data/set-of-emails/maildir/bsd/lhost-postfix-75.eml +51 -0
- data/set-of-emails/maildir/bsd/lhost-postfix-76.eml +101 -0
- data/set-of-emails/maildir/bsd/lhost-postfix-77.eml +74 -0
- data/set-of-emails/maildir/bsd/lhost-postfix-78.eml +91 -0
- data/set-of-emails/maildir/bsd/lhost-receivingses-08.eml +88 -0
- data/set-of-emails/maildir/bsd/rfc3464-43.eml +88 -0
- data/set-of-emails/maildir/bsd/rhost-google-03.eml +101 -0
- data/set-of-emails/maildir/bsd/rhost-google-04.eml +102 -0
- data/set-of-emails/maildir/bsd/rhost-google-05.eml +82 -0
- data/set-of-emails/maildir/bsd/rhost-google-06.eml +102 -0
- data/set-of-emails/maildir/bsd/rhost-google-07.eml +69 -0
- data/set-of-emails/maildir/bsd/rhost-google-08.eml +99 -0
- data/sisimai-java.gemspec +1 -1
- data/sisimai.gemspec +1 -1
- metadata +41 -21
- data/.rspec +0 -2
- data/lib/sisimai/data/yaml.rb +0 -33
- data/lib/sisimai/data.rb +0 -411
- data/lib/sisimai/mime.rb +0 -456
- data/set-of-emails/maildir/mac/reported-from-nick4tech-san-01.eml +0 -6
- /data/set-of-emails/maildir/bsd/{rfc3464-41.eml → rfc3834-05.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-googleapps-01.eml → rhost-google-01.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-googleapps-02.eml → rhost-google-02.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-exchangeonline-01.eml → rhost-microsoft-01.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-exchangeonline-02.eml → rhost-microsoft-02.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-exchangeonline-03.eml → rhost-microsoft-03.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-tencentqq-01.eml → rhost-tencent-01.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-tencentqq-02.eml → rhost-tencent-02.eml} +0 -0
- /data/set-of-emails/maildir/bsd/{rhost-tencentqq-03.eml → rhost-tencent-03.eml} +0 -0
@@ -1,21 +1,20 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::Suspend checks the bounce reason is
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# This is the error that a recipient account is being suspended due to
|
7
|
-
# unpaid or other reasons.
|
3
|
+
# Sisimai::Reason::Suspend checks the bounce reason is "suspend" or not. This class is called
|
4
|
+
# only Sisimai::Reason class. This is the error that a recipient account is being suspended
|
5
|
+
# due to unpaid or other reasons.
|
8
6
|
module Suspend
|
9
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/Suspend.pm
|
10
7
|
class << self
|
11
8
|
Index = [
|
12
9
|
' is currently suspended',
|
13
10
|
' temporary locked',
|
11
|
+
'archived recipient',
|
14
12
|
'boite du destinataire archivee',
|
15
13
|
'email account that you tried to reach is disabled',
|
16
14
|
'has been suspended',
|
17
15
|
'invalid/inactive user',
|
18
16
|
'is a deactivated mailbox', # http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000742
|
17
|
+
'is unavailable: user is terminated',
|
19
18
|
'mailbox currently suspended',
|
20
19
|
'mailbox is frozen',
|
21
20
|
'mailbox unavailable or access denied',
|
@@ -25,7 +24,7 @@ module Sisimai
|
|
25
24
|
'this mailbox is disabled',
|
26
25
|
'user suspended', # http://mail.163.com/help/help_spam_16.htm
|
27
26
|
'vdelivermail: account is locked email bounced',
|
28
|
-
]
|
27
|
+
].freeze
|
29
28
|
|
30
29
|
def text; return 'suspend'; end
|
31
30
|
def description; return 'Email rejected due to a recipient account is being suspended'; end
|
@@ -41,14 +40,15 @@ module Sisimai
|
|
41
40
|
end
|
42
41
|
|
43
42
|
# The envelope recipient's mailbox is suspended or not
|
44
|
-
# @param [Sisimai::
|
43
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
45
44
|
# @return [True,False] true: is mailbox suspended
|
46
45
|
# false: is not suspended
|
47
46
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
48
47
|
def true(argvs)
|
49
|
-
return nil if argvs
|
50
|
-
return true if argvs
|
51
|
-
return true if
|
48
|
+
return nil if argvs['deliverystatus'].empty?
|
49
|
+
return true if argvs['reason'] == 'suspend'
|
50
|
+
return true if argvs['replycode'].to_i == 525
|
51
|
+
return true if match(argvs['diagnosticcode'].downcase)
|
52
52
|
return false
|
53
53
|
end
|
54
54
|
|
@@ -1,33 +1,34 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::SyntaxError checks the bounce reason is "syntaxerror" or
|
4
|
-
#
|
3
|
+
# Sisimai::Reason::SyntaxError checks the bounce reason is "syntaxerror" or not. This class is
|
4
|
+
# called only Sisimai::Reason class.
|
5
5
|
#
|
6
|
-
# This is the error that a destination mail server could not recognize SMTP
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# or 503.
|
6
|
+
# This is the error that a destination mail server could not recognize SMTP command which is
|
7
|
+
# sent from a sender's MTA. Sisimai will set "syntaxerror" to the reason if the value of
|
8
|
+
# "replycode" begins with "50" such as 502, or 503.
|
10
9
|
# Action: failed
|
11
10
|
# Status: 5.5.0
|
12
11
|
# Diagnostic-Code: SMTP; 503 Improper sequence of commands
|
13
12
|
#
|
14
13
|
module SyntaxError
|
15
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/SyntaxError.pm
|
16
14
|
class << self
|
17
15
|
def text; return 'syntaxerror'; end
|
18
16
|
def description; return 'Email rejected due to syntax error at sent commands in SMTP session'; end
|
19
17
|
def match(*); return nil; end
|
20
18
|
|
21
19
|
# Connection rejected due to syntax error or not
|
22
|
-
# @param [Sisimai::
|
20
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
23
21
|
# @return [True,False] true: Connection rejected due to
|
24
22
|
# syntax error
|
25
23
|
# false: is not syntax error
|
26
24
|
# @since 4.1.25
|
27
25
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
28
26
|
def true(argvs)
|
29
|
-
return true if argvs
|
30
|
-
|
27
|
+
return true if argvs['reason'] == 'syntaxerror'
|
28
|
+
|
29
|
+
reply = argvs['replycode'].to_i
|
30
|
+
return true if reply > 400 && reply < 408
|
31
|
+
return true if reply > 500 && reply < 508
|
31
32
|
return false
|
32
33
|
end
|
33
34
|
|
@@ -1,16 +1,13 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::SystemError checks the bounce reason is "systemerror" or
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# This is the error that an email has bounced due to system error on the
|
7
|
-
# remote host such as LDAP connection failure or other internal system error.
|
3
|
+
# Sisimai::Reason::SystemError checks the bounce reason is "systemerror" or not. This class is
|
4
|
+
# called only Sisimai::Reason class. This is the error that an email has bounced due to system
|
5
|
+
# error on the remote host such as LDAP connection failure or other internal system error.
|
8
6
|
#
|
9
7
|
# <kijitora@example.net>:
|
10
8
|
# Unable to contact LDAP server. (#4.4.3)I'm not going to try again; this
|
11
9
|
# message has been in the queue too long.
|
12
10
|
module SystemError
|
13
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/SystemError.pm
|
14
11
|
class << self
|
15
12
|
Index = [
|
16
13
|
'aliasing/forwarding loop broken',
|
@@ -27,14 +24,15 @@ module Sisimai
|
|
27
24
|
'loops back to myself',
|
28
25
|
'mail system configuration error',
|
29
26
|
'queue file write error',
|
27
|
+
'recipient deferred because there is no mdb',
|
30
28
|
'remote server is misconfigured',
|
31
29
|
'server configuration error',
|
32
30
|
'service currently unavailable',
|
33
31
|
'system config error',
|
34
32
|
'temporary local problem',
|
35
33
|
'timeout waiting for input',
|
36
|
-
'transaction failed',
|
37
|
-
]
|
34
|
+
'transaction failed ',
|
35
|
+
].freeze
|
38
36
|
|
39
37
|
def text; return 'systemerror'; end
|
40
38
|
def description; return 'Email returned due to system error on the remote host'; end
|
@@ -50,7 +48,7 @@ module Sisimai
|
|
50
48
|
end
|
51
49
|
|
52
50
|
# The bounce reason is system error or not
|
53
|
-
# @param [Sisimai::
|
51
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
54
52
|
# @return [True,False] true: is system error
|
55
53
|
# false: is not system error
|
56
54
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
@@ -1,18 +1,17 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::SystemFull checks the bounce reason is "systemfull" or
|
4
|
-
#
|
3
|
+
# Sisimai::Reason::SystemFull checks the bounce reason is "systemfull" or not. This class is called
|
4
|
+
# only Sisimai::Reason class.
|
5
5
|
#
|
6
|
-
# This is the error that a destination mail server's disk (or spool) is full.
|
7
|
-
#
|
8
|
-
#
|
6
|
+
# This is the error that a destination mail server's disk (or spool) is full. Sisimai will set
|
7
|
+
# systemfull to the reason of email bounce if the value of Status: field in a bounce email is
|
8
|
+
# "4.3.1" or "5.3.1".
|
9
9
|
module SystemFull
|
10
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/SystemFull.pm
|
11
10
|
class << self
|
12
11
|
Index = [
|
13
12
|
'mail system full',
|
14
13
|
'requested mail action aborted: exceeded storage allocation', # MS Exchange
|
15
|
-
]
|
14
|
+
].freeze
|
16
15
|
|
17
16
|
def text; return 'systemfull'; end
|
18
17
|
def description; return "Email rejected due to a destination mail server's disk is full"; end
|
@@ -28,7 +27,7 @@ module Sisimai
|
|
28
27
|
end
|
29
28
|
|
30
29
|
# The bounce reason is system full or not
|
31
|
-
# @param [Sisimai::
|
30
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
32
31
|
# @return [True,False] true: is system full
|
33
32
|
# false: is not system full
|
34
33
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
@@ -1,16 +1,14 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::TooManyConn checks the bounce reason is "toomanyconn" or
|
4
|
-
#
|
3
|
+
# Sisimai::Reason::TooManyConn checks the bounce reason is "toomanyconn" or not. This class is
|
4
|
+
# called only Sisimai::Reason class.
|
5
5
|
#
|
6
|
-
# This is the error that SMTP connection was rejected temporarily due to too
|
7
|
-
#
|
8
|
-
# in Sisimai 4.1.26 and does not exist in any version of bounceHammer.
|
6
|
+
# This is the error that SMTP connection was rejected temporarily due to too many concurrency
|
7
|
+
# connections to the remote server. This reason has added in Sisimai 4.1.26.
|
9
8
|
#
|
10
9
|
# <kijitora@example.ne.jp>: host mx02.example.ne.jp[192.0.1.20] said:
|
11
10
|
# 452 4.3.2 Connection rate limit exceeded. (in reply to MAIL FROM command)
|
12
11
|
module TooManyConn
|
13
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/TooManyConn.pm
|
14
12
|
class << self
|
15
13
|
Index = [
|
16
14
|
'all available ips are at maximum connection limit', # SendGrid
|
@@ -27,7 +25,7 @@ module Sisimai
|
|
27
25
|
'too many smtp sessions for this host', # Sendmail(daemon.c)
|
28
26
|
'trop de connexions, ',
|
29
27
|
'we have already made numerous attempts to deliver this message',
|
30
|
-
]
|
28
|
+
].freeze
|
31
29
|
|
32
30
|
def text; return 'toomanyconn'; end
|
33
31
|
def description; return 'SMTP connection rejected temporarily due to too many concurrency connections to the remote host'; end
|
@@ -43,14 +41,14 @@ module Sisimai
|
|
43
41
|
end
|
44
42
|
|
45
43
|
# Rejected by domain or address filter ?
|
46
|
-
# @param [Sisimai::
|
44
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
47
45
|
# @return [True,False] true: is filtered
|
48
46
|
# false: is not filtered
|
49
47
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
50
48
|
def true(argvs)
|
51
|
-
return true if argvs
|
52
|
-
return true if Sisimai::SMTP::Status.name(argvs
|
53
|
-
return true if match(argvs
|
49
|
+
return true if argvs['reason'] == 'toomanyconn'
|
50
|
+
return true if Sisimai::SMTP::Status.name(argvs['deliverystatus']).to_s == 'toomanyconn'
|
51
|
+
return true if match(argvs['diagnosticcode'].downcase)
|
54
52
|
return false
|
55
53
|
end
|
56
54
|
|
@@ -1,9 +1,8 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::Undefined is for only returning text and description.
|
4
|
-
#
|
3
|
+
# Sisimai::Reason::Undefined is for only returning text and description. This class is called only
|
4
|
+
# from Sisimai.reason method.
|
5
5
|
module Undefined
|
6
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/Undefined.pm
|
7
6
|
class << self
|
8
7
|
def text; return 'undefined'; end
|
9
8
|
def description; return 'Sisimai could not detect an error reason'; end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::UserUnknown checks the bounce reason is "userunknown" or
|
4
|
-
#
|
3
|
+
# Sisimai::Reason::UserUnknown checks the bounce reason is "userunknown" or not. This class is
|
4
|
+
# called only Sisimai::Reason class.
|
5
5
|
#
|
6
|
-
# This is the error that a local part (Left hand side of @ sign) of a recipient's
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# or the contents of Diagnostic-Code: field represents that it is unknown user.
|
6
|
+
# This is the error that a local part (Left hand side of @ sign) of a recipient's email address
|
7
|
+
# does not exist. In many case, a user has changed internet service provider, or has quit company,
|
8
|
+
# or the local part is misspelled. Sisimai will set "userunknown" to the reason of email bounce
|
9
|
+
# if the value of Status: field in a bounce email is "5.1.1", or connection was refused at SMTP
|
10
|
+
# RCPT command, or the contents of Diagnostic-Code: field represents that it is unknown user.
|
12
11
|
#
|
13
12
|
# <kijitora@example.co.jp>: host mx01.example.co.jp[192.0.2.8] said:
|
14
13
|
# 550 5.1.1 Address rejected kijitora@example.co.jp (in reply to
|
15
14
|
# RCPT TO command)
|
16
15
|
module UserUnknown
|
17
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/UserUnknown.pm
|
18
16
|
class << self
|
17
|
+
require 'sisimai/string'
|
18
|
+
|
19
19
|
PreMatches = %w[NoRelaying Blocked MailboxFull HasMoved Rejected NotAccept]
|
20
20
|
ModulePath = {
|
21
21
|
'Sisimai::Reason::NoRelaying' => 'sisimai/reason/norelaying',
|
@@ -25,135 +25,117 @@ module Sisimai
|
|
25
25
|
'Sisimai::Reason::Rejected' => 'sisimai/reason/rejected',
|
26
26
|
'Sisimai::Reason::NotAccept' => 'sisimai/reason/notaccept',
|
27
27
|
}
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|local[- ]part
|
140
|
-
|mailbox
|
141
|
-
|recipient
|
142
|
-
|user
|
143
|
-
)
|
144
|
-
|user[ ](?:
|
145
|
-
[^ ]+[ ]was[ ]not[ ]found
|
146
|
-
|[^ ]+[ ]does[ ]not[ ]exist
|
147
|
-
|does[ ]not[ ]exist
|
148
|
-
|missing[ ]home[ ]directory
|
149
|
-
|not[ ](?:active|exist|found|known)
|
150
|
-
|unknown
|
151
|
-
)
|
152
|
-
|utilisateur[ ]inconnu[ ]!
|
153
|
-
|vdeliver:[ ]invalid[ ]or[ ]unknown[ ]virtual[ ]user
|
154
|
-
|your[ ]envelope[ ]recipient[ ]is[ ]in[ ]my[ ]badrcptto[ ]list
|
155
|
-
)
|
156
|
-
}x
|
28
|
+
Index = [
|
29
|
+
'#5.1.1 bad address',
|
30
|
+
'550 address invalid',
|
31
|
+
'5.1.0 address rejected.',
|
32
|
+
'address does not exist',
|
33
|
+
'address not present in directory',
|
34
|
+
'address unknown',
|
35
|
+
"can't accept user",
|
36
|
+
'does not exist.',
|
37
|
+
'destination addresses were unknown',
|
38
|
+
'destination server rejected recipients',
|
39
|
+
'email address does not exist',
|
40
|
+
'email address could not be found',
|
41
|
+
'invalid address',
|
42
|
+
'invalid mailbox',
|
43
|
+
'invalid mailbox path',
|
44
|
+
'invalid recipient',
|
45
|
+
'is not a known user',
|
46
|
+
'is not a valid mailbox',
|
47
|
+
'is not an active address at this host',
|
48
|
+
'mailbox does not exist',
|
49
|
+
'mailbox invalid',
|
50
|
+
'mailbox is inactive',
|
51
|
+
'mailbox is unavailable',
|
52
|
+
'mailbox not present',
|
53
|
+
'mailbox not found',
|
54
|
+
'mailbox unavaiable',
|
55
|
+
'nessun utente simile in questo indirizzo',
|
56
|
+
'no account by that name here',
|
57
|
+
'no existe dicha persona',
|
58
|
+
'no existe ese usuario ',
|
59
|
+
'no mail box available for this user',
|
60
|
+
'no mailbox by that name is currently available',
|
61
|
+
'no mailbox found',
|
62
|
+
'no such address here',
|
63
|
+
'no such mailbox',
|
64
|
+
'no such person at this address',
|
65
|
+
'no such recipient',
|
66
|
+
|
67
|
+
'no such user',
|
68
|
+
'no thank you rejected: account unavailable',
|
69
|
+
'no valid recipients, bye',
|
70
|
+
'not a valid recipient',
|
71
|
+
'not a valid user here',
|
72
|
+
'not a local address',
|
73
|
+
'not email addresses',
|
74
|
+
'recipient address rejected. (in reply to rcpt to command)',
|
75
|
+
'recipient address rejected: access denied',
|
76
|
+
'recipient address rejected: invalid user',
|
77
|
+
'recipient address rejected: invalid-recipient',
|
78
|
+
'recipient address rejected: unknown user',
|
79
|
+
'recipient does not exist',
|
80
|
+
'recipient is not local',
|
81
|
+
'recipient not exist',
|
82
|
+
'recipient not found',
|
83
|
+
'recipient not ok',
|
84
|
+
'recipient refuses to accept your mail',
|
85
|
+
'recipient unknown',
|
86
|
+
'requested action not taken: mailbox unavailable',
|
87
|
+
'resolver.adr.recipient notfound',
|
88
|
+
'sorry, user unknown',
|
89
|
+
'sorry, badrcptto',
|
90
|
+
'sorry, no mailbox here by that name',
|
91
|
+
'sorry, your envelope recipient has been denied',
|
92
|
+
"that domain or user isn't in my list of allowed rcpthosts",
|
93
|
+
'the email account that you tried to reach does not exist',
|
94
|
+
'the following recipients was undeliverable',
|
95
|
+
"the user's email name is not found",
|
96
|
+
'there is no one at this address',
|
97
|
+
'this address no longer accepts mail',
|
98
|
+
'this email address is wrong or no longer valid',
|
99
|
+
'this recipient is in my badrecipientto list',
|
100
|
+
'this recipient is not in my validrcptto list',
|
101
|
+
'this spectator does not exist',
|
102
|
+
'unknown mailbox',
|
103
|
+
'unknown recipient',
|
104
|
+
'unknown user',
|
105
|
+
'user does not exist',
|
106
|
+
'user missing home directory',
|
107
|
+
'user not active',
|
108
|
+
'user not exist',
|
109
|
+
'user not found',
|
110
|
+
'user not known',
|
111
|
+
'user unknown',
|
112
|
+
'utilisateur inconnu !',
|
113
|
+
'vdeliver: invalid or unknown virtual user',
|
114
|
+
'your envelope recipient is in my badrcptto list',
|
115
|
+
].freeze
|
116
|
+
Pairs = [
|
117
|
+
['<', '> not found'],
|
118
|
+
['<', '>... blocked by '],
|
119
|
+
['account ', ' does not exist at the organization'],
|
120
|
+
['adresse d au moins un destinataire invalide. invalid recipient.', '416'],
|
121
|
+
['adresse d au moins un destinataire invalide. invalid recipient.', '418'],
|
122
|
+
['bad', 'recipient'],
|
123
|
+
['mailbox ', 'does not exist'],
|
124
|
+
['mailbox ', 'unavailable or access denied'],
|
125
|
+
['no ', ' in name directory'],
|
126
|
+
['non', 'existent user'],
|
127
|
+
['rcpt <', ' does not exist'],
|
128
|
+
['recipient ', ' was not found in'],
|
129
|
+
['recipient address rejected: user ', ' does not exist'],
|
130
|
+
['recipient address rejected: user unknown in ', ' table'],
|
131
|
+
['said: 550-5.1.1 ', ' user unknown '],
|
132
|
+
['said: 550 5.1.1 ', ' user unknown '],
|
133
|
+
["this user doesn't have a ", " account"],
|
134
|
+
['unknown e', 'mail address'],
|
135
|
+
['unknown local', 'part'],
|
136
|
+
['user ', ' was not found'],
|
137
|
+
['user ', ' does not exist'],
|
138
|
+
].freeze
|
157
139
|
|
158
140
|
def text; return 'userunknown'; end
|
159
141
|
def description; return "Email rejected due to a local part of a recipient's email address does not exist"; end
|
@@ -164,22 +146,23 @@ module Sisimai
|
|
164
146
|
# true: Matched
|
165
147
|
def match(argv1)
|
166
148
|
return nil unless argv1
|
167
|
-
return true if argv1
|
149
|
+
return true if Index.any? { |a| argv1.include?(a) }
|
150
|
+
return true if Pairs.any? { |a| Sisimai::String.aligned(argv1, a) }
|
168
151
|
return false
|
169
152
|
end
|
170
153
|
|
171
154
|
# Whether the address is "userunknown" or not
|
172
|
-
# @param [Sisimai::
|
155
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
173
156
|
# @return [True,False] true: is unknown user
|
174
157
|
# false: is not unknown user.
|
175
158
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
176
159
|
def true(argvs)
|
177
|
-
return true if argvs
|
160
|
+
return true if argvs['reason'] == 'userunknown'
|
178
161
|
|
179
|
-
tempreason = Sisimai::SMTP::Status.name(argvs
|
162
|
+
tempreason = Sisimai::SMTP::Status.name(argvs['deliverystatus']) || ''
|
180
163
|
return false if tempreason == 'suspend'
|
181
164
|
|
182
|
-
|
165
|
+
issuedcode = argvs['diagnosticcode'].downcase
|
183
166
|
if tempreason == 'userunknown'
|
184
167
|
# *.1.1 = 'Bad destination mailbox address'
|
185
168
|
# Status: 5.1.1
|
@@ -198,17 +181,17 @@ module Sisimai
|
|
198
181
|
next
|
199
182
|
end
|
200
183
|
|
201
|
-
next unless r.match(
|
184
|
+
next unless r.match(issuedcode)
|
202
185
|
# Match with reason defined in Sisimai::Reason::* except UserUnknown.
|
203
186
|
matchother = true
|
204
187
|
break
|
205
188
|
end
|
206
189
|
return true unless matchother # Did not match with other message patterns
|
207
190
|
|
208
|
-
elsif argvs
|
191
|
+
elsif argvs['smtpcommand'] == 'RCPT'
|
209
192
|
# When the SMTP command is not "RCPT", the session rejected by other
|
210
193
|
# reason, maybe.
|
211
|
-
return true if match(
|
194
|
+
return true if match(issuedcode)
|
212
195
|
end
|
213
196
|
|
214
197
|
return false
|
@@ -1,16 +1,15 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::Vacation is for only returning text and description.
|
4
|
-
#
|
3
|
+
# Sisimai::Reason::Vacation is for only returning text and description. This class is called only
|
4
|
+
# from Sisimai.reason method.
|
5
5
|
module Vacation
|
6
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/Vacation.pm
|
7
6
|
class << self
|
8
7
|
Index = [
|
9
8
|
'i am away on vacation',
|
10
9
|
'i am away until',
|
11
10
|
'i am out of the office',
|
12
11
|
'i will be traveling for work on',
|
13
|
-
]
|
12
|
+
].freeze
|
14
13
|
|
15
14
|
def text; return 'vacation'; end
|
16
15
|
def description; return 'Email replied automatically due to a recipient is out of office'; end
|