sisimai 4.25.16-java → 5.0.2-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/rake-test.yml +55 -0
- data/.travis.yml +3 -3
- data/ANALYTICAL-PRECISION +2 -2
- data/Benchmarks.mk +3 -3
- data/CONTRIBUTING +1 -1
- data/ChangeLog.md +451 -393
- data/Developers.mk +5 -6
- data/Gemfile +1 -1
- data/Makefile +15 -15
- data/README-JA.md +323 -149
- data/README.md +319 -149
- 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 +506 -0
- data/lib/sisimai/lhost/activehunter.rb +12 -14
- data/lib/sisimai/lhost/amavis.rb +11 -14
- data/lib/sisimai/lhost/amazonses.rb +37 -42
- data/lib/sisimai/lhost/amazonworkmail.rb +15 -19
- data/lib/sisimai/lhost/aol.rb +12 -15
- data/lib/sisimai/lhost/apachejames.rb +19 -21
- data/lib/sisimai/lhost/barracuda.rb +10 -12
- data/lib/sisimai/lhost/bigfoot.rb +21 -22
- data/lib/sisimai/lhost/biglobe.rb +15 -16
- data/lib/sisimai/lhost/courier.rb +20 -20
- data/lib/sisimai/lhost/domino.rb +23 -20
- data/lib/sisimai/lhost/einsundeins.rb +23 -18
- data/lib/sisimai/lhost/exchange2003.rb +30 -29
- data/lib/sisimai/lhost/exchange2007.rb +70 -58
- data/lib/sisimai/lhost/exim.rb +179 -174
- data/lib/sisimai/lhost/ezweb.rb +31 -56
- data/lib/sisimai/lhost/facebook.rb +21 -34
- 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 +11 -11
- data/lib/sisimai/lhost/gsuite.rb +21 -28
- 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 +37 -40
- data/lib/sisimai/lhost/mcafee.rb +21 -31
- data/lib/sisimai/lhost/messagelabs.rb +17 -21
- data/lib/sisimai/lhost/messagingserver.rb +40 -37
- data/lib/sisimai/lhost/mfilter.rb +16 -17
- data/lib/sisimai/lhost/mxlogic.rb +24 -33
- data/lib/sisimai/lhost/notes.rb +17 -17
- data/lib/sisimai/lhost/office365.rb +64 -28
- data/lib/sisimai/lhost/opensmtpd.rb +12 -13
- data/lib/sisimai/lhost/outlook.rb +12 -16
- data/lib/sisimai/lhost/postfix.rb +179 -130
- data/lib/sisimai/lhost/powermta.rb +12 -14
- data/lib/sisimai/lhost/qmail.rb +44 -47
- data/lib/sisimai/lhost/receivingses.rb +15 -21
- data/lib/sisimai/lhost/sendgrid.rb +34 -34
- data/lib/sisimai/lhost/sendmail.rb +65 -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 -21
- 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 +444 -326
- data/lib/sisimai/order.rb +5 -5
- data/lib/sisimai/reason/authfailure.rb +65 -0
- data/lib/sisimai/reason/badreputation.rb +53 -0
- data/lib/sisimai/reason/blocked.rb +96 -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 +7 -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 +11 -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 +34 -36
- data/lib/sisimai/reason/spamdetected.rb +115 -147
- data/lib/sisimai/reason/speeding.rb +49 -0
- data/lib/sisimai/reason/suspend.rb +12 -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 +177 -146
- 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/google.rb +530 -0
- 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 +51 -42
- data/lib/sisimai/rhost/nttdocomo.rb +12 -12
- 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 +507 -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 +46 -31
- 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/lhost-sendmail-60.eml +85 -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 +48 -26
- 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/lib/sisimai/rhost/googleapps.rb +0 -261
- /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,151 +1,119 @@
|
|
1
1
|
module Sisimai
|
2
2
|
module Reason
|
3
|
-
# Sisimai::Reason::SpamDetected checks the bounce reason is "spamdetected"
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# This is the error that the message you sent was rejected by "spam filter"
|
8
|
-
# which is running on the remote host.
|
9
|
-
# This reason has added in Sisimai 4.1.25 and does not exist in any version
|
10
|
-
# of bounceHammer.
|
3
|
+
# Sisimai::Reason::SpamDetected checks the bounce reason is "spamdetected" due to Spam content
|
4
|
+
# in the message or not. This class is called only Sisimai::Reason class. This is the error that
|
5
|
+
# the message you sent was rejected by "spam filter" which is running on the remote host.
|
11
6
|
#
|
12
7
|
# Action: failed
|
13
8
|
# Status: 5.7.1
|
14
9
|
# Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, UBE, id=00000-00-000
|
15
10
|
# Last-Attempt-Date: Thu, 9 Apr 2008 23:34:45 +0900 (JST)
|
16
11
|
module SpamDetected
|
17
|
-
# Imported from p5-Sisimail/lib/Sisimai/Reason/SpamDetected.pm
|
18
12
|
class << self
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|was[ ]rejected[ ]by[ ]recurrent[ ]pattern[ ]detection[ ]system
|
124
|
-
)
|
125
|
-
|transaction[ ]failed[ ]spam[ ]message[ ]not[ ]queued # SendGrid
|
126
|
-
|we[ ]dont[ ]accept[ ]spam
|
127
|
-
|you're[ ]using[ ]a[ ]mass[ ]mailer
|
128
|
-
|your[ ](?:
|
129
|
-
email[ ](?:
|
130
|
-
appears[ ]similar[ ]to[ ]spam[ ]we[ ]have[ ]received[ ]before
|
131
|
-
|breaches[ ]local[ ]uribl[ ]policy
|
132
|
-
|had[ ]spam[-]like[ ]
|
133
|
-
|is[ ](?:considered|probably)[ ]spam
|
134
|
-
|was[ ]detected[ ]as[ ]spam
|
135
|
-
)
|
136
|
-
|message[ ](?:
|
137
|
-
as[ ]spam[ ]and[ ]has[ ]prevented[ ]delivery
|
138
|
-
|has[ ]been[ ](?:
|
139
|
-
temporarily[ ]blocked[ ]by[ ]our[ ]filter
|
140
|
-
|rejected[ ]because[ ]it[ ]appears[ ]to[ ]be[ ]spam
|
141
|
-
)
|
142
|
-
|has[ ]triggered[ ]a[ ]spam[ ]block
|
143
|
-
|may[ ]contain[ ]the[ ]spam[ ]contents
|
144
|
-
|failed[ ]several[ ]antispam[ ]checks
|
145
|
-
)
|
146
|
-
)
|
147
|
-
)
|
148
|
-
}x
|
13
|
+
require 'sisimai/string'
|
14
|
+
|
15
|
+
Index = [
|
16
|
+
' - spam',
|
17
|
+
'//www.spamhaus.org/help/help_spam_16.htm',
|
18
|
+
'//dsbl.org/help/help_spam_16.htm',
|
19
|
+
'//mail.163.com/help/help_spam_16.htm',
|
20
|
+
'554 5.7.0 reject, id=',
|
21
|
+
'appears to be unsolicited',
|
22
|
+
'blacklisted url in message',
|
23
|
+
'block for spam',
|
24
|
+
'blocked by policy: no spam please',
|
25
|
+
'blocked by spamassassin', # rejected by SpamAssassin
|
26
|
+
'blocked for abuse. see http://att.net/blocks', # AT&T
|
27
|
+
'cannot be forwarded because it was detected as spam',
|
28
|
+
'considered unsolicited bulk e-mail (spam) by our mail filters',
|
29
|
+
'content filter rejection',
|
30
|
+
'cyberoam anti spam engine has identified this email as a bulk email',
|
31
|
+
'denied due to spam list',
|
32
|
+
'high probability of spam',
|
33
|
+
'is classified as spam and is rejected',
|
34
|
+
'listed in work.drbl.imedia.ru',
|
35
|
+
'the mail server detected your message as spam and has prevented delivery.', # CPanel/Exim with SA rejections on
|
36
|
+
'mail appears to be unsolicited', # rejected due to spam
|
37
|
+
'mail content denied', # http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726
|
38
|
+
'may consider spam',
|
39
|
+
'message considered as spam or virus',
|
40
|
+
'message contains spam or virus',
|
41
|
+
'message content rejected',
|
42
|
+
'message detected as spam',
|
43
|
+
'message filtered',
|
44
|
+
'message filtered. please see the faqs section on spam',
|
45
|
+
'message filtered. refer to the troubleshooting page at ',
|
46
|
+
'message looks like spam',
|
47
|
+
'message is being rejected as it seems to be a spam',
|
48
|
+
'message refused by mailmarshal spamprofiler',
|
49
|
+
'message refused by trustwave seg spamprofiler',
|
50
|
+
'message rejected as spam',
|
51
|
+
'message rejected because of unacceptable content',
|
52
|
+
'message rejected due to suspected spam content',
|
53
|
+
'message rejected for policy reasons',
|
54
|
+
'message was rejected for possible spam/virus content',
|
55
|
+
'our email server thinks this email is spam',
|
56
|
+
'our system has detected that this message is ',
|
57
|
+
'probable spam',
|
58
|
+
'reject bulk.advertising',
|
59
|
+
'rejected: spamassassin score ',
|
60
|
+
'rejected - bulk email',
|
61
|
+
'rejecting banned content',
|
62
|
+
'rejecting mail content',
|
63
|
+
'related to content with spam-like characteristics',
|
64
|
+
'sender domain listed at ',
|
65
|
+
'sending address not accepted due to spam filter',
|
66
|
+
'spam blocked',
|
67
|
+
'spam check',
|
68
|
+
'spam content matched',
|
69
|
+
'spam detected',
|
70
|
+
'spam email',
|
71
|
+
'spam email not accepted',
|
72
|
+
'spam message rejected.', # mail.ru
|
73
|
+
'spam not accepted',
|
74
|
+
'spam refused',
|
75
|
+
'spam rejection',
|
76
|
+
'spam score ',
|
77
|
+
'spambouncer identified spam', # SpamBouncer identified SPAM
|
78
|
+
'spamming not allowed',
|
79
|
+
'too many spam complaints',
|
80
|
+
'too much spam.', # Earthlink
|
81
|
+
'the email message was detected as spam',
|
82
|
+
'the message has been rejected by spam filtering engine',
|
83
|
+
'the message was rejected due to classification as bulk mail',
|
84
|
+
'the content of this message looked like spam', # SendGrid
|
85
|
+
'this message appears to be spam',
|
86
|
+
'this message has been identified as spam',
|
87
|
+
'this message has been scored as spam with a probability',
|
88
|
+
'this message was classified as spam',
|
89
|
+
'this message was rejected by recurrent pattern detection system',
|
90
|
+
'transaction failed spam message not queued', # SendGrid
|
91
|
+
'we dont accept spam',
|
92
|
+
'your email appears similar to spam we have received before',
|
93
|
+
'your email breaches local uribl policy',
|
94
|
+
'your email had spam-like ',
|
95
|
+
'your email is considered spam',
|
96
|
+
'your email is probably spam',
|
97
|
+
'your email was detected as spam',
|
98
|
+
'your message as spam and has prevented delivery',
|
99
|
+
'your message has been temporarily blocked by our filter',
|
100
|
+
'your message has been rejected because it appears to be spam',
|
101
|
+
'your message has triggered a spam block',
|
102
|
+
'your message may contain the spam contents',
|
103
|
+
'your message failed several antispam checks',
|
104
|
+
].freeze
|
105
|
+
Pairs = [
|
106
|
+
['greylisted', ' please try again in'],
|
107
|
+
['mail rejete. mail rejected. ', '506'],
|
108
|
+
['our filters rate at and above ', ' percent probability of being spam'],
|
109
|
+
['rejected by ', ' (spam)'],
|
110
|
+
['rejected due to spam ', 'classification'],
|
111
|
+
['rejected due to spam ', 'content'],
|
112
|
+
['rule imposed as ', ' is blacklisted on'],
|
113
|
+
['spam ', ' exceeded'],
|
114
|
+
['this message scored ', ' spam points'],
|
115
|
+
].freeze
|
116
|
+
Regex = %r/(?:\d[.]\d[.]\d|\d{3})[ ]spam\z/.freeze
|
149
117
|
|
150
118
|
def text; return 'spamdetected'; end
|
151
119
|
def description; return 'Email rejected by spam filter running on the remote host'; end
|
@@ -156,25 +124,27 @@ module Sisimai
|
|
156
124
|
# true: Matched
|
157
125
|
def match(argv1)
|
158
126
|
return nil unless argv1
|
127
|
+
return true if Index.any? { |a| argv1.include?(a) }
|
128
|
+
return true if Pairs.any? { |a| Sisimai::String.aligned(argv1, a) }
|
159
129
|
return true if argv1 =~ Regex
|
160
130
|
return false
|
161
131
|
end
|
162
132
|
|
163
133
|
# Rejected due to spam content in the message
|
164
|
-
# @param [Sisimai::
|
134
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
165
135
|
# @return [True,False] true: rejected due to spam
|
166
136
|
# false: is not rejected due to spam
|
167
137
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
168
138
|
def true(argvs)
|
169
|
-
return nil if argvs
|
170
|
-
return true if argvs
|
171
|
-
return true if Sisimai::SMTP::Status.name(argvs
|
139
|
+
return nil if argvs['deliverystatus'].empty?
|
140
|
+
return true if argvs['reason'] == 'spamdetected'
|
141
|
+
return true if Sisimai::SMTP::Status.name(argvs['deliverystatus']).to_s == 'spamdetected'
|
172
142
|
|
173
143
|
# The value of "reason" isn't "spamdetected" when the value of "smtpcommand" is an SMTP
|
174
144
|
# command to be sent before the SMTP DATA command because all the MTAs read the headers
|
175
145
|
# and the entire message body after the DATA command.
|
176
|
-
return false if %w[CONN EHLO HELO MAIL RCPT].include?(argvs
|
177
|
-
return true if match(argvs
|
146
|
+
return false if %w[CONN EHLO HELO MAIL RCPT].include?(argvs['smtpcommand'])
|
147
|
+
return true if match(argvs['diagnosticcode'].downcase)
|
178
148
|
return false
|
179
149
|
end
|
180
150
|
|
@@ -183,5 +153,3 @@ module Sisimai
|
|
183
153
|
end
|
184
154
|
end
|
185
155
|
|
186
|
-
|
187
|
-
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module Reason
|
3
|
+
# Sisimai::Reason::Speeding checks the bounce reason is "speeding" or not. This class is called
|
4
|
+
# only Sisimai::Reason class. This is the error that a connection rejected due to exceeding a
|
5
|
+
# rate limit or sending too fast.
|
6
|
+
module Speeding
|
7
|
+
class << self
|
8
|
+
Index = [
|
9
|
+
'mail sent from your IP address has been temporarily rate limited',
|
10
|
+
'please try again slower',
|
11
|
+
'receiving mail at a rate that prevents additional messages from being delivered',
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
def text; return 'speeding'; end
|
15
|
+
def description; return 'Rejected due to exceeding a rate limit or sending too fast'; end
|
16
|
+
|
17
|
+
# Try to match that the given text and regular expressions
|
18
|
+
# @param [String] argv1 String to be matched with regular expressions
|
19
|
+
# @return [True,False] false: Did not match
|
20
|
+
# true: Matched
|
21
|
+
def match(argv1)
|
22
|
+
return nil unless argv1
|
23
|
+
return true if Index.any? { |a| argv1.include?(a) }
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
|
27
|
+
# Speeding or not
|
28
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
29
|
+
# @return [True,False] true: is speeding
|
30
|
+
# false: is not speeding
|
31
|
+
# @see http://www.ietf.org/rfc/rfc2822.txt
|
32
|
+
def true(argvs)
|
33
|
+
return nil if argvs['deliverystatus'].empty?
|
34
|
+
return true if argvs['reason'] == 'speeding'
|
35
|
+
|
36
|
+
# Action: failed
|
37
|
+
# Status: 4.7.1
|
38
|
+
# Remote-MTA: dns; smtp.example.jp
|
39
|
+
# Diagnostic-Code: smtp; 451 4.7.1 <mx.example.org[192.0.2.2]>: Client host rejected:
|
40
|
+
# Please try again slower
|
41
|
+
return true if match(argvs['diagnosticcode'].downcase)
|
42
|
+
return false
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -1,31 +1,31 @@
|
|
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',
|
22
21
|
'recipient rejected: temporarily inactive',
|
23
22
|
'recipient suspend the service',
|
24
23
|
'this account has been disabled or discontinued',
|
24
|
+
'this address no longer accepts mail',
|
25
25
|
'this mailbox is disabled',
|
26
26
|
'user suspended', # http://mail.163.com/help/help_spam_16.htm
|
27
27
|
'vdelivermail: account is locked email bounced',
|
28
|
-
]
|
28
|
+
].freeze
|
29
29
|
|
30
30
|
def text; return 'suspend'; end
|
31
31
|
def description; return 'Email rejected due to a recipient account is being suspended'; end
|
@@ -41,14 +41,15 @@ module Sisimai
|
|
41
41
|
end
|
42
42
|
|
43
43
|
# The envelope recipient's mailbox is suspended or not
|
44
|
-
# @param [Sisimai::
|
44
|
+
# @param [Sisimai::Fact] argvs Object to be detected the reason
|
45
45
|
# @return [True,False] true: is mailbox suspended
|
46
46
|
# false: is not suspended
|
47
47
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
48
48
|
def true(argvs)
|
49
|
-
return nil if argvs
|
50
|
-
return true if argvs
|
51
|
-
return true if
|
49
|
+
return nil if argvs['deliverystatus'].empty?
|
50
|
+
return true if argvs['reason'] == 'suspend'
|
51
|
+
return true if argvs['replycode'].to_i == 525
|
52
|
+
return true if match(argvs['diagnosticcode'].downcase)
|
52
53
|
return false
|
53
54
|
end
|
54
55
|
|
@@ -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
|