sisimai 5.4.1-java → 5.6.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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codecovio.yml +1 -1
  3. data/.github/workflows/rake-test.yml +1 -1
  4. data/ChangeLog.md +56 -0
  5. data/LICENSE +1 -1
  6. data/Makefile +2 -4
  7. data/README-JA.md +29 -23
  8. data/README.md +30 -24
  9. data/lib/sisimai/address.rb +92 -44
  10. data/lib/sisimai/arf.rb +7 -8
  11. data/lib/sisimai/datetime.rb +2 -2
  12. data/lib/sisimai/fact/json.rb +1 -2
  13. data/lib/sisimai/fact/yaml.rb +1 -2
  14. data/lib/sisimai/fact.rb +76 -36
  15. data/lib/sisimai/lda.rb +2 -2
  16. data/lib/sisimai/lhost/activehunter.rb +4 -5
  17. data/lib/sisimai/lhost/amazonses.rb +4 -5
  18. data/lib/sisimai/lhost/apachejames.rb +2 -2
  19. data/lib/sisimai/lhost/biglobe.rb +6 -6
  20. data/lib/sisimai/lhost/courier.rb +7 -7
  21. data/lib/sisimai/lhost/domino.rb +6 -6
  22. data/lib/sisimai/lhost/dragonfly.rb +5 -5
  23. data/lib/sisimai/lhost/einsundeins.rb +5 -5
  24. data/lib/sisimai/lhost/exchange2003.rb +7 -7
  25. data/lib/sisimai/lhost/exchange2007.rb +5 -5
  26. data/lib/sisimai/lhost/exim.rb +13 -15
  27. data/lib/sisimai/lhost/ezweb.rb +3 -2
  28. data/lib/sisimai/lhost/fml.rb +9 -9
  29. data/lib/sisimai/lhost/gmail.rb +9 -9
  30. data/lib/sisimai/lhost/gmx.rb +3 -3
  31. data/lib/sisimai/lhost/googlegroups.rb +6 -7
  32. data/lib/sisimai/lhost/googleworkspace.rb +5 -6
  33. data/lib/sisimai/lhost/imailserver.rb +4 -4
  34. data/lib/sisimai/lhost/kddi.rb +4 -4
  35. data/lib/sisimai/lhost/mailfoundry.rb +3 -3
  36. data/lib/sisimai/lhost/{mailmarshalsmtp.rb → mailmarshal.rb} +5 -5
  37. data/lib/sisimai/lhost/messagingserver.rb +8 -8
  38. data/lib/sisimai/lhost/mfilter.rb +8 -4
  39. data/lib/sisimai/lhost/mimecast.rb +105 -0
  40. data/lib/sisimai/lhost/notes.rb +5 -5
  41. data/lib/sisimai/lhost/opensmtpd.rb +5 -5
  42. data/lib/sisimai/lhost/postfix.rb +38 -32
  43. data/lib/sisimai/lhost/qmail.rb +11 -11
  44. data/lib/sisimai/lhost/sendmail.rb +13 -13
  45. data/lib/sisimai/lhost/{interscanmss.rb → trendmicro.rb} +8 -9
  46. data/lib/sisimai/lhost/v5sendmail.rb +7 -7
  47. data/lib/sisimai/lhost/verizon.rb +3 -3
  48. data/lib/sisimai/lhost/x1.rb +7 -4
  49. data/lib/sisimai/lhost/x2.rb +40 -12
  50. data/lib/sisimai/lhost/x3.rb +3 -3
  51. data/lib/sisimai/lhost/x6.rb +2 -2
  52. data/lib/sisimai/lhost/zoho.rb +5 -5
  53. data/lib/sisimai/lhost.rb +18 -17
  54. data/lib/sisimai/mail/maildir.rb +4 -4
  55. data/lib/sisimai/mail/mbox.rb +4 -4
  56. data/lib/sisimai/mail/memory.rb +1 -1
  57. data/lib/sisimai/mail/stdin.rb +2 -2
  58. data/lib/sisimai/message.rb +36 -34
  59. data/lib/sisimai/order.rb +5 -4
  60. data/lib/sisimai/reason/authfailure.rb +10 -14
  61. data/lib/sisimai/reason/badreputation.rb +8 -8
  62. data/lib/sisimai/reason/blocked.rb +58 -83
  63. data/lib/sisimai/reason/contenterror.rb +15 -10
  64. data/lib/sisimai/reason/{mesgtoobig.rb → emailtoolarge.rb} +23 -26
  65. data/lib/sisimai/reason/expired.rb +17 -24
  66. data/lib/sisimai/reason/failedstarttls.rb +1 -1
  67. data/lib/sisimai/reason/filtered.rb +14 -18
  68. data/lib/sisimai/reason/hasmoved.rb +3 -2
  69. data/lib/sisimai/reason/hostunknown.rb +18 -21
  70. data/lib/sisimai/reason/mailboxfull.rb +28 -50
  71. data/lib/sisimai/reason/mailererror.rb +1 -1
  72. data/lib/sisimai/reason/networkerror.rb +17 -17
  73. data/lib/sisimai/reason/norelaying.rb +20 -20
  74. data/lib/sisimai/reason/notaccept.rb +7 -10
  75. data/lib/sisimai/reason/notcompliantrfc.rb +6 -10
  76. data/lib/sisimai/reason/policyviolation.rb +12 -28
  77. data/lib/sisimai/reason/ratelimited.rb +62 -0
  78. data/lib/sisimai/reason/rejected.rb +46 -58
  79. data/lib/sisimai/reason/requireptr.rb +14 -26
  80. data/lib/sisimai/reason/securityerror.rb +14 -20
  81. data/lib/sisimai/reason/spamdetected.rb +52 -102
  82. data/lib/sisimai/reason/suspend.rb +27 -24
  83. data/lib/sisimai/reason/systemerror.rb +20 -24
  84. data/lib/sisimai/reason/systemfull.rb +2 -2
  85. data/lib/sisimai/reason/userunknown.rb +82 -114
  86. data/lib/sisimai/reason/vacation.rb +1 -1
  87. data/lib/sisimai/reason/virusdetected.rb +7 -9
  88. data/lib/sisimai/reason.rb +26 -26
  89. data/lib/sisimai/rfc1123.rb +58 -18
  90. data/lib/sisimai/rfc1894.rb +6 -8
  91. data/lib/sisimai/rfc2045.rb +25 -13
  92. data/lib/sisimai/rfc3464/thirdparty.rb +2 -3
  93. data/lib/sisimai/rfc3464.rb +6 -6
  94. data/lib/sisimai/rfc3834.rb +18 -8
  95. data/lib/sisimai/rfc5322.rb +9 -9
  96. data/lib/sisimai/rfc791.rb +2 -2
  97. data/lib/sisimai/rhost/aol.rb +4 -1
  98. data/lib/sisimai/rhost/apple.rb +15 -11
  99. data/lib/sisimai/rhost/cloudflare.rb +2 -0
  100. data/lib/sisimai/rhost/cox.rb +31 -25
  101. data/lib/sisimai/rhost/facebook.rb +24 -18
  102. data/lib/sisimai/rhost/franceptt.rb +92 -38
  103. data/lib/sisimai/rhost/godaddy.rb +34 -7
  104. data/lib/sisimai/rhost/google.rb +69 -70
  105. data/lib/sisimai/rhost/gsuite.rb +1 -1
  106. data/lib/sisimai/rhost/iua.rb +1 -1
  107. data/lib/sisimai/rhost/kddi.rb +1 -1
  108. data/lib/sisimai/rhost/messagelabs.rb +160 -2
  109. data/lib/sisimai/rhost/microsoft.rb +154 -107
  110. data/lib/sisimai/rhost/mimecast.rb +64 -55
  111. data/lib/sisimai/rhost/nttdocomo.rb +70 -90
  112. data/lib/sisimai/rhost/outlook.rb +1 -1
  113. data/lib/sisimai/rhost/spectrum.rb +8 -8
  114. data/lib/sisimai/rhost/tencent.rb +12 -13
  115. data/lib/sisimai/rhost/yahooinc.rb +9 -10
  116. data/lib/sisimai/rhost/zoho.rb +72 -0
  117. data/lib/sisimai/rhost.rb +4 -3
  118. data/lib/sisimai/smtp/command.rb +4 -2
  119. data/lib/sisimai/smtp/reply.rb +11 -4
  120. data/lib/sisimai/smtp/status.rb +67 -98
  121. data/lib/sisimai/smtp/transcript.rb +3 -3
  122. data/lib/sisimai/string.rb +4 -23
  123. data/lib/sisimai/version.rb +1 -1
  124. data/lib/sisimai.rb +1 -1
  125. data/set-of-emails/maildir/bsd/lhost-exim-56.eml +40 -40
  126. data/set-of-emails/maildir/bsd/lhost-mfilter-05.eml +41 -0
  127. data/set-of-emails/maildir/bsd/lhost-mimecast-01.eml +46 -0
  128. data/set-of-emails/maildir/bsd/lhost-mimecast-02.eml +59 -0
  129. data/set-of-emails/maildir/bsd/lhost-postfix-79.eml +81 -0
  130. data/set-of-emails/maildir/bsd/lhost-postfix-80.eml +84 -0
  131. data/set-of-emails/maildir/bsd/lhost-x1-03.eml +26 -0
  132. data/set-of-emails/maildir/bsd/lhost-x1-04.eml +45 -0
  133. data/set-of-emails/maildir/bsd/lhost-x2-07.eml +30 -0
  134. data/set-of-emails/maildir/bsd/rfc3464-66.eml +170 -0
  135. data/set-of-emails/maildir/bsd/rfc3834-06.eml +59 -0
  136. data/set-of-emails/maildir/bsd/rhost-zoho-01.eml +88 -0
  137. data/set-of-emails/maildir/bsd/rhost-zoho-02.eml +86 -0
  138. data/set-of-emails/maildir/bsd/rhost-zoho-03.eml +87 -0
  139. data/set-of-emails/maildir/bsd/rhost-zoho-04.eml +86 -0
  140. data/set-of-emails/maildir/not/rb-issue-368-bug.eml +39 -0
  141. data/sisimai-java.gemspec +1 -1
  142. data/sisimai.gemspec +1 -1
  143. metadata +28 -13
  144. data/lib/sisimai/reason/exceedlimit.rb +0 -47
  145. data/lib/sisimai/reason/speeding.rb +0 -47
  146. data/lib/sisimai/reason/toomanyconn.rb +0 -59
  147. /data/set-of-emails/maildir/bsd/{lhost-mailmarshalsmtp-02.eml → lhost-mailmarshal-02.eml} +0 -0
  148. /data/set-of-emails/maildir/bsd/{lhost-interscanmss-01.eml → lhost-trendmicro-01.eml} +0 -0
  149. /data/set-of-emails/maildir/bsd/{lhost-interscanmss-02.eml → lhost-trendmicro-02.eml} +0 -0
  150. /data/set-of-emails/maildir/bsd/{lhost-interscanmss-03.eml → lhost-trendmicro-03.eml} +0 -0
@@ -31,13 +31,13 @@ module Sisimai
31
31
  ipv4a = []
32
32
  %w|( ) [ ] ,|.each do |e|
33
33
  # Rewrite: "mx.example.jp[192.0.2.1]" => "mx.example.jp 192.0.2.1"
34
- p0 = given.index(e); next unless p0
34
+ p0 = given.index(e); next if p0.nil?
35
35
  given[p0, 1] = ' '
36
36
  end
37
37
 
38
38
  given.split(' ').each do |e|
39
39
  # Find string including an IPv4 address
40
- next unless e.index('.') # IPv4 address must include "." character
40
+ next if e.index('.').nil? # IPv4 address must include "." character
41
41
 
42
42
  lx = e.size; next if lx < 7 || lx > 17 # 0.0.0.0 = 7, [255.255.255.255] = 17
43
43
  cu = 0 # Cursor for seeking each octet of an IPv4 address
@@ -14,6 +14,9 @@ module Sisimai
14
14
  # @param [Sisimai::Fact] argvs Decoded email object
15
15
  # @return [String] The bounce reason for Aol
16
16
  # @since v5.2.0
17
+ # @see
18
+ # - Y!Sender Hub/SMTP Error Codes: https://senders.yahooinc.com/smtp-error-codes/
19
+ # - The MX record of Aol points "mx-aol.mail.gm0.yahoodns.net".
17
20
  def find(argvs)
18
21
  return "" if argvs["diagnosticcode"].empty?
19
22
  issuedcode = argvs["diagnosticcode"]
@@ -21,7 +24,7 @@ module Sisimai
21
24
 
22
25
  MessagesOf.each_key do |e|
23
26
  # Try to match the error message with message patterns defined in $MessagesOf
24
- next unless MessagesOf[e].any? { |a| issuedcode.include?(a) }
27
+ next if MessagesOf[e].none? { |a| issuedcode.include?(a) }
25
28
  reasontext = e
26
29
  break
27
30
  end
@@ -44,19 +44,23 @@ module Sisimai
44
44
  # Please visit https://support.apple.com/en-us/HT204137
45
45
  'due to local policy',
46
46
  ],
47
+ 'ratelimited' => [
48
+ # - 421 4.7.1 Messages to ****@icloud.com deferred due to excessive volume.
49
+ # Try again later - https://support.apple.com/en-us/HT204137
50
+ 'due to excessive volume',
51
+ ],
47
52
  'rejected' => [
48
53
  # - 450 4.1.8 <kijitora@example.jp>: Sender address rejected: Domain not found
49
54
  'sender address rejected',
50
55
  ],
51
- 'speeding' => [
52
- # - 421 4.7.1 Messages to ****@icloud.com deferred due to excessive volume.
53
- # Try again later - https://support.apple.com/en-us/HT204137
54
- 'due to excessive volume',
56
+ 'suspend' => [
57
+ # - https://support.apple.com/guide/icloud/stop-using-or-reactivate-addresses-mm3adb030cbf/icloud
58
+ # - 550 5.1.1 <****@icloud.com>: inactive email address (in reply to RCPT TO command)
59
+ "inactive email address",
55
60
  ],
56
61
  'userunknown' => [
57
62
  # - 550 5.1.1 <****@icloud.com>: inactive email address (in reply to RCPT TO command)
58
63
  # - 550 5.1.1 unknown or illegal alias: ****@icloud.com
59
- 'inactive email address',
60
64
  'user does not exist',
61
65
  'unknown or illegal alias',
62
66
  ],
@@ -65,20 +69,20 @@ module Sisimai
65
69
  # Detect bounce reason from Apple iCloud Mail
66
70
  # @param [Sisimai::Fact] argvs Decoded email object
67
71
  # @return [String] The bounce reason for Apple
68
- # @see https://support.apple.com/en-us/102322
69
- # https://www.postmastery.com/icloud-postmastery-page/
70
- # https://smtpfieldmanual.com/provider/apple
72
+ # @see
73
+ # - Postmaster information for iCloud Mail: https://support.apple.com/en-us/102322
74
+ # - https://www.postmastery.com/icloud-postmastery-page/
75
+ # - https://smtpfieldmanual.com/provider/apple
71
76
  # @since v5.1.0
72
77
  def find(argvs)
73
- return '' unless argvs
74
- return '' unless argvs['diagnosticcode'].size > 0
78
+ return '' if argvs.nil? || argvs['diagnosticcode'].size == 0
75
79
 
76
80
  issuedcode = argvs['diagnosticcode'].downcase
77
81
  reasontext = ''
78
82
 
79
83
  MessagesOf.each_key do |e|
80
84
  MessagesOf[e].each do |f|
81
- next unless issuedcode.include?(f)
85
+ next if issuedcode.include?(f) == false
82
86
  reasontext = e
83
87
  break
84
88
  end
@@ -6,6 +6,8 @@ module Sisimai
6
6
  module Cloudflare
7
7
  class << self
8
8
  MessagesOf = {
9
+ # - 554 <YOUR_IP_ADDRESS> found on one or more RBLs (abusixip). Refer to
10
+ # https://developers.cloudflare.com/email-routing/postmaster/#spam-and-abusive-traffic/
9
11
  "blocked" => ["found on one or more DNSBLs"],
10
12
  "systemerror" => ["Upstream error"],
11
13
  }.freeze
@@ -37,13 +37,13 @@ module Sisimai
37
37
  # - There is a limit to the number of concurrent SMTP connections per IP address to
38
38
  # protect the systems against attack. Ensure that the sending email server is not
39
39
  # opening more than 10 concurrent connections to avoid reaching this limit.
40
- 'CXCNCT' => 'toomanyconn',
40
+ 'CXCNCT' => 'ratelimited',
41
41
 
42
42
  # CXMXRT
43
43
  # - The sender has sent email to too many recipients and needs to wait before sending
44
44
  # more email.
45
45
  # - The email sender has exceeded the maximum number of sent email allowed.
46
- 'CXMXRT' => 'toomanyconn',
46
+ 'CXMXRT' => 'ratelimited',
47
47
 
48
48
  # CDRBL
49
49
  # - The sending IP address has been temporarily blocked by Cox due to exhibiting spam-like
@@ -61,7 +61,7 @@ module Sisimai
61
61
  'IPBL0101' => 'blocked', # The sending IP is in the Spamhaus Zen and Invaluement ivmSIP DNSBLs.
62
62
  'IPBL0110' => 'blocked', # The sending IP is in the Return Path and Invaluement ivmSIP DNSBLs.
63
63
  'IPBL0111' => 'blocked', # The sending IP is in the Spamhaus Zen, Return Path and Invaluement ivmSIP DNSBLs.
64
- 'IPBL1000' => 'blocked', # The sending IP address is listed on a CSI blacklist. You can check your status on the CSI website.
64
+ 'IPBL1000' => 'blocked', # The sending IP address is listed on a CSI blacklist.
65
65
  'IPBL1001' => 'blocked', # The sending IP is listed in the Cloudmark CSI and Spamhaus Zen DNSBLs.
66
66
  'IPBL1010' => 'blocked', # The sending IP is listed in the Cloudmark CSI and Return Path DNSBLs.
67
67
  'IPBL1011' => 'blocked', # The sending IP is in the Cloudmark CSI, Spamhaus Zen and Return Path DNSBLs.
@@ -69,12 +69,12 @@ module Sisimai
69
69
  'IPBL1101' => 'blocked', # The sending IP is in the Cloudmark CSI, Spamhaus Zen and Invaluement IVMsip DNSBLs.
70
70
  'IPBL1110' => 'blocked', # The sending IP is in the Cloudmark CSI, Return Path and Invaluement ivmSIP DNSBLs.
71
71
  'IPBL1111' => 'blocked', # The sending IP is in the Cloudmark CSI, Spamhaus Zen, Return Path and Invaluement ivmSIP DNSBLs.
72
- 'IPBL00001' => 'blocked', # The sending IP address is listed on a Spamhaus blacklist. Check your status at Spamhaus.
72
+ 'IPBL00001' => 'blocked', # The sending IP address is listed on a Spamhaus blacklist.
73
73
 
74
74
  'URLBL011' => 'spamdetected', # A URL within the body of the message was found on blocklists SURBL and Spamhaus DBL.
75
75
  'URLBL101' => 'spamdetected', # A URL within the body of the message was found on blocklists SURBL and ivmURI.
76
76
  'URLBL110' => 'spamdetected', # A URL within the body of the message was found on blocklists Spamhaus DBL and ivmURI.
77
- 'URLBL1001' => 'spamdetected', # The URL is listed on a Spamhaus blacklist. Check your status at Spamhaus.
77
+ 'URLBL1001' => 'spamdetected', # The URL is listed on a Spamhaus blacklist.
78
78
  }.freeze
79
79
  MessagesOf = {
80
80
  'blocked' => [
@@ -82,34 +82,23 @@ module Sisimai
82
82
  # a three-hour block of the client's IP address.
83
83
  # - The sending IP address has exceeded the threshold of invalid recipients and has
84
84
  # been blocked.
85
+ # - Cox enforces various rate limits to protect our platform. The sending IP address
86
+ # has exceeded one of these rate limits and has been temporarily blocked.
85
87
  'cox too many bad commands from',
86
88
  'too many invalid recipients',
87
89
  ],
88
- 'requireptr' => [
89
- # - The reverse DNS check of the sending server IP address has failed.
90
- # - Cox requires that all connecting email servers contain valid reverse DNS PTR records.
91
- 'dns check failure - try again later',
92
- 'rejected - no rdns',
93
- ],
94
- 'policyviolation' => [
95
- # - The sending server has attempted to communicate too soon within the SMTP transaction
90
+ 'contenterror' => [
96
91
  # - The message has been rejected because it contains an attachment with one of the
97
92
  # following prohibited file types, which commonly contain viruses: .shb, .shs, .vbe,
98
93
  # .vbs, .wsc, .wsf, .wsh, .pif, .msc, .msi, .msp, .reg, .sct, .bat, .chm, .isp, .cpl,
99
94
  # .js, .jse, .scr, .exe.
100
- 'esmtp no data before greeting',
101
95
  'attachment extension is forbidden',
102
96
  ],
103
- 'rejected' => [
104
- # Cox requires that all sender domains resolve to a valid MX or A-record within DNS.
105
- 'sender rejected',
106
- ],
107
- 'systemerror' => [
108
- # - Our systems are experiencing an issue which is causing a temporary inability to
109
- # accept new email.
110
- 'esmtp server temporarily not available',
97
+ 'policyviolation' => [
98
+ # - The sending server has attempted to communicate too soon within the SMTP transaction
99
+ 'esmtp no data before greeting',
111
100
  ],
112
- 'toomanyconn' => [
101
+ 'ratelimited' => [
113
102
  # - The sending IP address has exceeded the five maximum concurrent connection limit.
114
103
  # - The SMTP connection has exceeded the 100 email message threshold and was disconnected.
115
104
  # - The sending IP address has exceeded one of these rate limits and has been temporarily
@@ -118,6 +107,21 @@ module Sisimai
118
107
  'requested action aborted: try again later',
119
108
  'message threshold exceeded',
120
109
  ],
110
+ 'rejected' => [
111
+ # Cox requires that all sender domains resolve to a valid MX or A-record within DNS.
112
+ 'sender rejected',
113
+ ],
114
+ 'requireptr' => [
115
+ # - The reverse DNS check of the sending server IP address has failed.
116
+ # - Cox requires that all connecting email servers contain valid reverse DNS PTR records.
117
+ 'dns check failure - try again later',
118
+ 'rejected - no rdns',
119
+ ],
120
+ 'systemerror' => [
121
+ # - Our systems are experiencing an issue which is causing a temporary inability to
122
+ # accept new email.
123
+ 'esmtp server temporarily not available',
124
+ ],
121
125
  'userunknown' => [
122
126
  # - The intended recipient is not a valid Cox Email account.
123
127
  'recipient rejected',
@@ -127,7 +131,9 @@ module Sisimai
127
131
  # Detect bounce reason from https://cox.com/
128
132
  # @param [Sisimai::Fact] argvs Decoded email object
129
133
  # @return [String, Nil] The bounce reason at Cox
130
- # @see https://www.cox.com/residential/support/email-error-codes.html
134
+ # @see
135
+ # - Email Error Codes: https://www.cox.com/business/support/email-error-codes.html
136
+ # - Feedback Loop Service https://www.cox.com/business/support/feedback-loop-service.html
131
137
  # @since v4.25.8
132
138
  def find(argvs)
133
139
  return "" if argvs["diagnosticcode"].empty?
@@ -145,7 +151,7 @@ module Sisimai
145
151
  # The error code was not found in ErrorCodes
146
152
  MessagesOf.each_key do |e|
147
153
  # Try to find with each error message defined in MessagesOf
148
- next unless MessagesOf[e].any? { |a| issuedcode.include?(a) }
154
+ next if MessagesOf[e].none? { |a| issuedcode.include?(a) }
149
155
  reasontext = e
150
156
  break
151
157
  end
@@ -15,25 +15,38 @@ module Sisimai
15
15
  "POL-P1", # Your mail server's IP Address is listed on the Spamhaus PBL.
16
16
  "POL-P2", # Facebook will no longer accept mail from your mail server's IP Address.
17
17
  "POL-P3", # Facebook is not accepting messages from your mail server. This will persist for 4 to 8 hours.
18
- "POL-P4", # Facebook is not accepting messages from your mail server. This will persist for 24 to 48 hours.
19
- "POL-T1", # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 1 to 2 hours.
20
- "POL-T2", # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 4 to 8 hours.
21
- "POL-T3", # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 24 to 48 hours.
18
+ "POL-P4", # ". This will persist for 24 to 48 hours.
19
+ "POL-T1", # ", but they may be retried later. This will persist for 1 to 2 hours.
20
+ "POL-T2", # ", but they may be retried later. This will persist for 4 to 8 hours.
21
+ "POL-T3", # ", but they may be retried later. This will persist for 24 to 48 hours.
22
22
  ],
23
23
  "contenterror" => [
24
24
  "MSG-P2", # The message contains an attachment type that Facebook does not accept.
25
25
  ],
26
+ "emailtoolarge" => [
27
+ "MSG-P1", # The message exceeds Facebook's maximum allowed size.
28
+ "INT-P2", # The message exceeds Facebook's maximum allowed size.
29
+ ],
26
30
  "filtered" => [
27
31
  "RCP-P2", # The attempted recipient's preferences prevent messages from being delivered.
28
32
  "RCP-P3", # The attempted recipient's privacy settings blocked the delivery.
29
33
  ],
30
- "mesgtoobig" => [
31
- "MSG-P1", # The message exceeds Facebook's maximum allowed size.
32
- "INT-P2", # The message exceeds Facebook's maximum allowed size.
34
+ "mailboxfull" => [
35
+ "INT-P7", # The attempted recipient has exceeded their storage quota.
33
36
  ],
34
37
  "notcompliantrfc" => [
35
38
  "MSG-P3", # The message contains multiple instances of a header field that can only be present once.
36
39
  ],
40
+ "policyviolation" => [
41
+ "POL-P8", # The message does not comply with Facebook's abuse policies and will not be accepted.
42
+ ],
43
+ "ratelimited" => [
44
+ "CON-T1", # Facebook's mail server currently has too many connections open to allow another one.
45
+ "CON-T2", # Your mail server currently has too many connections open to Facebook's mail servers.
46
+ "CON-T3", # Your mail server has opened too many new connections to Facebook's mail servers in a short period of time.
47
+ "CON-T4", # Your mail server has exceeded the maximum number of recipients for its current connection.
48
+ "MSG-T1", # The number of recipients on the message exceeds Facebook's allowed maximum.
49
+ ],
37
50
  "rejected" => [
38
51
  "DNS-P1", # Your SMTP MAIL FROM domain does not exist.
39
52
  "DNS-P2", # Your SMTP MAIL FROM domain does not have an MX record.
@@ -45,25 +58,18 @@ module Sisimai
45
58
  ],
46
59
  "spamdetected" => [
47
60
  "POL-P6", # The message contains a url that has been blocked by Facebook.
48
- "POL-P7", # The message does not comply with Facebook's abuse policies and will not be accepted.
49
61
  ],
50
62
  "suspend" => [
51
63
  "RCP-T4", # The attempted recipient address is currently deactivated. The user may or may not reactivate it.
52
64
  ],
53
65
  "systemerror" => [
54
- "RCP-T1", # The attempted recipient address is not currently available due to an internal system issue. This is a temporary condition.
55
- ],
56
- "toomanyconn" => [
57
- "CON-T1", # Facebook's mail server currently has too many connections open to allow another one.
58
- "CON-T2", # Your mail server currently has too many connections open to Facebook's mail servers.
59
- "CON-T3", # Your mail server has opened too many new connections to Facebook's mail servers in a short period of time.
60
- "CON-T4", # Your mail server has exceeded the maximum number of recipients for its current connection.
61
- "MSG-T1", # The number of recipients on the message exceeds Facebook's allowed maximum.
66
+ "RCP-T1", # The attempted recipient address is not currently available due to an internal system issue.
67
+ "INT-Tx", # These codes indicate a temporary issue internal to Facebook's system.
62
68
  ],
63
69
  "userunknown" => [
64
70
  "RCP-P1", # The attempted recipient address does not exist.
65
71
  "INT-P1", # The attempted recipient address does not exist.
66
- "INT-P3", # The attempted recpient group address does not exist.
72
+ "INT-P3", # The attempted recipient group address does not exist.
67
73
  "INT-P4", # The attempted recipient address does not exist.
68
74
  ],
69
75
  "virusdetected" => [
@@ -85,7 +91,7 @@ module Sisimai
85
91
 
86
92
  ErrorCodes.each_key do |e|
87
93
  # The key is a bounce reason name
88
- next unless ErrorCodes[e].any? { |a| errorlabel == a }
94
+ next if ErrorCodes[e].none? { |a| errorlabel == a }
89
95
  reasontext = e
90
96
  break
91
97
  end
@@ -6,6 +6,12 @@ module Sisimai
6
6
  module FrancePTT
7
7
  class << self
8
8
  ErrorCodes = {
9
+ # - Your sending IP is listed on Abusix RBL
10
+ # Please visit: https://lookup.abusix.com/search?q=$IP
11
+ "100" => 'blocked',
12
+
13
+ # - Your sending IP is listed by SpamHaus RBL
14
+ # Please visit: https://check.spamhaus.org/listed/?searchterm=$IP
9
15
  # - 550 5.7.1 Service unavailable; client [192.0.2.1] blocked using Spamhaus
10
16
  # Les emails envoyes vers la messagerie Laposte.net ont ete bloques par nos services.
11
17
  # Afin de regulariser votre situation, nous vous invitons a cliquer sur le lien ci-dessous
@@ -15,6 +21,8 @@ module Sisimai
15
21
  # https://www.spamhaus.org/lookup/ LPNAAA_101 (in reply to RCPT TO command))
16
22
  '101' => 'blocked',
17
23
 
24
+ # - Your sending IP is listed by Cloudmark RBL
25
+ # Please visit: https://csi.cloudmark.com/reset-request/?ip=$IP#
18
26
  # - 550 mwinf5c04 ME Adresse IP source bloquee pour incident de spam.
19
27
  # - Client host blocked for spamming issues. OFR006_102 Ref http://csi.cloudmark.com ...
20
28
  # - 550 5.5.0 Les emails envoyes vers la messagerie Laposte.net ont ete bloques par nos
@@ -25,6 +33,9 @@ module Sisimai
25
33
  # https://senderscore.org/blacklistlookup/ LPN007_102
26
34
  '102' => 'blocked',
27
35
 
36
+ # - Your sending IP has been blacklisted by Orange
37
+ # Please contact Orange by using our contact form and select option
38
+ # "Un problème d'envoi d'emails vers les adresses Orange ou Wanadoo (deliverability issue)"
28
39
  # - 550 mwinf5c10 ME Service refuse. Veuillez essayer plus tard.
29
40
  # - Service refused, please try later. OFR006_103 192.0.2.1 [103]
30
41
  '103' => 'blocked',
@@ -32,33 +43,52 @@ module Sisimai
32
43
  # - 421 mwinf5c79 ME Trop de connexions, veuillez verifier votre configuration.
33
44
  # - Too many connections, slow down. OFR005_104 [104]
34
45
  # - Too many connections, slow down. LPN105_104
35
- '104' => 'toomanyconn',
36
-
37
- '105' => nil, # Veuillez essayer plus tard.
38
- '107' => nil, # Service refused, please try later. LPN006_107
39
- '108' => nil, # service refused, please try later. LPN001_108
40
- '109' => nil, # Veuillez essayer plus tard. LPN003_109
41
- '201' => nil, # Veuillez essayer plus tard. OFR004_201
42
-
43
- # - 550 5.7.0 Code d'authentification invalide OFR_305
44
- '305' => 'securityerror',
45
-
46
- # - 550 5.5.0 SPF: *** is not allowed to send mail. LPN004_401
47
- '401' => 'authfailure',
48
-
49
- # - 550 5.5.0 Authentification requise. Authentication Required. LPN105_402
50
- '402' => 'securityerror',
51
-
52
- # - 5.0.1 Emetteur invalide. Invalid Sender.
53
- '403' => 'rejected',
54
-
46
+ '104' => 'ratelimited',
47
+
48
+ # - Your IP address is missing a DNS PTR record, it also called a rDNS (reverse DNS)
49
+ # Please set up a valid DNS PTR record for your IP address that point to your domain,
50
+ # It's important that the sending IP address must match the IP address of the hostname
51
+ # defined in the PTR record
52
+ # - Service refused, please try later. LPN006_107
53
+ "107" => 'requireptr',
54
+
55
+ # - You are sending too many messages per SMTP connection
56
+ # Please reduce the number of messages per connection, recommended value is 100
57
+ # messages per connections
58
+ # - Veuillez essayer plus tard. LPN003_109
59
+ "109" => 'ratelimited',
60
+
61
+ # - Invalid HELO/EHLO
62
+ # Please set up a valid HELO/EHLO, it must be fully qualified domain name (FQDN) and
63
+ # should resolve (DNS record needed). E.g.: "mail.yourdomain.com"
64
+ # - Veuillez essayer plus tard. OFR004_201
65
+ "201" => 'blocked',
66
+ "20X" => 'blocked',
67
+
68
+ # - Sender's Domain name SPF Error
69
+ # Please verify your mail from domain name DNS/TXT configuration for your SPF
70
+ # configuration. Please visit https://mxtoolbox.com/supertool3?action=spf:$YOUR_DOMAIN
71
+ # to check your domain. (replace $YOUR_DOMAIN by your sender domain name)
72
+ # Please note:
73
+ # If you have changed your DNS record recently, please let DNS caches expire (TTL)
74
+ "39X" => 'authfailure',
75
+
76
+ # - Sender's Domain DNS Error
77
+ # Please verify your mail from domain name DNS configuration. Your domain name must
78
+ # have valid A or MX records. You can check your DNS configuration on MxToolBox
79
+ # Please note:
80
+ # If you have changed your DNS record recently, please let DNS caches expire (TTL)
55
81
  # - 5.0.1 Emetteur invalide. Invalid Sender. LPN105_405
56
82
  # - 501 5.1.0 Emetteur invalide. Invalid Sender. OFR004_405 [405] (in reply to MAIL FROM command))
57
83
  '405' => 'rejected',
58
84
 
59
- # Emetteur invalide. Invalid Sender. OFR_415
60
- '415' => 'rejected',
85
+ # - Your Sender has been rejected
86
+ # Please contact Orange by using our contact form and select option
87
+ # "Un problème d'envoi d'emails vers les adresses Orange ou Wanadoo (deliverability issue)"
88
+ "406" => 'rejected',
61
89
 
90
+ # - User doesn't exist here
91
+ # Please remove this email address from your distribution list, it does not exist
62
92
  # - 550 5.1.1 Adresse d au moins un destinataire invalide.
63
93
  # - Invalid recipient. LPN416 (in reply to RCPT TO command)
64
94
  # - Invalid recipient. OFR_416 [416] (in reply to RCPT TO command)
@@ -68,17 +98,15 @@ module Sisimai
68
98
  # - Recipient overquota. OFR_417 [417] (in reply to RCPT TO command))
69
99
  '417' => 'mailboxfull',
70
100
 
71
- # - Adresse d au moins un destinataire invalide
72
-
73
101
  # - 550 5.5.0 Boite du destinataire archivee.
74
102
  # - Archived recipient. LPN007_420 (in reply to RCPT TO command)
75
103
  '420' => 'suspend',
76
104
 
77
- # - 5.5.3 Mail from not owned by user. LPN105_421.
78
- '421' => 'rejected',
79
-
80
- '423' => nil, # Service refused, please try later. LPN105_423
81
- '424' => nil, # Veuillez essayer plus tard. LPN105_424
105
+ # - Your sender domain name has been blacklisted
106
+ # Your sender domain name has been blacklisted by Abusix OR SpamHaus, Please visit:
107
+ # - https://lookup.abusix.com/search?q=$YOUR_DOMAIN
108
+ # - https://check.spamhaus.org/listed/?searchterm=$YOUR_DOMAIN
109
+ "425" => 'rejected',
82
110
 
83
111
  # - 550 5.5.0 Le compte du destinataire est bloque. The recipient account isblocked.
84
112
  # LPN007_426 (in reply to RCPT TO command)
@@ -90,6 +118,9 @@ module Sisimai
90
118
  # LPN007_505 (in reply to end of DATA command)
91
119
  '505' => 'systemerror',
92
120
 
121
+ # - Your message has been blocked by Orange, suspected spam
122
+ # Please contact Orange by using our contact form and select option
123
+ # "Un problème d'envoi d'emails vers les adresses Orange ou Wanadoo (deliverability issue)"
93
124
  # - Mail rejete. Mail rejected. OFR_506 [506]
94
125
  '506' => 'spamdetected',
95
126
 
@@ -97,21 +128,43 @@ module Sisimai
97
128
  # LPN005_510 (in reply to end of DATA command)
98
129
  '510' => 'blocked',
99
130
 
100
- '513' => nil, # Mail rejete. Mail rejected. OUK_513
101
-
102
- # - Taille limite du message atteinte
103
- '514' => 'mesgtoobig',
131
+ # - DMARC authentication failed, message rejected as defined by your DMARC policy
132
+ # Please check your SPF/DKIM/DMARC configuration. Please visit MxToolBox DMARC to
133
+ # check your domain configuration
134
+ "515" => 'authfailure',
104
135
 
105
136
  # - 571 5.7.1 Message refused, DMARC verification Failed.
106
137
  # - Message refuse, verification DMARC en echec LPN007_517
107
138
  '517' => 'authfailure',
108
139
 
109
- # - 554 5.7.1 Client host rejected LPN000_630
110
- '630' => 'policyviolation',
140
+ # - The sending IP address is not authorized to send messages for your domain as defined
141
+ # in the sender's Domain name SPF configuration (DNS/TXT)
142
+ # Please verify your mail from domain name DNS/TXT configuration for your SPF configuration.
143
+ # Please visit https://mxtoolbox.com/supertool3?action=spf:$YOUR_DOMAIN to check your
144
+ # domain. (replace $YOUR_DOMAIN by your sender domain name)
145
+ "519" => 'authfailure',
111
146
 
147
+ # - Due to bad behavior you have been rate limited, please try again later
148
+ # Due to inappropriate behavior, you have been rate limited. Please check what you
149
+ # are trying to send
112
150
  # - 421 mwinf5c77 ME Service refuse. Veuillez essayer plus tard. Service refused, please try
113
151
  # later. OFR_999 [999]
114
- '999' => 'blocked',
152
+ "99X" => 'ratelimited',
153
+
154
+ # Other undocumented or old error codes
155
+ "105" => "", # Veuillez essayer plus tard.
156
+ "108" => "", # service refused, please try later. LPN001_108
157
+ "305" => "securityerror", # 550 5.7.0 Code d'authentification invalide OFR_305
158
+ "401" => "authfailure", # 550 5.5.0 SPF: *** is not allowed to send mail. LPN004_401
159
+ "402" => "securityerror", # 550 5.5.0 Authentification requise. Authentication Required. LPN105_402
160
+ "403" => "rejected", # 5.0.1 Emetteur invalide. Invalid Sender.
161
+ "415" => "rejected", # Emetteur invalide. Invalid Sender. OFR_415
162
+ "421" => "rejected", # 5.5.3 Mail from not owned by user. LPN105_421.
163
+ "423" => "", # Service refused, please try later. LPN105_423
164
+ "424" => "", # Veuillez essayer plus tard. LPN105_424
165
+ "513" => "", # Mail rejete. Mail rejected. OUK_513
166
+ "514" => "messagetoobig", # Taille limite du message atteinte
167
+ "630" => "policyviolation", # 554 5.7.1 Client host rejected LPN000_630
115
168
  }.freeze
116
169
  MessagesOf = {
117
170
  'authfailure' => [
@@ -135,14 +188,15 @@ module Sisimai
135
188
  if cv = issuedcode.match(/\b(LPN|LPNAAA|OFR|OUK)(_[0-9]{3}|[0-9]{3}[-_][0-9]{3})\b/i)
136
189
  # OUK_513, LPN105-104, OFR102-104, ofr_506
137
190
  v = sprintf("%03d", (cv[1] + cv[2])[-3, 3])
138
- reasontext = ErrorCodes[v] || 'undefined'
191
+ x = v.clone; x[-1] = "X"
192
+ reasontext = ErrorCodes[v] || ErrorCodes[x] || ''
139
193
  end
140
194
  return reasontext if reasontext.size > 0
141
195
 
142
196
  issuedcode = issuedcode.downcase
143
197
  MessagesOf.each_key do |e|
144
198
  MessagesOf[e].each do |f|
145
- next unless issuedcode.include?(f)
199
+ next if issuedcode.include?(f) == false
146
200
  reasontext = e
147
201
  break
148
202
  end
@@ -69,19 +69,19 @@ module Sisimai
69
69
  # retry. IB605
70
70
  # - The message has attempted to mail too many recipients.
71
71
  # - Reduce the number of recipients and try again.
72
- 'IB605' => 'toomanyconn',
72
+ 'IB605' => 'ratelimited',
73
73
 
74
74
  # - 421 Connection refused, too many sessions from This IP. Lower the number of concurrent
75
75
  # sessions. IB007
76
76
  # - This IP address currently has too many sessions open.
77
77
  # - Check with your email provider to reduce the number of open sessions on your IP
78
78
  # address and then try again.
79
- 'IB007' => 'toomanyconn',
79
+ 'IB007' => 'ratelimited',
80
80
 
81
81
  # - 421 Server temporarily unavailable. Try again later. IB101
82
82
  # - The email queue is experiencing higher than normal email volume.
83
83
  # - Try again later.
84
- 'IB101' => 'speeding',
84
+ 'IB101' => 'ratelimited',
85
85
 
86
86
  # - 554 This IP has been temporarily blocked for attempting to send too many messages
87
87
  # containing content judged to be spam by the Internet community. IB110
@@ -112,16 +112,16 @@ module Sisimai
112
112
 
113
113
  # - 550 This IP has sent too many messages this hour. IB504
114
114
  # - This IP address has reached the maximum allowed messages for that hour.
115
- 'IB504' => 'speeding',
115
+ 'IB504' => 'ratelimited',
116
116
 
117
117
  # - 550 This message has exceeded the max number of messages per session. Open a new
118
118
  # session and try again. IB510
119
119
  # - This IP address has reached the maximum allowed messages for that session.
120
- 'IB510' => 'speeding',
120
+ 'IB510' => 'ratelimited',
121
121
 
122
122
  # - 550 This IP has sent too many to too many recipients this hour. IB607
123
123
  # - This IP address has reached the maximum allowed recipients for that hour.
124
- 'IB607' => 'speeding',
124
+ 'IB607' => 'ratelimited',
125
125
 
126
126
  # Remote block list (RBL) bounces
127
127
  # ---------------------------------------------------------------------------------------
@@ -143,6 +143,14 @@ module Sisimai
143
143
  'IB106' => 'blocked',
144
144
  }.freeze
145
145
  MessagesOf = {
146
+ 'authfailure' => [
147
+ # - 550 SPF Sender Invalid - envelope rejected
148
+ # - 550 5.7.9: This mail has been blocked because the sender is unauthenticated
149
+ # - 550-5.7.26 DKIM = did not pass
150
+ "spf sender invalid - envelope rejected",
151
+ "this mail has been blocked because the sender is unauthenticated",
152
+ "dkim = did not pass",
153
+ ],
146
154
  'blocked' => [
147
155
  # - 554 RBL Reject.
148
156
  # - This IP address was blocked from our internal RBL.
@@ -169,6 +177,25 @@ module Sisimai
169
177
  # make space for more email.
170
178
  'account storage limit',
171
179
  ],
180
+ 'norelaying' => [
181
+ # - 550 5.7.1: Relay access denied
182
+ "relay access denied",
183
+ ],
184
+ 'ratelimited' => [
185
+ # - 550 5.7.232 Your message can't be sent because your trial tenant has exceeded
186
+ # its daily limit for sending email to external recipients (tenant external recipient rate limit)
187
+ # - 550 5.7.233 - Your message can't be sent because your tenant exceeded its daily
188
+ # limit for sending email to external recipients (tenant external recipient rate limit)
189
+ "exceeded its daily limit",
190
+ ],
191
+ 'rejected' => [
192
+ # - 550 5.1.8 Access denied, bad outbound sender AS (42004)
193
+ "bad outbound sender as (42004)",
194
+ ],
195
+ 'securityerror' => [
196
+ # - 550 Please turn on SMTP Authentication in your mail client
197
+ "turn on smtp authentication in your mail client",
198
+ ],
172
199
  'spamdetected' => [
173
200
  # - 552 Message rejected for spam or virus content
174
201
  # - The email message contains a link, attachment, or pattern caught by our filters as spam.
@@ -218,7 +245,7 @@ module Sisimai
218
245
  issuedcode = issuedcode.downcase
219
246
  MessagesOf.each_key do |e|
220
247
  MessagesOf[e].each do |f|
221
- next unless issuedcode.include?(f)
248
+ next if issuedcode.include?(f) == false
222
249
  reasontext = e
223
250
  break
224
251
  end