sisimai 5.1.0 → 5.2.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.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake-test.yml +1 -1
  3. data/ChangeLog.md +102 -0
  4. data/Makefile +4 -2
  5. data/README-JA.md +23 -16
  6. data/README.md +22 -15
  7. data/lib/sisimai/arf.rb +121 -210
  8. data/lib/sisimai/fact.rb +208 -158
  9. data/lib/sisimai/lda.rb +98 -0
  10. data/lib/sisimai/lhost/activehunter.rb +1 -1
  11. data/lib/sisimai/lhost/amazonses.rb +185 -301
  12. data/lib/sisimai/lhost/apachejames.rb +48 -51
  13. data/lib/sisimai/lhost/biglobe.rb +1 -2
  14. data/lib/sisimai/lhost/courier.rb +10 -8
  15. data/lib/sisimai/lhost/domino.rb +25 -25
  16. data/lib/sisimai/lhost/dragonfly.rb +3 -4
  17. data/lib/sisimai/lhost/einsundeins.rb +3 -4
  18. data/lib/sisimai/lhost/exchange2003.rb +6 -8
  19. data/lib/sisimai/lhost/exchange2007.rb +111 -101
  20. data/lib/sisimai/lhost/exim.rb +232 -242
  21. data/lib/sisimai/lhost/ezweb.rb +43 -51
  22. data/lib/sisimai/lhost/fml.rb +2 -3
  23. data/lib/sisimai/lhost/gmail.rb +32 -28
  24. data/lib/sisimai/lhost/gmx.rb +4 -16
  25. data/lib/sisimai/lhost/googlegroups.rb +9 -8
  26. data/lib/sisimai/lhost/googleworkspace.rb +94 -0
  27. data/lib/sisimai/lhost/imailserver.rb +7 -16
  28. data/lib/sisimai/lhost/interscanmss.rb +1 -1
  29. data/lib/sisimai/lhost/kddi.rb +3 -4
  30. data/lib/sisimai/lhost/mailfoundry.rb +2 -5
  31. data/lib/sisimai/lhost/mailmarshalsmtp.rb +1 -2
  32. data/lib/sisimai/lhost/messagingserver.rb +14 -13
  33. data/lib/sisimai/lhost/mfilter.rb +4 -3
  34. data/lib/sisimai/lhost/notes.rb +2 -4
  35. data/lib/sisimai/lhost/opensmtpd.rb +2 -2
  36. data/lib/sisimai/lhost/postfix.rb +25 -27
  37. data/lib/sisimai/lhost/qmail.rb +130 -106
  38. data/lib/sisimai/lhost/sendmail.rb +19 -18
  39. data/lib/sisimai/lhost/v5sendmail.rb +88 -60
  40. data/lib/sisimai/lhost/verizon.rb +2 -2
  41. data/lib/sisimai/lhost/x1.rb +1 -1
  42. data/lib/sisimai/lhost/x2.rb +1 -2
  43. data/lib/sisimai/lhost/x3.rb +2 -2
  44. data/lib/sisimai/lhost/x6.rb +1 -1
  45. data/lib/sisimai/lhost/zoho.rb +2 -2
  46. data/lib/sisimai/lhost.rb +18 -21
  47. data/lib/sisimai/message.rb +93 -146
  48. data/lib/sisimai/order.rb +21 -77
  49. data/lib/sisimai/reason/authfailure.rb +1 -4
  50. data/lib/sisimai/reason/badreputation.rb +2 -2
  51. data/lib/sisimai/reason/blocked.rb +7 -10
  52. data/lib/sisimai/reason/contenterror.rb +7 -1
  53. data/lib/sisimai/reason/exceedlimit.rb +1 -4
  54. data/lib/sisimai/reason/failedstarttls.rb +42 -0
  55. data/lib/sisimai/reason/filtered.rb +5 -4
  56. data/lib/sisimai/reason/hasmoved.rb +1 -2
  57. data/lib/sisimai/reason/hostunknown.rb +3 -3
  58. data/lib/sisimai/reason/mailboxfull.rb +2 -4
  59. data/lib/sisimai/reason/mailererror.rb +1 -2
  60. data/lib/sisimai/reason/mesgtoobig.rb +2 -4
  61. data/lib/sisimai/reason/norelaying.rb +2 -3
  62. data/lib/sisimai/reason/notaccept.rb +2 -3
  63. data/lib/sisimai/reason/notcompliantrfc.rb +10 -4
  64. data/lib/sisimai/reason/rejected.rb +1 -1
  65. data/lib/sisimai/reason/requireptr.rb +2 -2
  66. data/lib/sisimai/reason/securityerror.rb +1 -3
  67. data/lib/sisimai/reason/spamdetected.rb +6 -8
  68. data/lib/sisimai/reason/speeding.rb +1 -2
  69. data/lib/sisimai/reason/suppressed.rb +36 -0
  70. data/lib/sisimai/reason/suspend.rb +1 -3
  71. data/lib/sisimai/reason/systemerror.rb +5 -0
  72. data/lib/sisimai/reason/toomanyconn.rb +1 -2
  73. data/lib/sisimai/reason/userunknown.rb +1 -1
  74. data/lib/sisimai/reason/virusdetected.rb +5 -6
  75. data/lib/sisimai/reason.rb +77 -73
  76. data/lib/sisimai/rfc1123.rb +152 -0
  77. data/lib/sisimai/rfc1894.rb +102 -62
  78. data/lib/sisimai/rfc2045.rb +2 -1
  79. data/lib/sisimai/rfc3464/thirdparty.rb +102 -0
  80. data/lib/sisimai/rfc3464.rb +222 -343
  81. data/lib/sisimai/rfc3834.rb +1 -1
  82. data/lib/sisimai/rfc5322.rb +7 -17
  83. data/lib/sisimai/rfc791.rb +69 -0
  84. data/lib/sisimai/rhost/aol.rb +36 -0
  85. data/lib/sisimai/rhost/apple.rb +5 -2
  86. data/lib/sisimai/rhost/cox.rb +3 -2
  87. data/lib/sisimai/rhost/facebook.rb +100 -0
  88. data/lib/sisimai/rhost/franceptt.rb +3 -2
  89. data/lib/sisimai/rhost/godaddy.rb +3 -2
  90. data/lib/sisimai/rhost/google.rb +19 -17
  91. data/lib/sisimai/rhost/gsuite.rb +42 -0
  92. data/lib/sisimai/rhost/iua.rb +3 -3
  93. data/lib/sisimai/rhost/kddi.rb +3 -2
  94. data/lib/sisimai/rhost/messagelabs.rb +37 -0
  95. data/lib/sisimai/rhost/microsoft.rb +56 -49
  96. data/lib/sisimai/rhost/mimecast.rb +29 -27
  97. data/lib/sisimai/rhost/nttdocomo.rb +4 -3
  98. data/lib/sisimai/rhost/outlook.rb +36 -0
  99. data/lib/sisimai/rhost/spectrum.rb +3 -2
  100. data/lib/sisimai/rhost/tencent.rb +3 -2
  101. data/lib/sisimai/rhost/yahooinc.rb +4 -3
  102. data/lib/sisimai/rhost.rb +69 -39
  103. data/lib/sisimai/smtp/command.rb +31 -21
  104. data/lib/sisimai/smtp/failure.rb +103 -0
  105. data/lib/sisimai/smtp/reply.rb +29 -25
  106. data/lib/sisimai/smtp/status.rb +36 -19
  107. data/lib/sisimai/smtp/transcript.rb +15 -15
  108. data/lib/sisimai/string.rb +0 -46
  109. data/lib/sisimai/version.rb +1 -1
  110. data/set-of-emails/maildir/bsd/lhost-postfix-30.eml +81 -81
  111. data/set-of-emails/maildir/bsd/{lhost-aol-03.eml → rhost-aol-03.eml} +1264 -1264
  112. data/set-of-emails/maildir/bsd/{lhost-aol-04.eml → rhost-aol-04.eml} +1260 -1260
  113. data/set-of-emails/maildir/bsd/{lhost-aol-05.eml → rhost-aol-05.eml} +105 -105
  114. data/set-of-emails/maildir/bsd/{lhost-aol-06.eml → rhost-aol-06.eml} +105 -105
  115. data/set-of-emails/maildir/bsd/rhost-gsuite-01.eml +189 -0
  116. data/set-of-emails/maildir/bsd/rhost-gsuite-02.eml +180 -0
  117. data/set-of-emails/maildir/bsd/rhost-gsuite-03.eml +251 -0
  118. data/set-of-emails/maildir/bsd/rhost-gsuite-04.eml +211 -0
  119. data/set-of-emails/maildir/bsd/rhost-gsuite-05.eml +226 -0
  120. data/set-of-emails/maildir/bsd/rhost-gsuite-06.eml +257 -0
  121. data/set-of-emails/maildir/bsd/rhost-gsuite-07.eml +289 -0
  122. data/set-of-emails/maildir/bsd/rhost-gsuite-08.eml +231 -0
  123. data/set-of-emails/maildir/bsd/rhost-gsuite-09.eml +231 -0
  124. data/set-of-emails/maildir/bsd/rhost-gsuite-10.eml +254 -0
  125. data/set-of-emails/maildir/bsd/rhost-gsuite-11.eml +228 -0
  126. data/set-of-emails/maildir/bsd/rhost-gsuite-12.eml +271 -0
  127. data/set-of-emails/maildir/bsd/rhost-gsuite-13.eml +261 -0
  128. data/set-of-emails/maildir/bsd/rhost-gsuite-14.eml +273 -0
  129. data/set-of-emails/maildir/bsd/rhost-gsuite-15.eml +229 -0
  130. data/set-of-emails/maildir/bsd/{lhost-messagelabs-01.eml → rhost-messagelabs-01.eml} +93 -93
  131. data/set-of-emails/maildir/bsd/rhost-outlook-01.eml +72 -0
  132. data/set-of-emails/maildir/bsd/rhost-outlook-02.eml +72 -0
  133. data/set-of-emails/maildir/bsd/rhost-outlook-03.eml +72 -0
  134. data/set-of-emails/maildir/bsd/rhost-outlook-04.eml +79 -0
  135. data/set-of-emails/maildir/bsd/rhost-outlook-06.eml +75 -0
  136. data/set-of-emails/maildir/bsd/rhost-outlook-07.eml +70 -0
  137. data/set-of-emails/maildir/bsd/rhost-outlook-08.eml +70 -0
  138. data/set-of-emails/maildir/bsd/rhost-outlook-09.eml +56 -0
  139. data/set-of-emails/maildir/tmp/arf-22.eml +49 -0
  140. data/set-of-emails/maildir/tmp/arf-23.eml +49 -0
  141. data/set-of-emails/maildir/tmp/arf-24.eml +50 -0
  142. data/set-of-emails/maildir/tmp/lhost-exim-07.eml +28 -0
  143. metadata +73 -56
  144. data/lib/sisimai/lhost/amavis.rb +0 -163
  145. data/lib/sisimai/lhost/amazonworkmail.rb +0 -127
  146. data/lib/sisimai/lhost/aol.rb +0 -125
  147. data/lib/sisimai/lhost/barracuda.rb +0 -92
  148. data/lib/sisimai/lhost/bigfoot.rb +0 -125
  149. data/lib/sisimai/lhost/facebook.rb +0 -188
  150. data/lib/sisimai/lhost/gsuite.rb +0 -194
  151. data/lib/sisimai/lhost/mailru.rb +0 -214
  152. data/lib/sisimai/lhost/mcafee.rb +0 -109
  153. data/lib/sisimai/lhost/messagelabs.rb +0 -120
  154. data/lib/sisimai/lhost/mxlogic.rb +0 -198
  155. data/lib/sisimai/lhost/office365.rb +0 -252
  156. data/lib/sisimai/lhost/outlook.rb +0 -129
  157. data/lib/sisimai/lhost/powermta.rb +0 -118
  158. data/lib/sisimai/lhost/receivingses.rb +0 -126
  159. data/lib/sisimai/lhost/sendgrid.rb +0 -150
  160. data/lib/sisimai/lhost/surfcontrol.rb +0 -105
  161. data/lib/sisimai/lhost/x4.rb +0 -269
  162. data/lib/sisimai/lhost/x5.rb +0 -112
  163. data/lib/sisimai/lhost/yahoo.rb +0 -102
  164. data/lib/sisimai/lhost/yandex.rb +0 -118
  165. data/lib/sisimai/mda.rb +0 -121
  166. data/lib/sisimai/smtp/error.rb +0 -119
  167. /data/set-of-emails/maildir/bsd/{lhost-googlegroups-15.eml → lhost-googleworkspace-01.eml} +0 -0
  168. /data/set-of-emails/maildir/bsd/{lhost-x4-08.eml → lhost-x2-06.eml} +0 -0
  169. /data/set-of-emails/maildir/bsd/{lhost-gsuite-01.eml → rfc3464-51.eml} +0 -0
  170. /data/set-of-emails/maildir/bsd/{lhost-gsuite-03.eml → rfc3464-52.eml} +0 -0
  171. /data/set-of-emails/maildir/bsd/{lhost-gsuite-04.eml → rfc3464-53.eml} +0 -0
  172. /data/set-of-emails/maildir/bsd/{lhost-gsuite-05.eml → rfc3464-54.eml} +0 -0
  173. /data/set-of-emails/maildir/bsd/{lhost-gsuite-06.eml → rfc3464-55.eml} +0 -0
  174. /data/set-of-emails/maildir/bsd/{lhost-gsuite-07.eml → rfc3464-56.eml} +0 -0
  175. /data/set-of-emails/maildir/bsd/{lhost-gsuite-08.eml → rfc3464-57.eml} +0 -0
  176. /data/set-of-emails/maildir/bsd/{lhost-gsuite-09.eml → rfc3464-58.eml} +0 -0
  177. /data/set-of-emails/maildir/bsd/{lhost-gsuite-10.eml → rfc3464-59.eml} +0 -0
  178. /data/set-of-emails/maildir/bsd/{lhost-gsuite-11.eml → rfc3464-60.eml} +0 -0
  179. /data/set-of-emails/maildir/bsd/{lhost-gsuite-12.eml → rfc3464-61.eml} +0 -0
  180. /data/set-of-emails/maildir/bsd/{lhost-gsuite-13.eml → rfc3464-62.eml} +0 -0
  181. /data/set-of-emails/maildir/bsd/{lhost-gsuite-14.eml → rfc3464-63.eml} +0 -0
  182. /data/set-of-emails/maildir/bsd/{lhost-gsuite-15.eml → rfc3464-64.eml} +0 -0
  183. /data/set-of-emails/maildir/bsd/{lhost-gsuite-02.eml → rfc3464-65.eml} +0 -0
  184. /data/set-of-emails/maildir/bsd/{lhost-aol-01.eml → rhost-aol-01.eml} +0 -0
  185. /data/set-of-emails/maildir/bsd/{lhost-aol-02.eml → rhost-aol-02.eml} +0 -0
  186. /data/set-of-emails/maildir/bsd/{lhost-facebook-03.eml → rhost-facebook-03.eml} +0 -0
  187. /data/set-of-emails/maildir/bsd/{lhost-facebook-04.eml → rhost-facebook-04.eml} +0 -0
  188. /data/set-of-emails/maildir/bsd/{lhost-messagelabs-02.eml → rhost-messagelabs-02.eml} +0 -0
  189. /data/set-of-emails/maildir/bsd/{lhost-messagelabs-03.eml → rhost-messagelabs-03.eml} +0 -0
  190. /data/set-of-emails/maildir/{bsd → tmp}/rfc3464-37.eml +0 -0
  191. /data/set-of-emails/maildir/{bsd → tmp}/rfc3464-38.eml +0 -0
  192. /data/set-of-emails/maildir/{bsd → tmp}/rfc3464-39.eml +0 -0
data/lib/sisimai/mda.rb DELETED
@@ -1,121 +0,0 @@
1
- module Sisimai
2
- # Sisimai::MDA - Error message decoder for MDA
3
- module MDA
4
- class << self
5
- AgentNames = {
6
- # dovecot/src/deliver/deliver.c
7
- # 11: #define DEFAULT_MAIL_REJECTION_HUMAN_REASON \
8
- # 12: "Your message to <%t> was automatically rejected:%n%r"
9
- 'dovecot' => ['Your message to ', ' was automatically rejected:'],
10
- 'mail.local' => ['mail.local: '],
11
- 'procmail' => ['procmail: '],
12
- 'maildrop' => ['maildrop: '],
13
- 'vpopmail' => ['vdelivermail: '],
14
- 'vmailmgr' => ['vdeliver: '],
15
- }.freeze
16
-
17
- # dovecot/src/deliver/mail-send.c:94
18
- MessagesOf = {
19
- 'dovecot' => {
20
- 'userunknown' => ["mailbox doesn't exist: "],
21
- 'mailboxfull' => [
22
- 'quota exceeded', # Dovecot 1.2 dovecot/src/plugins/quota/quota.c
23
- 'quota exceeded (mailbox for user is full)', # dovecot/src/plugins/quota/quota.c
24
- 'not enough disk space',
25
- ],
26
- },
27
- 'mail.local' => {
28
- 'userunknown' => [
29
- ': unknown user:',
30
- ': user unknown',
31
- ': invalid mailbox path',
32
- ': user missing home directory',
33
- ],
34
- 'mailboxfull' => [
35
- 'disc quota exceeded',
36
- 'mailbox full or quota exceeded',
37
- ],
38
- 'systemerror' => ['temporary file write error'],
39
- },
40
- 'procmail' => {
41
- 'mailboxfull' => ['quota exceeded while writing'],
42
- 'systemfull' => ['no space left to finish writing'],
43
- },
44
- 'maildrop' => {
45
- 'userunknown' => [
46
- 'invalid user specified.',
47
- 'Cannot find system user',
48
- ],
49
- 'mailboxfull' => ['maildir over quota.'],
50
- },
51
- 'vpopmail' => {
52
- 'userunknown' => ['sorry, no mailbox here by that name.'],
53
- 'filtered' => [
54
- 'account is locked email bounced',
55
- 'user does not exist, but will deliver to '
56
- ],
57
- 'mailboxfull' => ['domain is over quota', 'user is over quota'],
58
- },
59
- 'vmailmgr' => {
60
- 'userunknown' => [
61
- 'invalid or unknown base user or domain',
62
- 'invalid or unknown virtual user',
63
- 'user name does not refer to a virtual user'
64
- ],
65
- 'mailboxfull' => ['delivery failed due to system quota violation'],
66
- },
67
- }.freeze
68
-
69
- # @abstract Decodes the message body and return the MDA name, the reason, and the error message
70
- # @param [Hash] mhead Message headers of a bounce email
71
- # @param [String] mbody Message body of a bounce email
72
- # @return [Hash] Bounce data list and message/rfc822 part
73
- # @return [Nil] it failed to decode or the arguments are missing
74
- def inquire(mhead, mbody)
75
- return nil unless mhead
76
- return nil unless mbody.size > 0
77
- return nil unless mhead['from'].downcase.start_with?('mail delivery subsystem','mailer-daemon', 'postmaster')
78
-
79
- deliversby = '' # [String] Mail Delivery Agent name
80
- reasonname = '' # [String] Error reason
81
- bouncemesg = '' # [String] Error message
82
- linebuffer = mbody.split("\n")
83
-
84
- AgentNames.each_key do |e|
85
- # Find a mail delivery agent name from the entire message body
86
- p = mbody.index(AgentNames[e][0])
87
- next unless p
88
-
89
- if AgentNames[e].size > 1
90
- # Try to find the 2nd argument
91
- q = mbody.index(AgentNames[e][1])
92
- next unless q
93
- next if p > q
94
- end
95
- deliversby = e
96
- break
97
- end
98
- return nil if deliversby.empty?
99
-
100
- MessagesOf[deliversby].each_key do |e|
101
- # Detect an error reason from message patterns of the MDA.
102
- linebuffer.each do |f|
103
- # Whether the error message include each message defined in MessagesOf
104
- next unless MessagesOf[deliversby][e].any? { |a| f.downcase.include?(a) }
105
- reasonname = e
106
- bouncemesg = f
107
- break
108
- end
109
- break if bouncemesg.size > 0 && reasonname.size > 0
110
- end
111
-
112
- return {
113
- 'mda' => deliversby,
114
- 'reason' => reasonname || '',
115
- 'message' => bouncemesg || '',
116
- }
117
- end
118
- end
119
- end
120
- end
121
-
@@ -1,119 +0,0 @@
1
- module Sisimai
2
- module SMTP
3
- # Sisimai::SMTP::Error is utilities for checking SMTP Errors from error message text.
4
- module Error
5
- class << self
6
- require 'sisimai/smtp/reply'
7
- require 'sisimai/smtp/status'
8
-
9
- SoftOrHard = {
10
- 'soft' => %w[
11
- blocked contenterror exceedlimit expired filtered mailboxfull mailererror mesgtoobig
12
- networkerror norelaying policyviolation rejected securityerror spamdetected suspend
13
- syntaxerror systemerror systemfull toomanyconn virusdetected],
14
- 'hard' => %w[hasmoved hostunknown userunknown]
15
- }.freeze
16
-
17
- # Permanent error or not
18
- # @param [String] argv1 String including SMTP Status code
19
- # @return [Boolean] true: Permanet error
20
- # false: Temporary error
21
- # nil: is not an error
22
- # @since v4.17.3
23
- def is_permanent(argv1 = '')
24
- return nil unless argv1
25
- permanent1 = nil
26
- statuscode = Sisimai::SMTP::Status.find(argv1) || Sisimai::SMTP::Reply.find(argv1) || '0'
27
-
28
- if (classvalue = statuscode[0, 1].to_i) > 0
29
- # 2, 4, or 5
30
- if classvalue == 5
31
- # Permanent error
32
- permanent1 = true
33
-
34
- elsif classvalue == 4
35
- # Temporary error
36
- permanent1 = false
37
-
38
- elsif classvalue == 2
39
- # Succeeded
40
- permanent1 = nil
41
- end
42
- else
43
- # Check with regular expression
44
- v = argv1.downcase
45
- permanent1 = if v.include?('temporar') || v.include?('persistent')
46
- # Temporary failure
47
- false
48
- elsif v.include?('permanent')
49
- # Permanently failure
50
- true
51
- end
52
- end
53
-
54
- return permanent1
55
- end
56
-
57
- # Check softbounce or not
58
- # @param [String] argv1 Detected bounce reason
59
- # @param [String] argv2 String including SMTP Status code
60
- # @return [String] 'soft': Soft bounce
61
- # 'hard': Hard bounce
62
- # '': May not be bounce ?
63
- # @since v4.17.3
64
- def soft_or_hard(argv1 = '', argv2 = '')
65
- return nil unless argv1
66
- return nil if argv1.empty?
67
- value = nil
68
-
69
- if %w[delivered feedback vacation].include?(argv1)
70
- # These are not dealt as a bounce reason
71
- value = ''
72
-
73
- elsif argv1 == 'onhold' || argv1 == 'undefined'
74
- # It should be "soft" when a reason is "onhold" or "undefined"
75
- value = 'soft'
76
-
77
- elsif argv1 == 'notaccept'
78
- # NotAccept: 5xx => hard bounce, 4xx => soft bounce
79
- if argv2.size > 0
80
- # Get D.S.N. or SMTP reply code from The 2nd argument string
81
- statuscode = Sisimai::SMTP::Status.find(argv2) || Sisimai::SMTP::Reply.find(argv2) || '0'
82
- value = if statuscode.start_with?('4')
83
- # Deal as a "soft bounce"
84
- 'soft'
85
- else
86
- # 5 or 0, deal as a "hard bounce"
87
- 'hard'
88
- end
89
- else
90
- # "notaccept" is a hard bounce
91
- value = 'hard'
92
- end
93
-
94
- else
95
- # Check all the reasons defined at the above
96
- catch :SOFT_OR_HARD do
97
- while true
98
- %w[hard soft].each do |e|
99
- # Soft or Hard?
100
- SoftOrHard[e].each do |f|
101
- # Hard bounce?
102
- next unless argv1 == f
103
- value = e
104
- throw :SOFT_OR_HARD
105
- end
106
- end
107
-
108
- break
109
- end
110
- end
111
- end
112
-
113
- return value
114
- end
115
-
116
- end
117
- end
118
- end
119
- end
File without changes
File without changes
File without changes