sisimai 4.22.2 → 4.22.3

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.

Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/ANALYTICAL-PRECISION +24 -23
  3. data/ChangeLog.md +39 -2
  4. data/README-JA.md +10 -10
  5. data/README.md +10 -10
  6. data/lib/sisimai.rb +0 -1
  7. data/lib/sisimai/bite/email.rb +1 -1
  8. data/lib/sisimai/bite/email/amazonses.rb +1 -2
  9. data/lib/sisimai/bite/email/exim.rb +46 -8
  10. data/lib/sisimai/bite/email/fml.rb +170 -0
  11. data/lib/sisimai/bite/email/imailserver.rb +1 -1
  12. data/lib/sisimai/bite/email/messagelabs.rb +6 -1
  13. data/lib/sisimai/bite/email/office365.rb +0 -1
  14. data/lib/sisimai/data.rb +34 -12
  15. data/lib/sisimai/datetime.rb +10 -4
  16. data/lib/sisimai/reason.rb +70 -55
  17. data/lib/sisimai/reason/blocked.rb +91 -21
  18. data/lib/sisimai/reason/expired.rb +7 -3
  19. data/lib/sisimai/reason/filtered.rb +1 -0
  20. data/lib/sisimai/reason/hostunknown.rb +9 -5
  21. data/lib/sisimai/reason/mailboxfull.rb +17 -9
  22. data/lib/sisimai/reason/mailererror.rb +5 -4
  23. data/lib/sisimai/reason/mesgtoobig.rb +2 -0
  24. data/lib/sisimai/reason/networkerror.rb +11 -3
  25. data/lib/sisimai/reason/norelaying.rb +5 -2
  26. data/lib/sisimai/reason/policyviolation.rb +9 -2
  27. data/lib/sisimai/reason/rejected.rb +41 -10
  28. data/lib/sisimai/reason/securityerror.rb +2 -0
  29. data/lib/sisimai/reason/spamdetected.rb +37 -20
  30. data/lib/sisimai/reason/suspend.rb +10 -4
  31. data/lib/sisimai/reason/systemerror.rb +1 -0
  32. data/lib/sisimai/reason/toomanyconn.rb +4 -0
  33. data/lib/sisimai/reason/userunknown.rb +40 -20
  34. data/lib/sisimai/reason/vacation.rb +20 -1
  35. data/lib/sisimai/reason/virusdetected.rb +3 -1
  36. data/lib/sisimai/rfc3464.rb +3 -4
  37. data/lib/sisimai/rfc3834.rb +37 -6
  38. data/lib/sisimai/rhost.rb +2 -1
  39. data/lib/sisimai/rhost/exchangeonline.rb +29 -0
  40. data/lib/sisimai/rhost/franceptt.rb +58 -0
  41. data/lib/sisimai/smtp/status.rb +1 -0
  42. data/lib/sisimai/version.rb +1 -1
  43. data/set-of-emails/jsonobj/json-amazonses-06.json +1 -0
  44. data/set-of-emails/maildir/bsd/email-exim-31.eml +39 -0
  45. data/set-of-emails/maildir/bsd/email-exim-32.eml +42 -0
  46. data/set-of-emails/maildir/bsd/email-exim-33.eml +42 -0
  47. data/set-of-emails/maildir/bsd/email-exim-34.eml +41 -0
  48. data/set-of-emails/maildir/bsd/email-exim-35.eml +41 -0
  49. data/set-of-emails/maildir/bsd/email-exim-36.eml +41 -0
  50. data/set-of-emails/maildir/bsd/email-exim-37.eml +41 -0
  51. data/set-of-emails/maildir/bsd/email-exim-38.eml +32 -0
  52. data/set-of-emails/maildir/bsd/email-exim-39.eml +47 -0
  53. data/set-of-emails/maildir/bsd/email-exim-40.eml +41 -0
  54. data/set-of-emails/maildir/bsd/email-exim-41.eml +32 -0
  55. data/set-of-emails/maildir/bsd/email-exim-42.eml +41 -0
  56. data/set-of-emails/maildir/bsd/email-exim-43.eml +60 -0
  57. data/set-of-emails/maildir/bsd/email-exim-44.eml +64 -0
  58. data/set-of-emails/maildir/bsd/email-exim-45.eml +43 -0
  59. data/set-of-emails/maildir/bsd/email-exim-46.eml +41 -0
  60. data/set-of-emails/maildir/bsd/email-exim-47.eml +42 -0
  61. data/set-of-emails/maildir/bsd/email-exim-48.eml +59 -0
  62. data/set-of-emails/maildir/bsd/email-exim-49.eml +59 -0
  63. data/set-of-emails/maildir/bsd/email-exim-50.eml +41 -0
  64. data/set-of-emails/maildir/bsd/email-exim-51.eml +41 -0
  65. data/set-of-emails/maildir/bsd/email-exim-52.eml +34 -0
  66. data/set-of-emails/maildir/bsd/email-exim-53.eml +48 -0
  67. data/set-of-emails/maildir/bsd/email-exim-54.eml +40 -0
  68. data/set-of-emails/maildir/bsd/email-exim-55.eml +38 -0
  69. data/set-of-emails/maildir/bsd/email-exim-56.eml +40 -0
  70. data/set-of-emails/maildir/bsd/email-exim-57.eml +39 -0
  71. data/set-of-emails/maildir/bsd/email-exim-58.eml +43 -0
  72. data/set-of-emails/maildir/bsd/email-fml-01.eml +70 -0
  73. data/set-of-emails/maildir/bsd/email-fml-02.eml +44 -0
  74. data/set-of-emails/maildir/bsd/email-office365-03.eml +117 -0
  75. data/set-of-emails/maildir/bsd/email-postfix-31.eml +94 -0
  76. data/set-of-emails/maildir/bsd/email-sendmail-45.eml +102 -0
  77. data/set-of-emails/maildir/bsd/email-sendmail-46.eml +103 -0
  78. data/set-of-emails/maildir/bsd/email-sendmail-47.eml +102 -0
  79. data/set-of-emails/maildir/bsd/email-sendmail-48.eml +101 -0
  80. data/set-of-emails/maildir/bsd/rfc3464-33.eml +38 -0
  81. data/set-of-emails/maildir/bsd/rfc3464-34.eml +53 -0
  82. data/set-of-emails/maildir/bsd/rhost-exchange-online-02.eml +89 -0
  83. data/set-of-emails/maildir/bsd/rhost-exchange-online-03.eml +205 -0
  84. data/set-of-emails/maildir/bsd/rhost-franceptt-01.eml +102 -0
  85. data/set-of-emails/maildir/bsd/rhost-franceptt-02.eml +103 -0
  86. metadata +47 -2
@@ -106,7 +106,7 @@ module Sisimai::Bite::Email
106
106
  # Original message follows.
107
107
  v = dscontents[-1]
108
108
 
109
- if cv = e.match(/\A(.+)[ ](.+)[:][ \t]*([^ ]+[@][^ ]+)/)
109
+ if cv = e.match(/\A([^ ]+)[ ](.+)[:][ \t]*([^ ]+[@][^ ]+)/)
110
110
  # Unknown user: kijitora@example.com
111
111
  if v['recipient']
112
112
  # There are multiple recipient addresses in the message body.
@@ -18,7 +18,12 @@ module Sisimai::Bite::Email
18
18
  :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
19
19
  }.freeze
20
20
  ReFailure = {
21
- userunknown: %r/No[ ]such[ ]user/x,
21
+ userunknown: %r{(?:
22
+ 542[ ].+[ ]Rejected
23
+ |No[ ]such[ ]user
24
+ )
25
+ }x,
26
+ securityerror: %r/Please turn on SMTP Authentication in your mail client/,
22
27
  }.freeze
23
28
  Indicators = Sisimai::Bite::Email.INDICATORS
24
29
 
@@ -29,7 +29,6 @@ module Sisimai::Bite::Email
29
29
  %r/\A4[.]7[.]26\z/ => 'securityerror',
30
30
  %r/\A4[.]7[.][56]\d\d\z/ => 'blocked',
31
31
  %r/\A4[.]7[.]8[5-9]\d\z/ => 'blocked',
32
- %r/\A5[.]1[.]0\z/ => 'userunknown',
33
32
  %r/\A5[.]4[.]1\z/ => 'norelaying',
34
33
  %r/\A5[.]4[.]6\z/ => 'networkerror',
35
34
  %r/\A5[.]6[.]11\z/ => 'contenterror',
data/lib/sisimai/data.rb CHANGED
@@ -257,7 +257,7 @@ module Sisimai
257
257
 
258
258
  # Subject: header of the original message
259
259
  p['subject'] = rfc822data['subject'] || ''
260
- p['subject'] = p['subject'].gsub(/\r\z/, '')
260
+ p['subject'] = p['subject'].scrub('?').gsub(/\r\z/, '')
261
261
 
262
262
  # The value of "List-Id" header
263
263
  p['listid'] = rfc822data['list-id'] || ''
@@ -285,20 +285,42 @@ module Sisimai
285
285
 
286
286
  # CHECK_DELIVERY_STATUS_VALUE:
287
287
  # Cleanup the value of "Diagnostic-Code:" header
288
- p['diagnosticcode'] = p['diagnosticcode'].sub(/[ \t]+#{EndOfEmail}/, '')
289
- d = Sisimai::SMTP::Status.find(p['diagnosticcode'])
290
- if d =~ /\A[45][.][1-9][.][1-9]\z/
291
- # Use the DSN value in Diagnostic-Code:
292
- p['deliverystatus'] = d
293
- end
288
+ p['diagnosticcode'] = p['diagnosticcode'].sub(/[ \t.]+#{EndOfEmail}/, '')
289
+
290
+ if p['diagnosticcode'].size > 0
291
+ # Count the number of D.S.N. and SMTP Reply Code
292
+ vs = Sisimai::SMTP::Status.find(p['diagnosticcode'])
293
+ vr = Sisimai::SMTP::Reply.find(p['diagnosticcode'])
294
+ vm = 0
295
+ re = nil
296
+
297
+ if vs.size > 0
298
+ # How many times does the D.S.N. appeared
299
+ vm += p['diagnosticcode'].scan(/\b#{vs}\b/).size
300
+ p['deliverystatus'] = vs if vs =~ /\A[45][.][1-9][.][1-9]\z/
301
+ end
294
302
 
295
- if p['reason'] == 'mailererror'
296
- p['diagnostictype'] ||= 'X-UNIX'
297
- else
298
- unless p['reason'] =~ /\A(?:feedback|vacation)\z/
299
- p['diagnostictype'] ||= 'SMTP'
303
+ if vr.size > 0
304
+ # How many times does the SMTP reply code appeared
305
+ vm += p['diagnosticcode'].scan(/\b#{vr}\b/).size
306
+ p['replycode'] ||= vr
307
+ end
308
+
309
+ if vm > 2
310
+ # Build regular expression for removing string like '550-5.1.1'
311
+ # from the value of "diagnosticcode"
312
+ re = %r/[ ]#{vr}[- ](?:#{vs})?/
313
+
314
+ # 550-5.7.1 [192.0.2.222] Our system has detected that this message is
315
+ # 550-5.7.1 likely unsolicited mail. To reduce the amount of spam sent to Gmail,
316
+ # 550-5.7.1 this message has been blocked. Please visit
317
+ # 550 5.7.1 https://support.google.com/mail/answer/188131 for more information.
318
+ p['diagnosticcode'] = p['diagnosticcode'].gsub(re, ' ')
319
+ p['diagnosticdoee'] = Sisimai::String.sweep(p['diagnosticcode'])
300
320
  end
301
321
  end
322
+ p['diagnostictype'] ||= 'X-UNIX' if p['reason'] == 'mailererror'
323
+ p['diagnostictype'] ||= 'SMTP' unless p['reason'] =~ /\A(?:feedback|vacation)\z/
302
324
 
303
325
  # Check the value of SMTP command
304
326
  p['smtpcommand'] = '' unless p['smtpcommand'] =~ rxcommands
@@ -346,12 +346,12 @@ module Sisimai
346
346
  elsif cr = p.match(/\A([0-2]\d):([0-5]\d)\z/)
347
347
  # Time; 12:34 => 12:34:00
348
348
  if cr[1].to_i < 24 && cr[2].to_i < 60
349
- v[:T] = sprintf('%02d:%02d:00', cr[1], cr[2])
349
+ v[:T] = sprintf('%02d:%02d:00', cr[1].to_i, cr[2].to_i)
350
350
  end
351
351
 
352
352
  elsif cr = p.match(/\A(\d\d?):(\d\d?)\z/)
353
353
  # Time: 1:4 => 01:04:00
354
- v[:T] = sprintf('%02d:%02d:00', cr[1], cr[2])
354
+ v[:T] = sprintf('%02d:%02d:00', cr[1].to_i, cr[2].to_i)
355
355
 
356
356
  elsif p =~ /\A[APap][Mm]\z/
357
357
  # AM or PM
@@ -382,7 +382,7 @@ module Sisimai
382
382
  v[:d] = cr[3].to_i if cr[3].to_i < 32
383
383
 
384
384
  if cr[4].to_i < 24 && cr[5].to_i < 60 && cr[6].to_i < 60
385
- v[:T] = sprintf('%02d:%02d:%02d', cr[4], cr[5], cr[6])
385
+ v[:T] = sprintf('%02d:%02d:%02d', cr[4].to_i, cr[5].to_i, cr[6].to_i)
386
386
  end
387
387
 
388
388
  elsif cr = p.match(%r|\A(\d{1,2})/(\d{1,2})/(\d{1,2})\z|)
@@ -391,6 +391,12 @@ module Sisimai
391
391
  v[:d] = cr[2].to_i
392
392
  v[:Y] = cr[3].to_i + 2000
393
393
  v[:Y] -= 100 if v[:Y].to_i > ::DateTime.now.year + 1
394
+
395
+ elsif cr = p.match(%r|\A(\d{1,2})[-/](\d{1,2})[-/](\d{4})|)
396
+ # 29-04-2017 22:22
397
+ v[:d] = cr[1].to_i if cr[1].to_i < 32
398
+ v[:M] = MonthName[:abbr][cr[2].to_i - 1]
399
+ v[:Y] = cr[3].to_i
394
400
  end
395
401
  end
396
402
  end
@@ -400,7 +406,7 @@ module Sisimai
400
406
  # +12
401
407
  t0 = v[:T]
402
408
  t1 = v[:T].split(':')
403
- v[:T] = sprintf('%02d:%02d:%02d', t1[0].to_i + 12, t1[1], t1[2])
409
+ v[:T] = sprintf('%02d:%02d:%02d', t1[0].to_i + 12, t1[1].to_i, t1[2].to_i)
404
410
  v[:T] = t0 if t1[0].to_i > 12
405
411
  end
406
412
  v[:a] ||= 'Thu' # There is no day of week
@@ -8,7 +8,10 @@ module Sisimai
8
8
  # Reason list better to retry detecting an error reason
9
9
  # @return [Array] Reason list
10
10
  def retry
11
- return %w|undefined onhold systemerror securityerror networkerror|
11
+ return %w|
12
+ undefined onhold systemerror securityerror networkerror
13
+ hostunknown userunknown
14
+ |
12
15
  end
13
16
  RetryReasons = Sisimai::Reason.retry
14
17
 
@@ -72,14 +75,16 @@ module Sisimai
72
75
 
73
76
  if reasontext == 'undefined' || reasontext.empty?
74
77
  # Action: delayed => "expired"
75
- if reasontext.nil? || reasontext.empty?
76
- reasontext = 'expired' if argvs.action == 'delayed'
77
- end
78
- if reasontext.nil? || reasontext.empty?
79
- reasontext = 'onhold' if argvs.diagnosticcode.size > 0
78
+ reasontext = nil
79
+ reasontext ||= 'expired' if argvs.action == 'delayed'
80
+ unless reasontext
81
+ # Try to match with message patterns in Sisimai::Reason::Vacation
82
+ require 'sisimai/reason/vacation'
83
+ reasontext = 'vacation' if Sisimai::Reason::Vacation.match(argvs.diagnosticcode)
80
84
  end
85
+ reasontext ||= 'onhold' if argvs.diagnosticcode.size > 0
81
86
  end
82
- reasontext = 'undefined' if reasontext.nil? || reasontext.empty?
87
+ reasontext ||= 'undefined'
83
88
  end
84
89
  return reasontext
85
90
  end
@@ -97,6 +102,7 @@ module Sisimai
97
102
  statuscode = argvs.deliverystatus || ''
98
103
  diagnostic = argvs.diagnosticcode || ''
99
104
  commandtxt = argvs.smtpcommand || ''
105
+ trytomatch = nil
100
106
  reasontext = ''
101
107
  classorder = %w|
102
108
  MailboxFull SpamDetected PolicyViolation VirusDetected SecurityError
@@ -107,60 +113,69 @@ module Sisimai
107
113
  require 'sisimai/smtp/status'
108
114
  reasontext = Sisimai::SMTP::Status.name(statuscode)
109
115
 
110
- if reasontext.empty? || reasontext == 'userunknown' || RetryReasons.index(reasontext)
111
- # Could not decide the reason by the value of Status:
112
- classorder.each do |e|
113
- # Trying to match with other patterns in Sisimai::Reason::* classes
114
- p = 'Sisimai::Reason::' + e
115
- r = nil
116
- begin
117
- require p.downcase.gsub('::', '/')
118
- r = Module.const_get(p)
119
- rescue
120
- warn ' ***warning: Failed to load ' + p
121
- next
122
- end
116
+ catch :TRY_TO_MATCH do
117
+ loop do
118
+ trytomatch ||= true if reasontext.empty?
119
+ trytomatch ||= true if RetryReasons.index(reasontext)
120
+ trytomatch ||= true if argvs.diagnostictype != 'SMTP'
121
+ throw :TRY_TO_MATCH unless trytomatch
122
+
123
+ # Could not decide the reason by the value of Status:
124
+ classorder.each do |e|
125
+ # Trying to match with other patterns in Sisimai::Reason::* classes
126
+ p = 'Sisimai::Reason::' + e
127
+ r = nil
128
+ begin
129
+ require p.downcase.gsub('::', '/')
130
+ r = Module.const_get(p)
131
+ rescue
132
+ warn ' ***warning: Failed to load ' + p
133
+ next
134
+ end
123
135
 
124
- next unless r.match(diagnostic)
125
- reasontext = e.downcase
126
- break
127
- end
136
+ next unless r.match(diagnostic)
137
+ reasontext = e.downcase
138
+ break
139
+ end
128
140
 
129
- if reasontext.empty?
130
- # Check the value of Status:
131
- v = statuscode[0, 3]
132
- if v == '5.6' || v == '4.6'
133
- # X.6.0 Other or undefined media error
134
- reasontext = 'contenterror'
135
-
136
- elsif v == '5.7' || v == '4.7'
137
- # X.7.0 Other or undefined security status
138
- reasontext = 'securityerror'
139
-
140
- elsif argvs.diagnostictype =~ /\AX-(?:UNIX|POSTFIX)\z/
141
- # Diagnostic-Code: X-UNIX; ...
142
- reasontext = 'mailererror'
143
-
144
- else
145
- # 50X Syntax Error?
146
- require 'sisimai/reason/syntaxerror'
147
- reasontext = 'syntaxerror' if Sisimai::Reason::SyntaxError.true(argvs)
141
+ if reasontext.empty?
142
+ # Check the value of Status:
143
+ v = statuscode[0, 3]
144
+ if v == '5.6' || v == '4.6'
145
+ # X.6.0 Other or undefined media error
146
+ reasontext = 'contenterror'
147
+
148
+ elsif v == '5.7' || v == '4.7'
149
+ # X.7.0 Other or undefined security status
150
+ reasontext = 'securityerror'
151
+
152
+ elsif argvs.diagnostictype =~ /\AX-(?:UNIX|POSTFIX)\z/
153
+ # Diagnostic-Code: X-UNIX; ...
154
+ reasontext = 'mailererror'
155
+
156
+ else
157
+ # 50X Syntax Error?
158
+ require 'sisimai/reason/syntaxerror'
159
+ reasontext = 'syntaxerror' if Sisimai::Reason::SyntaxError.true(argvs)
160
+ end
148
161
  end
149
- end
150
162
 
151
- if reasontext.empty?
152
- # Check the value of Action: field, first
153
- if argvs.action =~ /\A(?:delayed|expired)/
154
- # Action: delayed, expired
155
- reasontext = 'expired'
156
-
157
- else
158
- # Check the value of SMTP command
159
- if commandtxt =~ /\A(?:EHLO|HELO)\z/
160
- # Rejected at connection or after EHLO|HELO
161
- reasontext = 'blocked'
163
+ if reasontext.empty?
164
+ # Check the value of Action: field, first
165
+ if argvs.action =~ /\A(?:delayed|expired)/
166
+ # Action: delayed, expired
167
+ reasontext = 'expired'
168
+
169
+ else
170
+ # Check the value of SMTP command
171
+ if commandtxt =~ /\A(?:EHLO|HELO)\z/
172
+ # Rejected at connection or after EHLO|HELO
173
+ reasontext = 'blocked'
174
+ end
162
175
  end
163
176
  end
177
+
178
+ throw :TRY_TO_MATCH
164
179
  end
165
180
  end
166
181
  return reasontext
@@ -23,56 +23,126 @@ module Sisimai
23
23
  regex = %r{(?>
24
24
  access[ ]denied[.][ ]IP[ ]name[ ]lookup[ ]failed
25
25
  |access[ ]from[ ]ip[ ]address[ ].+[ ]blocked
26
+ |all[ ]mail[ ]servers[ ]must[ ]have[ ]a[ ]PTR[ ]record[ ]with[ ]a[ ]valid[ ]Reverse[ ]DNS[ ]entry
27
+ |Bad[ ]sender[ ]IP[ ]address
26
28
  |blacklisted[ ]by
27
- |Blocked[ ]-[ ]see[ ]https://support[.]proofpoint[.]com/dnsbl-lookup[.]cgi[?]ip=.+
29
+ |(?:Blocked|Refused)[ ]-[ ]see[ ]https?://
28
30
  |can[']t[ ]determine[ ]Purported[ ]Responsible[ ]Address
29
31
  |cannot[ ]resolve[ ]your[ ]address
30
- |client[ ]host[ ].+[ ]blocked[ ]using
31
- |client[ ]host[ ]rejected:[ ](?:
32
- may[ ]not[ ]be[ ]mail[ ]exchanger
33
- |cannot[ ]find[ ]your[ ]hostname # Yahoo!
34
- |was[ ]not[ ]authenticated # Microsoft
32
+ |client[ ]host[ ](?:
33
+ .+[ ]blocked[ ]using
34
+ |rejected:[ ](?:
35
+ Abus[ ]detecte[ ]GU_EIB_0[24] # SFR
36
+ |cannot[ ]find[ ]your[ ]hostname # Yahoo!
37
+ |may[ ]not[ ]be[ ]mail[ ]exchanger
38
+ |was[ ]not[ ]authenticated # Microsoft
39
+ )
35
40
  )
36
41
  |confirm[ ]this[ ]mail[ ]server
37
42
  |connection[ ](?:
38
- dropped
39
- |refused[ ]by
40
- |reset[ ]by[ ]peer
41
- |was[ ]dropped[ ]by[ ]remote[ ]host
42
- )
43
- |domain[ ]does[ ]not[ ]exist:
44
- |domain[ ].+[ ]mismatches[ ]client[ ]ip
43
+ dropped
44
+ |refused[ ]by
45
+ |reset[ ]by[ ]peer
46
+ |was[ ]dropped[ ]by[ ]remote[ ]host
47
+ )
48
+ |Connections[ ](?:
49
+ not[ ]accepted[ ]from[ ]IP[ ]addresses[ ]on[ ]Spamhaus[ ]XBL
50
+ |will[ ]not[ ]be[ ]accepted[ ]from[ ].+because[ ]the[ ]ip[ ]is[ ]in[ ]Spamhaus's[ ]list
51
+ )
52
+ |Currently[ ]Sending[ ]Spam[ ]See:[ ]
53
+ |domain[ ](?:
54
+ .+[ ]mismatches[ ]client[ ]ip
55
+ |does[ ]not[ ]exist:
56
+ )
45
57
  |dns[ ]lookup[ ]failure:[ ].+[ ]try[ ]again[ ]later
46
58
  |DNSBL:ATTRBL
59
+ |Dynamic/zombied/spam[ ]IPs[ ]blocked
60
+ |Email[ ]blocked[ ]by[ ](?:.+[.]barracudacentral[.]org|SPAMHAUS)
61
+ |Fix[ ]reverse[ ]DNS[ ]for[ ].+
47
62
  |Go[ ]away
63
+ |host[ ].+[ ]refused[ ]to[ ]talk[ ]to[ ]me:[ ]\d+[ ]Blocked
48
64
  |hosts[ ]with[ ]dynamic[ ]ip
65
+ |http://(?:
66
+ spf[.]pobox[.]com/why[.]html
67
+ |www[.]spamcop[.]net/bl[.]
68
+ )
69
+ |INVALID[ ]IP[ ]FOR[ ]SENDING[ ]MAIL[ ]OF[ ]DOMAIN
49
70
  |IP[ ]\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}[ ]is[ ]blocked[ ]by[ ]EarthLink # Earthlink
50
71
  |IP[/]domain[ ]reputation[ ]problems
51
- |is[ ]not[ ]allowed[ ]to[ ]send[ ]mail[ ]from
72
+ |is[ ](?:
73
+ in[ ]a[ ]black[ ]list[ ]at[ ].+[.]
74
+ |in[ ]an[ ].*RBL[ ]on[ ].+
75
+ |not[ ]allowed[ ]to[ ]send[ ](?:
76
+ mail[ ]from
77
+ |from[ ].+[ ]per[ ]it's[ ]SPF[ ]Record
78
+ )
79
+ )
52
80
  |mail[ ]server[ ]at[ ].+[ ]is[ ]blocked
81
+ |Mail[ ]from[ ]\d+[.]\d+[.]\d+[.]\d[ ]refused:
82
+ |Message[ ]from[ ].+[ ]rejected[ ]based[ ]on[ ]blacklist
53
83
  |Messages[ ]from[ ].+[ ]temporarily[ ]deferred[ ]due[ ]to[ ]user[ ]complaints # Yahoo!
54
- |no[ ]access[ ]from[ ]mail[ ]server
84
+ |no[ ](?:
85
+ access[ ]from[ ]mail[ ]server
86
+ |PTR[ ]Record[ ]found[.]
87
+ )
55
88
  |Not[ ]currently[ ]accepting[ ]mail[ ]from[ ]your[ ]ip # Microsoft
56
- |Please[ ]get[ ]a[ ]custom[ ]reverse[ ]DNS[ ]name[ ]from[ ]your[ ]ISP[ ]for[ ]your[ ]host
57
- |please[ ]use[ ]the[ ]smtp[ ]server[ ]of[ ]your[ ]ISP
89
+ |part[ ]of[ ]their[ ]network[ ]is[ ]on[ ]our[ ]block[ ]list
90
+ |Please[ ](?:
91
+ get[ ]a[ ]custom[ ]reverse[ ]DNS[ ]name[ ]from[ ]your[ ]ISP[ ]for[ ]your[ ]host
92
+ |inspect[ ]your[ ]SPF[ ]settings
93
+ |use[ ]the[ ]smtp[ ]server[ ]of[ ]your[ ]ISP
94
+ )
95
+ |PTR[ ]record[ ]setup
58
96
  |Rejecting[ ]open[ ]proxy # Sendmail(srvrsmtp.c)
97
+ |Reverse[ ]DNS[ ](?:
98
+ failed
99
+ |required
100
+ |lookup[ ]for[ ]host[ ].+[ ]failed[ ]permanently
101
+ )
102
+ |Sender[ ]IP[ ](?:
103
+ address[ ]rejected
104
+ |reverse[ ]lookup[ ]rejected
105
+ )
106
+ |Server[ ]access[ ](?:
107
+ .+[ ]forbidden[ ]by[ ]invalid[ ]RDNS[ ]record[ ]of[ ]your[ ]mail[ ]server
108
+ |forbidden[ ]by[ ]your[ ]IP[ ]
109
+ )
110
+ |Server[ ]IP[ ].+[ ]listed[ ]as[ ]abusive
111
+ |service[ ]permits[ ]\d+[ ]unverifyable[ ]sending[ ]IPs
112
+ |SMTP[ ]error[ ]from[ ]remote[ ]mail[ ]server[ ]after[ ]initial[ ]connection: # Exim
59
113
  |sorry,[ ](?:
60
114
  that[ ]domain[ ]isn'?t[ ]in[ ]my[ ]list[ ]of[ ]allowed[ ]rcpthosts
61
115
  |your[ ]remotehost[ ]looks[ ]suspiciously[ ]like[ ]spammer
62
116
  )
63
- |SPF[ ]record
117
+ |SPF[ ](?:
118
+ .+[ ]domain[ ]authentication[ ]fail
119
+ |record
120
+ |check:[ ]fail
121
+ )
122
+ |SPF:[ ].+[ ]is[ ]not[ ]allowed[ ]to[ ]send[ ]mail.+[A-Z]{3}.+401
64
123
  |the[ ](?:email|domain|ip).+[ ]is[ ]blacklisted
124
+ |This[ ]system[ ]will[ ]not[ ]accept[ ]messages[ ]from[ ]servers[/]devices[ ]with[ ]no[ ]reverse[ ]DNS
125
+ |Too[ ]many[ ]spams[ ]from[ ]your[ ]IP # free.fr
65
126
  |unresolvable[ ]relay[ ]host[ ]name
127
+ |Veuillez[ ]essayer[ ]plus[ ]tard.+[A-Z]{3}.+(?:103|510)
66
128
  |your[ ](?:
67
129
  network[ ]is[ ]temporary[ ]blacklisted
130
+ |sender's[ ]IP[ ]address[ ]is[ ]listed[ ]at[ ].+[.]abuseat[.]org
68
131
  |server[ ]requires[ ]confirmation
69
132
  )
70
133
  |was[ ]blocked[ ]by[ ].+
71
134
  |we[ ]do[ ]not[ ]accept[ ]mail[ ]from[ ](?: # @mail.ru
72
- hosts[ ]with[ ]dynamic[ ]IP[ ]or[ ]generic[ ]dns[ ]PTR-records
73
- |dynamic[ ]ips
135
+ dynamic[ ]ips
136
+ |hosts[ ]with[ ]dynamic[ ]IP[ ]or[ ]generic[ ]dns[ ]PTR-records
137
+ )
138
+ |You[ ]are[ ](?:
139
+ not[ ]allowed[ ]to[ ]connect
140
+ |sending[ ]spam
141
+ )
142
+ |Your[ ](?:
143
+ access[ ]to[ ]submit[ ]messages[ ]to[ ]this[ ]e-mail[ ]system[ ]has[ ]been[ ]rejected
144
+ |message[ ]was[ ]rejected[ ]for[ ]possible[ ]spam/virus[ ]content
74
145
  )
75
- |http://www[.]spamcop[.]net/bl[.]
76
146
  )
77
147
  }xi
78
148