sisimai 5.6.0 → 5.7.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake-test.yml +0 -4
  3. data/ChangeLog.md +32 -0
  4. data/README-JA.md +19 -16
  5. data/README.md +23 -21
  6. data/lib/sisimai/address.rb +8 -31
  7. data/lib/sisimai/arf.rb +3 -5
  8. data/lib/sisimai/fact.rb +12 -37
  9. data/lib/sisimai/lhost/activehunter.rb +0 -2
  10. data/lib/sisimai/lhost/amazonses.rb +6 -8
  11. data/lib/sisimai/lhost/apachejames.rb +0 -1
  12. data/lib/sisimai/lhost/biglobe.rb +0 -16
  13. data/lib/sisimai/lhost/courier.rb +5 -4
  14. data/lib/sisimai/lhost/deutschetelekom.rb +120 -0
  15. data/lib/sisimai/lhost/domino.rb +0 -3
  16. data/lib/sisimai/lhost/dragonfly.rb +0 -27
  17. data/lib/sisimai/lhost/einsundeins.rb +1 -10
  18. data/lib/sisimai/lhost/exchange2003.rb +4 -4
  19. data/lib/sisimai/lhost/exchange2007.rb +3 -4
  20. data/lib/sisimai/lhost/exim.rb +30 -78
  21. data/lib/sisimai/lhost/ezweb.rb +12 -49
  22. data/lib/sisimai/lhost/fml.rb +4 -29
  23. data/lib/sisimai/lhost/gmail.rb +0 -23
  24. data/lib/sisimai/lhost/gmx.rb +7 -24
  25. data/lib/sisimai/lhost/googlegroups.rb +3 -3
  26. data/lib/sisimai/lhost/googleworkspace.rb +0 -4
  27. data/lib/sisimai/lhost/imailserver.rb +3 -9
  28. data/lib/sisimai/lhost/kddi.rb +6 -20
  29. data/lib/sisimai/lhost/mailfoundry.rb +0 -2
  30. data/lib/sisimai/lhost/mailmarshal.rb +1 -3
  31. data/lib/sisimai/lhost/messagingserver.rb +4 -15
  32. data/lib/sisimai/lhost/mfilter.rb +0 -1
  33. data/lib/sisimai/lhost/mimecast.rb +0 -1
  34. data/lib/sisimai/lhost/notes.rb +1 -2
  35. data/lib/sisimai/lhost/opensmtpd.rb +0 -40
  36. data/lib/sisimai/lhost/postfix.rb +10 -11
  37. data/lib/sisimai/lhost/qmail.rb +14 -81
  38. data/lib/sisimai/lhost/sendmail.rb +4 -4
  39. data/lib/sisimai/lhost/trendmicro.rb +3 -3
  40. data/lib/sisimai/lhost/v5sendmail.rb +0 -1
  41. data/lib/sisimai/lhost/verizon.rb +1 -2
  42. data/lib/sisimai/lhost/x1.rb +1 -2
  43. data/lib/sisimai/lhost/x2.rb +0 -2
  44. data/lib/sisimai/lhost/x3.rb +4 -9
  45. data/lib/sisimai/lhost/x6.rb +0 -1
  46. data/lib/sisimai/lhost/zoho.rb +0 -12
  47. data/lib/sisimai/lhost.rb +38 -19
  48. data/lib/sisimai/message.rb +1 -1
  49. data/lib/sisimai/order.rb +4 -1
  50. data/lib/sisimai/reason/authfailure.rb +2 -2
  51. data/lib/sisimai/reason/contenterror.rb +2 -0
  52. data/lib/sisimai/reason/emailtoolarge.rb +1 -1
  53. data/lib/sisimai/reason/expired.rb +13 -2
  54. data/lib/sisimai/reason/hostunknown.rb +9 -0
  55. data/lib/sisimai/reason/mailboxfull.rb +3 -2
  56. data/lib/sisimai/reason/networkerror.rb +13 -1
  57. data/lib/sisimai/reason/norelaying.rb +4 -3
  58. data/lib/sisimai/reason/notaccept.rb +10 -3
  59. data/lib/sisimai/reason/notcompliantrfc.rb +1 -0
  60. data/lib/sisimai/reason/policyviolation.rb +6 -1
  61. data/lib/sisimai/reason/rejected.rb +6 -0
  62. data/lib/sisimai/reason/securityerror.rb +1 -0
  63. data/lib/sisimai/reason/suspend.rb +4 -0
  64. data/lib/sisimai/reason/syntaxerror.rb +1 -8
  65. data/lib/sisimai/reason/systemerror.rb +18 -0
  66. data/lib/sisimai/reason/userunknown.rb +2 -0
  67. data/lib/sisimai/reason.rb +7 -7
  68. data/lib/sisimai/rfc1123.rb +1 -1
  69. data/lib/sisimai/rfc1894.rb +7 -6
  70. data/lib/sisimai/rfc2045.rb +2 -2
  71. data/lib/sisimai/rfc3464/thirdparty.rb +1 -1
  72. data/lib/sisimai/rfc3464.rb +10 -14
  73. data/lib/sisimai/rfc3834.rb +3 -4
  74. data/lib/sisimai/rfc791.rb +3 -38
  75. data/lib/sisimai/rhost/microsoft.rb +4 -0
  76. data/lib/sisimai/rhost.rb +1 -1
  77. data/lib/sisimai/smtp/status.rb +23 -19
  78. data/lib/sisimai/string.rb +0 -12
  79. data/lib/sisimai/version.rb +1 -1
  80. data/set-of-emails/maildir/bsd/lhost-deutschetelekom-01.eml +66 -0
  81. data/set-of-emails/maildir/bsd/lhost-deutschetelekom-02.eml +68 -0
  82. data/set-of-emails/maildir/bsd/lhost-deutschetelekom-03.eml +50 -0
  83. data/set-of-emails/should-not-crash/p5-664-iomart-mail-filter.eml +258 -0
  84. data/set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet/.gitkeep +0 -0
  85. metadata +8 -2
@@ -125,7 +125,7 @@ module Sisimai
125
125
  sourcetext = sourcetext.gsub("[", " [").gsub("(", " (").gsub("<", " <") # Prefix a space character before each bracket
126
126
  sourcetext = sourcetext.gsub("]", "] ").gsub(")", ") ").gsub(">", "> ") # Suffix a space character behind each bracket
127
127
  sourcetext = sourcetext.gsub(":", ": ").gsub(";", "; ") # Suffix a space character behind : and ;
128
- sourcetext = Sisimai::String.sweep(sourcetext)
128
+ sourcetext = sourcetext.split.join(" ")
129
129
 
130
130
  catch :MAKELIST do
131
131
  Sandwiched.each do |e|
@@ -146,7 +146,7 @@ module Sisimai
146
146
  return nil if argv0.empty?
147
147
  label = Sisimai::RFC1894.label(argv0)
148
148
  group = FieldGroup[label] || ''
149
- parts = argv0.split(":", 2); parts[1] = parts[1].nil? ? "" : Sisimai::String.sweep(parts[1])
149
+ parts = argv0.split(":", 2); parts[1] = parts[1].nil? ? "" : parts[1].split.join(" ")
150
150
  return nil if group.empty? || CapturesOn[group].nil?
151
151
 
152
152
  # Try to match with each pattern of Per-Message field, Per-Recipient field
@@ -157,24 +157,25 @@ module Sisimai
157
157
  # - 4: Comment
158
158
  table = [label, "", "", group, ""]
159
159
 
160
- if group == 'addr' || group == 'code' || group == 'host'
160
+ case group
161
+ when "addr", "code", "host"
161
162
  # - Final-Recipient: RFC822; kijitora@nyaan.jp
162
163
  # - Diagnostic-Code: SMTP; 550 5.1.1 <kijitora@example.jp>... User Unknown
163
164
  # - Remote-MTA: DNS; mx.example.jp
164
165
  if parts[1].include?(";")
165
166
  # There is a valid sub type (including ";")
166
167
  v = parts[1].split(";", 2)
167
- table[1] = Sisimai::String.sweep(v[0]).upcase if v.size > 0
168
- table[2] = Sisimai::String.sweep(v[1]) if v.size > 1
168
+ table[1] = v[0].split.join(" ").upcase if v.size > 0
169
+ table[2] = v[1].split.join(" ") if v.size > 1
169
170
  else
170
171
  # There is no sub type like "Diagnostic-Code: 550 5.1.1 <kijitora@example.jp>..."
171
- table[2] = Sisimai::String.sweep(parts[1])
172
+ table[2] = parts[1]
172
173
  table[1] = SubtypeSet[group] || ""
173
174
  end
174
175
  table[2] = table[2].downcase if group == "host"
175
176
  table[2] = "" if table[2] =~ /\A\s+\z/
176
177
 
177
- elsif group == "list"
178
+ when "list"
178
179
  # Action: failed
179
180
  # Check that the value is an available value defined in "ActionList" or not.
180
181
  # When the value is invalid, convert to an available value defined in "Correction"
@@ -146,7 +146,7 @@ module Sisimai
146
146
  return nil if block.empty?
147
147
 
148
148
  (upperchunk, lowerchunk) = block.split("\n\n", 2)
149
- return ['', ''] if upperchunk.nil? || upperchunk.empty?
149
+ return ['', ''] if upperchunk.nil? || upperchunk.empty? || lowerchunk.nil?
150
150
  return ['', ''] if upperchunk.index('Content-Type').nil?
151
151
 
152
152
  headerpart = ['', ''] # ["text/plain; charset=iso-2022-jp; ...", "quoted-printable"]
@@ -263,7 +263,7 @@ module Sisimai
263
263
  # @return [String] Message body
264
264
  def makeflat(argv0 = '', argv1 = '')
265
265
  return "" if argv0.nil? || argv1.nil?
266
- return "" if argv0.index('multipart/') == false || argv0.index('boundary=') == false
266
+ return "" if argv0.downcase.index('multipart/') == false || argv0.downcase.index('boundary=') == false
267
267
 
268
268
  # Some bounce messages include lower-cased "content-type:" field such as the followings:
269
269
  # - content-type: message/delivery-status => Content-Type: message/delivery-status
@@ -71,7 +71,7 @@ module Sisimai
71
71
  fieldparts = argv1.split(":", 2)
72
72
  xfieldname = fieldparts[0].downcase
73
73
  xgroupname = FieldGroup[xfieldname]; return [] if xgroupname.nil?
74
- xfieldlist = ["", "", Sisimai::String.sweep(fieldparts[1]), xgroupname, "", "PowerMTA"]
74
+ xfieldlist = ["", "", fieldparts[1].split.join(" "), xgroupname, "", "PowerMTA"]
75
75
 
76
76
  # - 0: Field-Name
77
77
  # - 1: Sub Type: RFC822, DNS, X-Unix, and so on)
@@ -109,16 +109,12 @@ module Sisimai
109
109
  if isboundary.any? { |a| e == a } then goestonext = false; break; end
110
110
  if e.start_with?("Content-Type:")
111
111
  # Content-Type: field in multipart/*
112
- if e.include?("multipart/")
112
+ case
113
113
  # Content-Type: multipart/alternative; boundary=aa00220022222222ffeebb
114
114
  # Pick the boundary string and store it into "isboucdary"
115
- isboundary << Sisimai::RFC2045.boundary(e, 0)
116
- elsif e.include?("text/plain")
117
- # Content-Type: "text/plain"
118
- goestonext = false
119
- else
120
- # Other types: for example, text/html, image/jpg, and so on
121
- goestonext = true
115
+ when e.include?("multipart/") then isboundary << Sisimai::RFC2045.boundary(e, 0)
116
+ when e.include?("text/plain") then goestonext = false
117
+ else goestonext = true # Other types: for example, text/html, image/jpg, and so on
122
118
  end
123
119
  break
124
120
  end
@@ -145,7 +141,8 @@ module Sisimai
145
141
  next unless o = Sisimai::RFC1894.field(e)
146
142
  v = dscontents[-1]
147
143
 
148
- if o[3] == "addr"
144
+ case o[3]
145
+ when "addr"
149
146
  # Final-Recipient: rfc822; kijitora@example.jp
150
147
  # X-Actual-Recipient: rfc822; kijitora@example.co.jp
151
148
  if o[0] == "final-recipient"
@@ -165,7 +162,7 @@ module Sisimai
165
162
  # X-Actual-Recipient: rfc822; kijitora@example.co.jp
166
163
  v["alias"] = o[2]
167
164
  end
168
- elsif o[3] == "code"
165
+ when "code"
169
166
  # Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
170
167
  v["spec"] = o[1]
171
168
  v["diagnosis"] = o[2]
@@ -212,7 +209,7 @@ module Sisimai
212
209
  # Diagnostic-Code: SMTP; 550-5.7.26 The MAIL FROM domain [email.example.jp]
213
210
  # has an SPF record with a hard fail
214
211
  next if e.start_with?(" ") == false
215
- v["diagnosis"] += " #{Sisimai::String.sweep(e)}"
212
+ v["diagnosis"] += " " + e
216
213
  end
217
214
  end
218
215
  end
@@ -232,7 +229,7 @@ module Sisimai
232
229
 
233
230
  if beforemesg != ""
234
231
  # Pick some values of $dscontents from the string before StartingOf[:message]
235
- beforemesg = Sisimai::String.sweep(beforemesg)
232
+ beforemesg = beforemesg.split.join(" ")
236
233
  alternates["command"] = Sisimai::SMTP::Command.find(beforemesg)
237
234
  alternates["replycode"] = Sisimai::SMTP::Reply.find(beforemesg, dscontents[0]["status"])
238
235
  alternates["status"] = Sisimai::SMTP::Status.find(beforemesg, alternates["replycode"])
@@ -242,7 +239,6 @@ module Sisimai
242
239
  dscontents.each do |e|
243
240
  # Set default values stored in "permessage" if each value in "dscontents" is empty.
244
241
  permessage.each_key { |a| e[a] ||= permessage[a] || '' }
245
- e["diagnosis"] = Sisimai::String.sweep(e["diagnosis"])
246
242
  lowercased = e["diagnosis"].downcase
247
243
 
248
244
  if recipients == 1
@@ -254,7 +250,7 @@ module Sisimai
254
250
  else
255
251
  # The value of e["diagnosis"] is not contained in $beforemesg
256
252
  # There may be an important error message in $beforemesg
257
- e["diagnosis"] = Sisimai::String.sweep(sprintf("%s %s", beforemesg, e["diagnosis"]))
253
+ e["diagnosis"] = sprintf("%s %s", beforemesg, e["diagnosis"])
258
254
  end
259
255
  end
260
256
  e["command"] = Sisimai::SMTP::Command.find(e["diagnosis"])
@@ -116,8 +116,7 @@ module Sisimai
116
116
  break if haveloaded >= maxmsgline
117
117
  end
118
118
  v['diagnosis'] ||= mhead['subject']
119
- v['diagnosis'] = Sisimai::String.sweep(v['diagnosis'])
120
- v['reason'] = 'vacation'
119
+ v['reason'] = 'vacation'
121
120
 
122
121
  cv = v['diagnosis'].downcase
123
122
  Suspending.each do |e|
@@ -127,8 +126,8 @@ module Sisimai
127
126
  break
128
127
  end
129
128
 
130
- v['date'] = mhead['date']
131
- v['status'] = ''
129
+ v['date'] = mhead['date']
130
+ v['status'] = ''
132
131
 
133
132
  if cv = lower['subject'].match(SubjectSet)
134
133
  # Get the Subject header from the original message
@@ -12,8 +12,7 @@ module Sisimai
12
12
 
13
13
  octet.each do |e|
14
14
  # Check each octet is between 0 and 255
15
- return false unless e =~ /\A[0-9]{1,3}\z/
16
- v = e.to_i
15
+ return false unless e =~ /\A[0-9]{1,3}\z/; v = e.to_i
17
16
  return false if v < 0 || v > 255
18
17
  end
19
18
  return true
@@ -27,42 +26,8 @@ module Sisimai
27
26
  return nil if argv0.to_s.empty?
28
27
  return [] if argv0.size < 7
29
28
 
30
- given = argv0.dup
31
- ipv4a = []
32
- %w|( ) [ ] ,|.each do |e|
33
- # Rewrite: "mx.example.jp[192.0.2.1]" => "mx.example.jp 192.0.2.1"
34
- p0 = given.index(e); next if p0.nil?
35
- given[p0, 1] = ' '
36
- end
37
-
38
- given.split(' ').each do |e|
39
- # Find string including an IPv4 address
40
- next if e.index('.').nil? # IPv4 address must include "." character
41
-
42
- lx = e.size; next if lx < 7 || lx > 17 # 0.0.0.0 = 7, [255.255.255.255] = 17
43
- cu = 0 # Cursor for seeking each octet of an IPv4 address
44
- as = '' # ASCII Code of each character
45
- eo = '' # Buffer of each octet of IPv4 Address
46
-
47
- while cu < lx
48
- # Check whether each character is a number or "." or not
49
- as = e[cu, 1].ord
50
- cu += 1
51
-
52
- if as < 48 || as > 57
53
- # The character is not a number(0-9)
54
- break if as != 46 # The character is not "."
55
- next if eo == '' # The current buffer is empty
56
- break if eo.to_i > 255 # The current buffer is greater than 255
57
- eo = ''
58
- next
59
- end
60
- eo += as.chr
61
- break if eo.to_i > 255
62
- end
63
- ipv4a << e if eo.size > 0 && eo.to_i < 256
64
- end
65
- return ipv4a
29
+ given = argv0.dup.tr('()[],', ' ').squeeze(' ')
30
+ return given.split(' ').select { |e| is_ipv4address(e) }
66
31
  end
67
32
 
68
33
  end
@@ -505,6 +505,10 @@ module Sisimai
505
505
  # can change this.
506
506
  ['5.7.136', 0, 0, 'sender was not authenticated'],
507
507
 
508
+ # - 550 5.7.193 UnifiedGroupAgent; Delivery failed because the sender isn't a group
509
+ # member or external senders aren't permitted to send to this group.
510
+ ["5.7.193", 0, 0, "sender isn't a group member or external senders aren't permitted"],
511
+
508
512
  # - The sending account has been banned due to detected spam activity.
509
513
  # - For details, see Fix email delivery issues for error code 451 5.7.500-699 (ASxxx)
510
514
  # in Exchange Online.
data/lib/sisimai/rhost.rb CHANGED
@@ -24,7 +24,7 @@ module Sisimai
24
24
  "Spectrum" => ["charter.net"],
25
25
  "Tencent" => [".qq.com"],
26
26
  "YahooInc" => [".yahoodns.net"],
27
- "Zoho" => [".zoho.com", ".zoho.eu"],
27
+ "Zoho" => [".zoho.com", ".zoho.eu", ".zoho.jp", ".zoho.com.au", ".zoho.com.cn", ".zoho.in"],
28
28
  }.freeze
29
29
 
30
30
  # Returns the rhost class name
@@ -155,6 +155,12 @@
155
155
  # X.3.5 --- System incorrectly configured:(RFC 3463)
156
156
  # The system is not configured in a manner that will permit it to accept this
157
157
  # message.
158
+ #
159
+ # X.3.6 250 Requested priority was changed:(RFC 6710)
160
+ # 251 The message was accepted for relay/delivery, but the requested priority (possibly
161
+ # the implied default) was not honored. The human readable text after the status
162
+ # code contains the new priority, followed by SP (space) and explanatory human
163
+ # readable text.
158
164
  # -------------------------------------------------------------------------------------------------
159
165
  # X.4.0 --- Other or undefined network or routing status:(RFC 3463)
160
166
  # Something went wrong with the networking, but it is not clear what the problem is,
@@ -391,7 +397,7 @@
391
397
  # 5xx temporary, for example the server is operating in a mode where only higher
392
398
  # priority messages below certain size are accepted for transfer and delivery.
393
399
  #
394
- # X.7.17 5xx Mailbox owner has changed:(RFC 6710)
400
+ # X.7.17 5xx Mailbox owner has changed:(RFC 7293)
395
401
  # This status code is returned when a message is received with a
396
402
  # Require-Recipient-Valid-Since field or RRVS extension and the receiving system is
397
403
  # able to determine that the intended recipient mailbox has not been under
@@ -680,12 +686,10 @@ module Sisimai
680
686
  def find(argv1 = nil, argv2 = '0')
681
687
  return "" if argv1.to_s.empty? || argv1.size < 7
682
688
 
683
- givenclass = argv2[0, 1]
684
- eestatuses = if givenclass == '2' || givenclass == '4' || givenclass == '5'
685
- [givenclass + '.']
686
- else
687
- ['5.', '4.', '2.']
688
- end
689
+ case argv2[0, 1]
690
+ when '2', '4', '5' then eestatuses = [argv2[0, 1] + '.']
691
+ else eestatuses = ['5.', '4.', '2.']
692
+ end
689
693
  esmtperror = ' ' + argv1 + ' ' # Why 3 space characters? see https://github.com/sisimai/p5-sisimai/issues/574
690
694
  lookingfor = []
691
695
 
@@ -822,22 +826,22 @@ module Sisimai
822
826
  end
823
827
 
824
828
  return statuscode if zeroindex2['error'] > 0 # An SMTP status code is "X.0.0"
825
- return codeinmesg if statuscode == '4.4.7' # "4.4.7" is an ambiguous code
826
- return codeinmesg if statuscode == '4.7.0' # "4.7.0" indicates "too many errors"
827
829
  return codeinmesg if statuscode.start_with?('5.3.') # "5.3.Z" is an error of a system
828
- return codeinmesg if statuscode.end_with?('.5.1') # "X.5.1" indicates an invalid command
829
- return codeinmesg if statuscode.end_with?('.5.2') # "X.5.2" indicates a syntax error
830
- return codeinmesg if statuscode.end_with?('.5.4') # "X.5.4" indicates an invalid command arguments
831
- return codeinmesg if statuscode.end_with?('.5.5') # "X.5.5" indicates a wrong protocol version
832
-
833
- if statuscode == '5.1.1'
830
+ return codeinmesg if statuscode.end_with?('.5.1', '.5.2', '.5.4', '.5.5')
831
+
832
+ case statuscode
833
+ # - "4.4.7" is an ambigous code
834
+ # - "4.7.0" indicates "too many errors"
835
+ # - "X.5.1" indicates an invalid command
836
+ # - "X.5.2" indicates a syntax error
837
+ # - "X.5.4" indicates an invalid command argument
838
+ # - "X.5.5" indicates a wrong protocol version
839
+ when "4.4.7", "4.7.0" then return codeinmesg
840
+ when "5.1.3" then return codeinmesg if codeinmesg.start_with?('5.7.')
841
+ when "5.1.1"
834
842
  # "5.1.1" is a code of "userunknown"
835
843
  return statuscode if codeinmesg.start_with?('5.5.') || zeroindex1['error'] > 0
836
844
  return codeinmesg
837
-
838
- elsif statuscode == '5.1.3'
839
- # "5.1.3"
840
- return codeinmesg if codeinmesg.start_with?('5.7.')
841
845
  end
842
846
 
843
847
  return statuscode
@@ -17,18 +17,6 @@ module Sisimai
17
17
  return false
18
18
  end
19
19
 
20
- # Clean the string out
21
- # @param [String] argv1 String to be cleaned
22
- # @return [String] Cleaned out string
23
- # @example Clean up text
24
- # sweep(' neko ') #=> 'neko'
25
- def sweep(argv1)
26
- return argv1 if argv1.is_a?(::String) == false
27
- argv1 = argv1.chomp.squeeze(' ').strip
28
- argv1 = argv1.sub(/ [-]{2,}[^ ].+\z/, '')
29
- return argv1
30
- end
31
-
32
20
  # Check if each element of the 2nd argument is aligned in the 1st argument or not
33
21
  # @param [String] argv1 String to be checked
34
22
  # @param [Array] argv2 List including the ordered strings
@@ -1,4 +1,4 @@
1
1
  # Define the version number of Sisimai
2
2
  module Sisimai
3
- VERSION = '5.6.0'.freeze
3
+ VERSION = '5.7.0'.freeze
4
4
  end
@@ -0,0 +1,66 @@
1
+ Received-SPF: None (no SPF record) identity=helo; client-ip=192.0.2.1; helo=mailout11.t-online.de; envelope-from=<>; receiver=mail.example.com
2
+ Received: from mailout11.t-online.de (mailout11.t-online.de [192.0.2.1])
3
+ by mail.example.com (Postfix) with ESMTPS id 2A29623F0
4
+ for <returnpath@mail.example.com>; Wed, 03 Jun 2026 17:30:52 +0000 (UTC)
5
+ Received: from mailin42.aul.t-online.de (mailin42.aul.t-online.de [192.51.100.1])
6
+ by mailout11.t-online.de (Postfix) with SMTP id 05E5A1CAC0
7
+ for <returnpath@mail.example.com>; Wed, 3 Jun 2026 19:23:42 +0200 (CEST)
8
+ X-Failed-Recipients: example@t-online.de
9
+ From: Mail Delivery System <Mailer-Daemon@t-online.de>
10
+ To: returnpath@mail.example.com
11
+ Subject: Mail delivery failed: returning message to sender
12
+ Message-Id: <xxxyyyzzzaaabbccc.aul.t-online.de>
13
+ Date: Wed, 3 Jun 2026 19:23:17 +0200
14
+ X-TOI-MSGID: c9412855-531f-497b-b007-5ffc033877a0
15
+ Authentication-Results: mailin42.aul.t-online.de; dkim=none;
16
+ dkim-atps=neutral
17
+
18
+ |------------------------- Failed addresses follow: ---------------------|
19
+ <example@t-online.de>
20
+ 552 5.2.2 <example@t-online.de> Quota exceeded (mailbox for user is full)
21
+
22
+ |------------------------- Message header follows: ----------------------|
23
+ Received: from mail.example.com ([152.53.207.210]) by mailin42.t-online.de
24
+ with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)
25
+ esmtp id 1wUpJD-0ZWsnR0; Wed, 3 Jun 2026 19:23:15 +0200
26
+ Received: by mail.example.com (Postfix)
27
+ id AD20B29490; Tue, 02 Jun 2026 20:17:41 +0000 (UTC)
28
+ Date: Tue, 02 Jun 2026 20:17:41 +0000
29
+ From: some corp <somecorp@example.com>
30
+ Reply-To: some corp <somecorp@example.com>
31
+ To: example@t-online.de
32
+ Message-ID: <outgoingmessageid>
33
+ Subject: Subject omitted for privacy
34
+ Mime-Version: 1.0
35
+ Content-Type: multipart/mixed;
36
+ boundary="--==_mimepart_6a1f3a659c89f_79afe920227275f";
37
+ charset=UTF-8
38
+ Content-Transfer-Encoding: 7bit
39
+
40
+ |----------- Message text follows: (body too large, truncated) ----------|
41
+
42
+ ----==_mimepart_6a1f3a659c89f_79afe920227275f
43
+ Content-Type: text/html;
44
+ charset=UTF-8
45
+ Content-Transfer-Encoding: quoted-printable
46
+
47
+ <!DOCTYPE html>
48
+ <html>
49
+ <head>
50
+ <meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Content-Type">=
51
+
52
+ <style>
53
+ #footer {
54
+ font-size: 11px;
55
+ border-top: 1px solid #666;
56
+ color: #333;
57
+ margin-top: 1em;
58
+ padding-top: 1em;
59
+ }
60
+ </style>
61
+
62
+ </head>
63
+ <body>
64
+ <p>Hello there, fellow some corp user!</p><p>I would like to inform you a=
65
+ about the upcoming team event next we
66
+
@@ -0,0 +1,68 @@
1
+ Received-SPF: None (no SPF record) identity=helo; client-ip=192.0.2.1; helo=mailout11.t-online.de; envelope-from=<>; receiver=mail.example.com
2
+ Received: from mailout11.t-online.de (mailout11.t-online.de [192.0.2.1])
3
+ by mail.example.com (Postfix) with ESMTPS id 2A29623F0
4
+ for <returnpath@mail.example.com>; Wed, 03 Jun 2026 17:30:52 +0000 (UTC)
5
+ Received: from mailin42.aul.t-online.de (mailin42.aul.t-online.de [192.51.100.1])
6
+ by mailout11.t-online.de (Postfix) with SMTP id 05E5A1CAC0
7
+ for <returnpath@mail.example.com>; Wed, 3 Jun 2026 19:23:42 +0200 (CEST)
8
+ X-Failed-Recipients: example@t-online.de
9
+ From: Mail Delivery System <Mailer-Daemon@t-online.de>
10
+ To: returnpath@mail.example.com
11
+ Subject: Mail delivery failed: returning message to sender
12
+ Message-Id: <xxxyyyzzzaaabbccc.aul.t-online.de>
13
+ Date: Wed, 3 Jun 2026 19:23:17 +0200
14
+ X-TOI-MSGID: c9412855-531f-497b-b007-5ffc033877a0
15
+ Authentication-Results: mailin42.aul.t-online.de; dkim=none;
16
+ dkim-atps=neutral
17
+
18
+ |------------------------- Failed addresses follow: ---------------------|
19
+ <example1@t-online.de>
20
+ 552 5.2.2 <example1@t-online.de> Quota exceeded (mailbox for user is full)
21
+ <example2@t-online.de>
22
+ 550 5.1.1 <example2@t-online.de> unknown user
23
+
24
+ |------------------------- Message header follows: ----------------------|
25
+ Received: from mail.example.com ([152.53.207.210]) by mailin42.t-online.de
26
+ with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)
27
+ esmtp id 1wUpJD-0ZWsnR0; Wed, 3 Jun 2026 19:23:15 +0200
28
+ Received: by mail.example.com (Postfix)
29
+ id AD20B29490; Tue, 02 Jun 2026 20:17:41 +0000 (UTC)
30
+ Date: Tue, 02 Jun 2026 20:17:41 +0000
31
+ From: some corp <somecorp@example.com>
32
+ Reply-To: some corp <somecorp@example.com>
33
+ To: <example1@t-online.de>, <example2@t-online.de>
34
+ Message-ID: <outgoingmessageid>
35
+ Subject: Subject omitted for privacy
36
+ Mime-Version: 1.0
37
+ Content-Type: multipart/mixed;
38
+ boundary="--==_mimepart_6a1f3a659c89f_79afe920227275f";
39
+ charset=UTF-8
40
+ Content-Transfer-Encoding: 7bit
41
+
42
+ |----------- Message text follows: (body too large, truncated) ----------|
43
+
44
+ ----==_mimepart_6a1f3a659c89f_79afe920227275f
45
+ Content-Type: text/html;
46
+ charset=UTF-8
47
+ Content-Transfer-Encoding: quoted-printable
48
+
49
+ <!DOCTYPE html>
50
+ <html>
51
+ <head>
52
+ <meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Content-Type">=
53
+
54
+ <style>
55
+ #footer {
56
+ font-size: 11px;
57
+ border-top: 1px solid #666;
58
+ color: #333;
59
+ margin-top: 1em;
60
+ padding-top: 1em;
61
+ }
62
+ </style>
63
+
64
+ </head>
65
+ <body>
66
+ <p>Hello there, fellow some corp user!</p><p>I would like to inform you a=
67
+ about the upcoming team event next we
68
+
@@ -0,0 +1,50 @@
1
+ Return-Path: <kijitora-nyaan@example.org>
2
+ Delivered-To: sironeko@example.jp
3
+ Received: from example.com (unknown [192.0.2.250])
4
+ by r1.example.co.jp (Postfix) with ESMTP id FFFFFFFF00
5
+ for <sironeko@example.jp>; Thu, 29 Apr 2006 23:34:45 +0000 (UTC)
6
+ Received: from r2.example.org (r2.example.org [192.0.2.25])
7
+ by smtp.nyaan.example.net (8.10.1/8.10.1) with ESMTP id k3k000000000
8
+ for <sironeko@nyaan.example.net>; Thu,29 Apr 2006 23:34:45 +0000
9
+ Received: from [203.0.113.25] (helo=r9.example.net)
10
+ by r2.example.org with esmtp (Exim 3.21 #1)
11
+ id AAAAAA-000000-22
12
+ for kijitora-nyaan@example.org; Thu, 29 Apr 2006 23:34:45 +0000
13
+ Received: from smtp1.r.example.net ([209.196.123.3])
14
+ by mx7.example.net with smtp (Exim 3.16 #10)
15
+ id BBBBBB-111111-22
16
+ for kijitora-nyaan@example.org; Thu, 29 Apr 2006 23:34:45 +0000
17
+ Message-Id: <ffffffffffffffff1@smtp1.r.example.net>
18
+ From: <MAILER-DAEMON@example.net>
19
+ To: kijitora-nyaan@example.org
20
+ Date: Thu, 29 Apr 2006 23:34:45 +0000 (UTC)
21
+ Subject: mail failed, returning to sender
22
+
23
+ |------------------------- Message log follows: -------------------------|
24
+ no valid recipients were found for this message
25
+ |------------------------- Failed addresses follow: ---------------------|
26
+ kijitora@neko.nyaan.example.com ... unknown host
27
+ |------------------------- Message text follows: ------------------------|
28
+ Received: from r2.example.org ([192.0.2.25])
29
+ by mx1.example.net with esmtp (Exim 3.22 #2)
30
+ id aaaaaa-444444-22
31
+ for kijitora@neosoft.com; Thu, 29 Apr 2006 23:34:45 +0000
32
+ Received: from localhost.localdomain ([127.0.0.1] helo=r2.example.org)
33
+ by r2.example.org with esmtp (Exim 3.22 #2)
34
+ id 000000-000000-00; Thu, 29 Apr 2006 23:34:45 +0000
35
+ Received: from [203.0.113.1] (helo=[127.0.0.1])
36
+ by r2.example.org with smtp (Exim 3.22 #2)
37
+ id eeeeee-rrrrrr-22
38
+ for neko-nyaan@example.org; Thu, 29 Apr 2006 23:34:45 +0000
39
+ Message-Id: <ffffffffffff000000002222000000000@e3.example.com>
40
+ To: kijitora@neko.nyaan.example.com
41
+ From: Neko <sironeko@example.jp>
42
+ Cc: neko-nyaan@example.org
43
+ Mime-Version: 1.0
44
+ Content-Type: text/plain; charset="us-ascii"; format=flowed
45
+ Date: Thu, 29 Apr 2006 23:34:45 +0000
46
+ Subject: Nyaan
47
+
48
+ Nyaan
49
+
50
+