sisimai 4.25.7 → 4.25.8

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.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f1b77e36c6dd34e04d4e5496afae3709b234905e2f41ad1a5ccfd4f903af59e
4
- data.tar.gz: 95b222529d8d3c7a5d2acc22d898fac5545f5124001e495bcb0e3928f9fc9b7a
3
+ metadata.gz: a97d3034cddf47a54f0970f324fde0b8574f19a11fd29fd85e11ecad9753f5f3
4
+ data.tar.gz: d60fd6b598d277b852f26ee42e483a4ffce7d946f6beefa374fe9aaeef6485a0
5
5
  SHA512:
6
- metadata.gz: a52ad0dbd698682364d9f78c705b724b3385bc49782ce89e721db3f31e66c65621b27223c0d3fc266a58bea81dfd450dbeb13b2ba3d721d99051fc279a2d06e5
7
- data.tar.gz: 6b31902787d1af057e17d8009602e3ea247a08a7d5bdcb6fa3c4a347d23bc2793dda8ef6ad466d70cb3af7940235bba6e9d94cacfa5e970c3fc1a2c1c67263df
6
+ metadata.gz: f569792981be8ffcf27846db477b98f814914fed55841d994b16843a668025926e737c7cf8b1ae5287049184714dddee99c0d7e2538f2de5e44ba35ab92f402c
7
+ data.tar.gz: cf079e53450f827e7c5e104a64a8abe75d8deba09be822f1cc178e85548abbd7829bc23f74f0a6ae361b331e2ebac07f705c207c9885a115bbcee1b7b125b2c7
@@ -1,4 +1,4 @@
1
- # rb-Sisimai/Benchmarks.mk
1
+ # rb-sisimai/Benchmarks.mk
2
2
  # ____ _ _ _
3
3
  # | __ ) ___ _ __ ___| |__ _ __ ___ __ _ _ __| | _____ _ __ ___ | | __
4
4
  # | _ \ / _ \ '_ \ / __| '_ \| '_ ` _ \ / _` | '__| |/ / __| | '_ ` _ \| |/ /
@@ -1,8 +1,28 @@
1
1
  RELEASE NOTES for Ruby version of Sisimai
2
2
  ================================================================================
3
- - releases: "https://github.com/sisimai/rb-Sisimai/releases"
3
+ - releases: "https://github.com/sisimai/rb-sisimai/releases"
4
4
  - download: "https://rubygems.org/gems/sisimai"
5
5
 
6
+ v4.25.8
7
+ --------------------------------------------------------------------------------
8
+ - release: "Fri, 17 Jul 2020 11:59:49 +0900 (JST)"
9
+ - version: "4.25.8"
10
+ - changes:
11
+ - **Repository URL was changed to https://github.com/sisimai/rb-sisimai**
12
+ - `Sisimai::Message.make` method was merged into `Sisimai::Message.new`
13
+ - `Sisimai::Message.divideup` returns an array (faster than a hash)
14
+ - Remove unused code blocks for deciding the order of email header fields at
15
+ `Sisimai::Data.make` method
16
+ - Remove old parameters: `datasrc` and `bounces` at the callback feature #189
17
+ - Implement `Sisimai::Rhost::Spectrum` for parsing bounce mails returned from
18
+ https://www.spectrum.com/.
19
+ - Remove unsed method `Sisimai::Rhost->list`
20
+ - Fix bugs in `Sisimai::Lhost::FML` and `Sisimai::Lhost::X5`
21
+ - Fix code for finding the value of `Diagnostic-Code` field in multiple lines
22
+ at `Sisimai::RFC3464`
23
+ - Implement Sisimai::Rhost::Cox for parsing bounce mails returned from Cox:
24
+ https://cox.com/ #193
25
+
6
26
  v4.25.7
7
27
  --------------------------------------------------------------------------------
8
28
  - release: "Sat, 25 Apr 2020 22:22:22 +0900 (JST)"
@@ -1,4 +1,4 @@
1
- # p5-Sisimai/Developers.mk
1
+ # rb-sisimai/Developers.mk
2
2
  # ____ _ _
3
3
  # | _ \ _____ _____| | ___ _ __ ___ _ __ ___ _ __ ___ | | __
4
4
  # | | | |/ _ \ \ / / _ \ |/ _ \| '_ \ / _ \ '__/ __| | '_ ` _ \| |/ /
@@ -15,7 +15,7 @@ LS := ls -1
15
15
  CP := cp
16
16
  RM := rm -f
17
17
 
18
- PERL5SISIMAI := p5-Sisimai
18
+ PERL5SISIMAI := p5-sisimai
19
19
  PRECISIONTAB := ANALYTICAL-PRECISION
20
20
  PARSERLOGDIR := tmp/parser-logs
21
21
  MAILCLASSDIR := lib/$(NAME)/Lhost
data/Makefile CHANGED
@@ -1,4 +1,4 @@
1
- # rb-Sisimai/Makefile
1
+ # rb-sisimai/Makefile
2
2
  # __ __ _ __ _ _
3
3
  # | \/ | __ _| | _____ / _(_) | ___
4
4
  # | |\/| |/ _` | |/ / _ \ |_| | |/ _ \
@@ -1,9 +1,9 @@
1
1
  ![](https://libsisimai.org/static/images/logo/sisimai-x01.png)
2
2
 
3
- [![License](https://img.shields.io/badge/license-BSD%202--Clause-orange.svg)](https://github.com/sisimai/rb-Sisimai/blob/master/LICENSE)
4
- [![Coverage Status](https://img.shields.io/coveralls/sisimai/rb-Sisimai.svg)](https://coveralls.io/r/sisimai/rb-Sisimai)
5
- [![Build Status](https://travis-ci.org/sisimai/rb-Sisimai.svg?branch=master)](https://travis-ci.org/sisimai/rb-Sisimai)
6
- [![Codacy Badge](https://api.codacy.com/project/badge/grade/38340177e6284a65be69c0c7c3dc2b58)](https://www.codacy.com/app/azumakuniyuki/rb-Sisimai)
3
+ [![License](https://img.shields.io/badge/license-BSD%202--Clause-orange.svg)](https://github.com/sisimai/rb-sisimai/blob/master/LICENSE)
4
+ [![Coverage Status](https://img.shields.io/coveralls/sisimai/rb-sisimai.svg)](https://coveralls.io/r/sisimai/rb-sisimai)
5
+ [![Build Status](https://travis-ci.org/sisimai/rb-sisimai.svg?branch=master)](https://travis-ci.org/sisimai/rb-sisimai)
6
+ [![Codacy Badge](https://api.codacy.com/project/badge/grade/38340177e6284a65be69c0c7c3dc2b58)](https://www.codacy.com/app/azumakuniyuki/rb-sisimai)
7
7
  [![Ruby](https://img.shields.io/badge/ruby-v2.1.0--v2.6.0-red.svg)](https://www.ruby-lang.org/)
8
8
  [![Gem Version](https://badge.fury.io/rb/sisimai.svg)](https://badge.fury.io/rb/sisimai)
9
9
 
@@ -39,7 +39,7 @@ What is Sisimai
39
39
  ===============================================================================
40
40
  Sisimai(シシマイ)はRFC5322準拠のエラーメールを解析し、解析結果をデータ構造に
41
41
  変換するインターフェイスを提供するRubyライブラリです。
42
- [github.com/sisimai/p5-Sisimai](https://github.com/sisimai/p5-Sisimai/)
42
+ [github.com/sisimai/p5-sisimai](https://github.com/sisimai/p5-sisimai/)
43
43
  で公開しているPerl版シシマイから移植しました。
44
44
 
45
45
  ![](https://libsisimai.org/static/images/figure/sisimai-overview-1.png)
@@ -89,8 +89,8 @@ Done installing documentation for sisimai after 6 seconds
89
89
 
90
90
  ```shell
91
91
  $ cd /usr/local/src
92
- $ git clone https://github.com/sisimai/rb-Sisimai.git
93
- $ cd ./rb-Sisimai
92
+ $ git clone https://github.com/sisimai/rb-sisimai.git
93
+ $ cd ./rb-sisimai
94
94
  $ sudo make depend install-from-local
95
95
  gem install bundle rake rspec coveralls
96
96
  ...
@@ -208,7 +208,7 @@ Sisimai Specification
208
208
 
209
209
  Differences between Ruby version and Perl version
210
210
  -------------------------------------------------------------------------------
211
- 公開中のPerl版Sisimai(p5-Sisimai)とRuby版Sisimai(rb-Sisimai)は下記のような違いが
211
+ 公開中のPerl版Sisimai(p5-sisimai)とRuby版Sisimai(rb-sisimai)は下記のような違いが
212
212
  あります。bounceHammer 2.7.13p3とSisimai(シシマイ)の違いについては
213
213
  [Sisimai | 違いの一覧](https://libsisimai.org/ja/diff/)をご覧ください。
214
214
 
@@ -225,7 +225,7 @@ Differences between Ruby version and Perl version
225
225
  | ライセンス | 二条項BSD | 二条項BSD |
226
226
  | 開発会社によるサポート契約 | 提供中 | 提供中 |
227
227
 
228
- 1. [./ANALYTICAL-PRECISION](https://github.com/sisimai/rb-Sisimai/blob/master/ANALYTICAL-PRECISION)を参照
228
+ 1. [./ANALYTICAL-PRECISION](https://github.com/sisimai/rb-sisimai/blob/master/ANALYTICAL-PRECISION)を参照
229
229
  2. Xeon E5-2640 2.5GHz x 2 cores | 5000 bogomips | 1GB RAM | Ruby 2.3.4p301
230
230
 
231
231
  Other spec of Sisimai
@@ -239,7 +239,7 @@ Contributing
239
239
 
240
240
  Bug report
241
241
  -------------------------------------------------------------------------------
242
- もしもSisimaiにバグを発見した場合は[Issues](https://github.com/sisimai/rb-Sisimai/issues)
242
+ もしもSisimaiにバグを発見した場合は[Issues](https://github.com/sisimai/rb-sisimai/issues)
243
243
  にて連絡をいただけると助かります。
244
244
 
245
245
  Emails could not be parsed
@@ -256,14 +256,14 @@ Related sites
256
256
  * __libSISIMAI.ORG__ | [Sisimai | The successor to bounceHammer, Library to parse bounce mails](https://libsisimai.org/)
257
257
  * __Sisimai Blog__ | [blog.libsisimai.org](http://blog.libsisimai.org/)
258
258
  * __Facebook Page__ | [facebook.com/libsisimai](https://www.facebook.com/libsisimai/)
259
- * __GitHub__ | [github.com/sisimai/rb-Sisimai](https://github.com/sisimai/rb-Sisimai)
259
+ * __GitHub__ | [github.com/sisimai/rb-sisimai](https://github.com/sisimai/rb-sisimai)
260
260
  * __RubyGems.org__ | [rubygems.org/gems/sisimai](https://rubygems.org/gems/sisimai)
261
- * __Perl verson__ | [Perl version of Sisimai](https://github.com/sisimai/p5-Sisimai)
261
+ * __Perl verson__ | [Perl version of Sisimai](https://github.com/sisimai/p5-sisimai)
262
262
  * __Fixtures__ | [set-of-emails - Sample emails for "make test"](https://github.com/sisimai/set-of-emails)
263
263
 
264
264
  See also
265
265
  -------------------------------------------------------------------------------
266
- * [README.md - README.md in English](https://github.com/sisimai/rb-Sisimai/blob/master/README.md)
266
+ * [README.md - README.md in English](https://github.com/sisimai/rb-sisimai/blob/master/README.md)
267
267
  * [RFC3463 - Enhanced Mail System Status Codes](https://tools.ietf.org/html/rfc3463)
268
268
  * [RFC3464 - An Extensible Message Format for Delivery Status Notifications](https://tools.ietf.org/html/rfc3464)
269
269
  * [RFC3834 - Recommendations for Automatic Responses to Electronic Mail](https://tools.ietf.org/html/rfc3834)
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  ![](https://libsisimai.org/static/images/logo/sisimai-x01.png)
2
2
 
3
- [![License](https://img.shields.io/badge/license-BSD%202--Clause-orange.svg)](https://github.com/sisimai/rb-Sisimai/blob/master/LICENSE)
4
- [![Coverage Status](https://img.shields.io/coveralls/sisimai/rb-Sisimai.svg)](https://coveralls.io/r/sisimai/rb-Sisimai)
5
- [![Build Status](https://travis-ci.org/sisimai/rb-Sisimai.svg?branch=master)](https://travis-ci.org/sisimai/rb-Sisimai)
6
- [![Codacy Badge](https://api.codacy.com/project/badge/grade/38340177e6284a65be69c0c7c3dc2b58)](https://www.codacy.com/app/azumakuniyuki/rb-Sisimai)
3
+ [![License](https://img.shields.io/badge/license-BSD%202--Clause-orange.svg)](https://github.com/sisimai/rb-sisimai/blob/master/LICENSE)
4
+ [![Coverage Status](https://img.shields.io/coveralls/sisimai/rb-sisimai.svg)](https://coveralls.io/r/sisimai/rb-sisimai)
5
+ [![Build Status](https://travis-ci.org/sisimai/rb-sisimai.svg?branch=master)](https://travis-ci.org/sisimai/rb-sisimai)
6
+ [![Codacy Badge](https://api.codacy.com/project/badge/grade/38340177e6284a65be69c0c7c3dc2b58)](https://www.codacy.com/app/azumakuniyuki/rb-sisimai)
7
7
  [![Ruby](https://img.shields.io/badge/ruby-v2.1.0--v2.6.0-red.svg)](https://www.ruby-lang.org/)
8
8
  [![Gem Version](https://badge.fury.io/rb/sisimai.svg)](https://badge.fury.io/rb/sisimai)
9
9
 
@@ -39,7 +39,7 @@ What is Sisimai
39
39
  ===============================================================================
40
40
  Sisimai is a Ruby library for analyzing RFC5322 bounce emails and generating
41
41
  structured data from parsed results. The Ruby version of Sisimai is ported from
42
- the Perl version of Sisimai at [github.com/sisimai/p5-Sisimai](https://github.com/sisimai/p5-Sisimai/).
42
+ the Perl version of Sisimai at [github.com/sisimai/p5-sisimai](https://github.com/sisimai/p5-sisimai/).
43
43
 
44
44
  ![](https://libsisimai.org/static/images/figure/sisimai-overview-1.png)
45
45
 
@@ -59,7 +59,7 @@ Key Features
59
59
  Command line demo
60
60
  -------------------------------------------------------------------------------
61
61
  The following screen shows a demonstration of Sisimai at the command line using
62
- Ruby(rb-Sisimai) and Perl(p5-Sisimai) version of Sisimai.
62
+ Ruby(rb-sisimai) and Perl(p5-sisimai) version of Sisimai.
63
63
  ![](https://libsisimai.org/static/images/demo/sisimai-dump-01.gif)
64
64
 
65
65
  Setting Up Sisimai
@@ -94,8 +94,8 @@ Done installing documentation for sisimai after 6 seconds
94
94
 
95
95
  ```shell
96
96
  $ cd /usr/local/src
97
- $ git clone https://github.com/sisimai/rb-Sisimai.git
98
- $ cd ./rb-Sisimai
97
+ $ git clone https://github.com/sisimai/rb-sisimai.git
98
+ $ cd ./rb-sisimai
99
99
  $ sudo make depend install-from-local
100
100
  gem install bundle rake rspec coveralls
101
101
  ...
@@ -230,7 +230,7 @@ and bounceHammer are available at
230
230
  | License | BSD 2-Clause | BSD 2-Clause |
231
231
  | Support Contract provided by Developer | Available | Available |
232
232
 
233
- 1. See [./ANALYTICAL-PRECISION](https://github.com/sisimai/rb-Sisimai/blob/master/ANALYTICAL-PRECISION)
233
+ 1. See [./ANALYTICAL-PRECISION](https://github.com/sisimai/rb-sisimai/blob/master/ANALYTICAL-PRECISION)
234
234
  2. Xeon E5-2640 2.5GHz x 2 cores | 5000 bogomips | 1GB RAM | Ruby 2.3.4p301
235
235
 
236
236
  Other specification of Sisimai
@@ -244,7 +244,7 @@ Contributing
244
244
 
245
245
  Bug report
246
246
  -------------------------------------------------------------------------------
247
- Please use the [issue tracker](https://github.com/sisimai/rb-Sisimai/issues)
247
+ Please use the [issue tracker](https://github.com/sisimai/rb-sisimai/issues)
248
248
  to report any bugs.
249
249
 
250
250
  Emails could not be parsed
@@ -263,14 +263,14 @@ Related Sites
263
263
  * __libSISIMAI.ORG__ | [Sisimai | The successor to bounceHammer, Library to parse bounce mails](https://libsisimai.org/)
264
264
  * __Sisimai Blog__ | [blog.libsisimai.org](http://blog.libsisimai.org/)
265
265
  * __Facebook Page__ | [facebook.com/libsisimai](https://www.facebook.com/libsisimai/)
266
- * __GitHub__ | [github.com/sisimai/rb-Sisimai](https://github.com/sisimai/rb-Sisimai)
266
+ * __GitHub__ | [github.com/sisimai/rb-sisimai](https://github.com/sisimai/rb-sisimai)
267
267
  * __RubyGems.org__ | [rubygems.org/gems/sisimai](https://rubygems.org/gems/sisimai)
268
- * __Perl verson__ | [Perl version of Sisimai](https://github.com/sisimai/p5-Sisimai)
268
+ * __Perl verson__ | [Perl version of Sisimai](https://github.com/sisimai/p5-sisimai)
269
269
  * __Fixtures__ | [set-of-emails - Sample emails for "make test"](https://github.com/sisimai/set-of-emails)
270
270
 
271
271
  See also
272
272
  -------------------------------------------------------------------------------
273
- * [README-JA.md - README.md in Japanese(日本語)](https://github.com/sisimai/rb-Sisimai/blob/master/README-JA.md)
273
+ * [README-JA.md - README.md in Japanese(日本語)](https://github.com/sisimai/rb-sisimai/blob/master/README-JA.md)
274
274
  * [RFC3463 - Enhanced Mail System Status Codes](https://tools.ietf.org/html/rfc3463)
275
275
  * [RFC3464 - An Extensible Message Format for Delivery Status Notifications](https://tools.ietf.org/html/rfc3464)
276
276
  * [RFC3834 - Recommendations for Automatic Responses to Electronic Mail](https://tools.ietf.org/html/rfc3834)
@@ -1,4 +1,4 @@
1
- # rb-Sisimai/Repository.mk
1
+ # rb-sisimai/Repository.mk
2
2
  # ____ _ _ _
3
3
  # | _ \ ___ _ __ ___ ___(_) |_ ___ _ __ _ _ _ __ ___ | | __
4
4
  # | |_) / _ \ '_ \ / _ \/ __| | __/ _ \| '__| | | | | '_ ` _ \| |/ /
@@ -41,7 +41,6 @@ module Sisimai
41
41
 
42
42
  RetryIndex = Sisimai::Reason.retry
43
43
  RFC822Head = Sisimai::RFC5322.HEADERFIELDS(:all)
44
- AddrHeader = { addresser: RFC822Head[:addresser], recipient: RFC822Head[:recipient] }.freeze
45
44
 
46
45
  # Constructor of Sisimai::Data
47
46
  # @param [Hash] argvs Data
@@ -96,35 +95,12 @@ module Sisimai
96
95
 
97
96
  messageobj = data
98
97
  rfc822data = messageobj.rfc822
99
- fieldorder = { :recipient => [], :addresser => [] }
100
98
  objectlist = []
101
- givenorder = argvs[:order] || {}
102
99
  delivered1 = argvs[:delivered] || false
103
100
 
104
101
  return nil unless messageobj.ds
105
102
  return nil unless messageobj.rfc822
106
103
 
107
- # Decide the order of email headers: user specified or system default.
108
- if givenorder.is_a?(Hash) && !givenorder.empty?
109
- # If the order of headers for searching is specified, use the order
110
- # for detecting an email address.
111
- fieldorder.each_key do |e|
112
- # The order should be "Array Reference".
113
- next unless givenorder[e]
114
- next unless givenorder[e].is_a? Array
115
- next if givenorder[e].empty?
116
- fieldorder[e] += givenorder[e]
117
- end
118
- end
119
-
120
- fieldorder.each_key do |e|
121
- # If the order is empty, use default order.
122
- next unless fieldorder[e].empty?
123
-
124
- # Load default order of each accessor.
125
- fieldorder[e] = AddrHeader[e]
126
- end
127
-
128
104
  eachobject = messageobj.ds.dup
129
105
  while e = eachobject.shift do
130
106
  # Create parameters for new() constructor.
@@ -152,7 +128,7 @@ module Sisimai
152
128
 
153
129
  # EMAIL_ADDRESS:
154
130
  # Detect email address from message/rfc822 part
155
- fieldorder[:addresser].each do |f|
131
+ RFC822Head[:addresser].each do |f|
156
132
  # Check each header in message/rfc822 part
157
133
  next unless rfc822data[f]
158
134
  next if rfc822data[f].empty?
@@ -313,10 +289,13 @@ module Sisimai
313
289
 
314
290
  if o.reason.empty? || RetryIndex[o.reason]
315
291
  # Decide the reason of email bounce
316
- r = ''
317
- r = Sisimai::Rhost.get(o) if Sisimai::Rhost.match(o.rhost) # Remote host dependent error
318
- r = Sisimai::Reason.get(o) if r.empty?
319
- r = 'undefined' if r.empty?
292
+ r = ''; r = Sisimai::Rhost.get(o) if Sisimai::Rhost.match(o.rhost)
293
+ if r.empty?
294
+ # Failed to detect a bounce reason by the value of "rhost"
295
+ r = Sisimai::Rhost.get(o, o.destination) if Sisimai::Rhost.match(o.destination)
296
+ r = Sisimai::Reason.get(o) if r.empty?
297
+ r = 'undefined' if r.empty?
298
+ end
320
299
  o.reason = r
321
300
  end
322
301
 
@@ -59,14 +59,12 @@ module Sisimai::Lhost
59
59
  dscontents = [Sisimai::Lhost.DELIVERYSTATUS]
60
60
  emailsteak = Sisimai::RFC5322.fillet(mbody, ReBackbone)
61
61
  bodyslices = emailsteak[0].split("\n")
62
- readcursor = 0 # (Integer) Points the current cursor position
63
62
  recipients = 0 # (Integer) The number of 'Final-Recipient' header
64
63
  v = nil
65
64
 
66
65
  while e = bodyslices.shift do
67
66
  # Read error messages and delivery status lines from the head of the email
68
67
  # to the previous line of the beginning of the original message.
69
- next if (readcursor & Indicators[:deliverystatus]) == 0
70
68
  next if e.empty?
71
69
 
72
70
  # Duplicated Message-ID in <2ndml@example.com>.
@@ -39,13 +39,17 @@ module Sisimai::Lhost
39
39
  require 'sisimai/rfc1894'
40
40
  fieldtable = Sisimai::RFC1894.FIELDTABLE
41
41
  dscontents = [Sisimai::Lhost.DELIVERYSTATUS]
42
- emailsteak = Sisimai::RFC5322.fillet(mbody, ReBackbone)
43
- bodyslices = emailsteak[0].split("\n")
44
42
  readslices = ['']
45
43
  readcursor = 0 # (Integer) Points the current cursor position
46
44
  recipients = 0 # (Integer) The number of 'Final-Recipient' header
47
45
  v = nil
48
46
 
47
+ # Pick the second message/rfc822 part because the format of email-x5-*.eml is nested structure
48
+ prefillets = mbody.split(ReBackbone, 2)
49
+ prefillets[1].sub!(/\A.+?\n\n/s, '')
50
+ emailsteak = Sisimai::RFC5322.fillet(prefillets[1], ReBackbone)
51
+ bodyslices = emailsteak[0].split("\n")
52
+
49
53
  while e = bodyslices.shift do
50
54
  # Read error messages and delivery status lines from the head of the email
51
55
  # to the previous line of the beginning of the original message.
@@ -56,7 +60,7 @@ module Sisimai::Lhost
56
60
  readcursor |= Indicators[:deliverystatus] if e.start_with?(StartingOf[:message][0])
57
61
  next
58
62
  end
59
- next if (readcursor & Indicators['deliverystatus']) == 0
63
+ next if (readcursor & Indicators[:deliverystatus]) == 0
60
64
  next if e.empty?
61
65
 
62
66
  v = dscontents[-1]
@@ -32,102 +32,71 @@ module Sisimai
32
32
  # value of the arguments are missing
33
33
  def initialize(data: '', **argvs)
34
34
  return nil if data.empty?
35
+ param = {}
35
36
  email = data.scrub('?').gsub("\r\n", "\n")
37
+ thing = { 'from' => '','header' => {}, 'rfc822' => '', ds => [], 'catch' => nil }
36
38
 
37
- methodargv = { 'data' => email, 'hook' => argvs[:hook] || nil }
39
+ #methodargv = { 'data' => email, 'hook' => argvs[:hook] || nil }
40
+ # 1. Load specified MTA modules
38
41
  [:load, :order].each do |e|
39
42
  # Order of MTA modules
40
43
  next unless argvs[e]
41
44
  next unless argvs[e].is_a? Array
42
45
  next if argvs[e].empty?
43
- methodargv[e.to_s] = argvs[e]
46
+ param[e.to_s] = argvs[e]
44
47
  end
48
+ tobeloaded = Sisimai::Message.load(param)
45
49
 
46
- datasource = Sisimai::Message.make(methodargv)
47
- return nil unless datasource
48
- return nil unless datasource['ds']
49
-
50
- @from = datasource['from']
51
- @header = datasource['header']
52
- @ds = datasource['ds']
53
- @rfc822 = datasource['rfc822']
54
- @catch = datasource['catch'] || nil
55
- end
56
-
57
- # Check whether the object has valid content or not
58
- # @return [True,False] returns true if the object is void
59
- def void
60
- return true unless @ds
61
- return false
62
- end
63
-
64
- # Make data structure from the email message(a body part and headers)
65
- # @param [Hash] argvs Email data
66
- # @options argvs [String] data Entire email message
67
- # @options argvs [Array] load User defined MTA module list
68
- # @options argvs [Array] order The order of MTA modules
69
- # @options argvs [Code] hook Reference to callback method
70
- # @return [Hash] Resolved data structure
71
- def self.make(argvs)
72
- email = argvs['data']
73
-
74
- hookmethod = argvs['hook'] || nil
75
- processing = {
76
- 'from' => '', # From_ line
77
- 'header' => {}, # Email header
78
- 'rfc822' => '', # Original message part
79
- 'ds' => [], # Parsed data, Delivery Status
80
- 'catch' => nil, # Data parsed by callback method
81
- }
82
- methodargv = {
83
- 'load' => argvs['load'] || [],
84
- 'order' => argvs['order'] || []
85
- }
86
- tobeloaded = Sisimai::Message.load(methodargv)
87
-
88
- # 1. Split email data to headers and a body part.
50
+ # 2. Split email data to headers and a body part.
89
51
  return nil unless aftersplit = Sisimai::Message.divideup(email)
90
52
 
91
- # 2. Convert email headers from text to hash reference
92
- processing['from'] = aftersplit['from']
93
- processing['header'] = Sisimai::Message.makemap(aftersplit['header'])
53
+ # 3. Convert email headers from text to hash reference
54
+ thing['from'] = aftersplit[0]
55
+ thing['header'] = Sisimai::Message.makemap(aftersplit[1])
94
56
 
95
- # 3. Decode and rewrite the "Subject:" header
96
- unless processing['header']['subject'].empty?
57
+ # 4. Decode and rewrite the "Subject:" header
58
+ unless thing['header']['subject'].empty?
97
59
  # Decode MIME-Encoded "Subject:" header
98
- s = processing['header']['subject']
60
+ s = thing['header']['subject']
99
61
  q = Sisimai::MIME.is_mimeencoded(s) ? Sisimai::MIME.mimedecode(s.split(/[ ]/)) : s
100
62
 
101
63
  # Remove "Fwd:" string from the Subject: header
102
64
  if cv = q.downcase.match(/\A[ \t]*fwd?:[ ]*(.*)\z/)
103
65
  # Delete quoted strings, quote symbols(>)
104
66
  q = cv[1]
105
- aftersplit['body'] = aftersplit['body'].gsub(/^[>]+[ ]/, '').gsub(/^[>]$/, '')
67
+ aftersplit[2] = aftersplit[2].gsub(/^[>]+[ ]/, '').gsub(/^[>]$/, '')
106
68
  end
107
- processing['header']['subject'] = q
69
+ thing['header']['subject'] = q
108
70
  end
109
71
 
110
- # 4. Rewrite message body for detecting the bounce reason
111
- tryonfirst = Sisimai::Order.make(processing['header']['subject'])
112
- methodargv = {
113
- 'hook' => hookmethod,
114
- 'mail' => processing,
115
- 'body' => aftersplit['body'],
116
- 'tryonfirst' => tryonfirst,
72
+ # 5. Rewrite message body for detecting the bounce reason
73
+ param = {
74
+ 'hook' => argvs[:hook] || nil,
75
+ 'mail' => thing,
76
+ 'body' => aftersplit[2],
117
77
  'tobeloaded' => tobeloaded,
78
+ 'tryonfirst' => Sisimai::Order.make(thing['header']['subject'])
118
79
  }
119
- return nil unless bouncedata = Sisimai::Message.parse(methodargv)
80
+ return nil unless bouncedata = Sisimai::Message.parse(param)
120
81
  return nil if bouncedata.empty?
121
82
 
122
- # 5. Rewrite headers of the original message in the body part
123
- %w|ds catch rfc822|.each { |e| processing[e] = bouncedata[e] }
83
+ # 6. Rewrite headers of the original message in the body part
84
+ %w|ds catch rfc822|.each { |e| thing[e] = bouncedata[e] }
124
85
  p = bouncedata['rfc822']
125
- p = aftersplit['body'] if p.empty?
126
- processing['rfc822'] = p.is_a?(::String) ? Sisimai::Message.makemap(p, true) : p
127
-
128
- return processing
86
+ p = aftersplit[2] if p.empty?
87
+ thing['rfc822'] = p.is_a?(::String) ? Sisimai::Message.makemap(p, true) : p
88
+
89
+ @from = thing['from']
90
+ @header = thing['header']
91
+ @ds = thing['ds']
92
+ @rfc822 = thing['rfc822']
93
+ @catch = thing['catch'] || nil
129
94
  end
130
95
 
96
+ # Check whether the object has valid content or not
97
+ # @return [True,False] returns true if the object is void
98
+ def void; return @ds ? false : true; end
99
+
131
100
  # Load MTA modules which specified at 'order' and 'load' in the argument
132
101
  # @param [Hash] argvs Module information to be loaded
133
102
  # @options argvs [Array] load User defined MTA module list
@@ -171,28 +140,28 @@ module Sisimai
171
140
 
172
141
  # Divide email data up headers and a body part.
173
142
  # @param [String] email Email data
174
- # @return [Hash] Email data after split
143
+ # @return [Array] Email data after split
175
144
  def self.divideup(email)
176
145
  return nil if email.empty?
177
146
 
178
- block = { 'from' => '', 'header' => '', 'body' => '' }
147
+ block = ['', '', ''] # 0:From, 1:Header, 2:Body
179
148
  email.gsub!(/\r\n/, "\n") if email.include?("\r\n")
180
149
  email.gsub!(/[ \t]+$/, '') if email =~ /[ \t]+$/
181
150
 
182
- (block['header'], block['body']) = email.split(/\n\n/, 2)
183
- return nil unless block['header']
184
- return nil unless block['body']
151
+ (block[1], block[2]) = email.split(/\n\n/, 2)
152
+ return nil unless block[1]
153
+ return nil unless block[2]
185
154
 
186
- if block['header'].start_with?('From ')
155
+ if block[1].start_with?('From ')
187
156
  # From MAILER-DAEMON Tue Feb 11 00:00:00 2014
188
- block['from'] = block['header'].split(/\n/, 2)[0].delete("\r")
157
+ block[0] = block[1].split(/\n/, 2)[0].delete("\r")
189
158
  else
190
159
  # Set pseudo UNIX From line
191
- block['from'] = 'MAILER-DAEMON Tue Feb 11 00:00:00 2014'
160
+ block[0] = 'MAILER-DAEMON Tue Feb 11 00:00:00 2014'
192
161
  end
193
162
 
194
- block['header'] << "\n" unless block['header'].end_with?("\n")
195
- block['body'] << "\n"
163
+ block[1] << "\n" unless block[1].end_with?("\n")
164
+ block[2] << "\n"
196
165
  return block
197
166
  end
198
167
 
@@ -307,12 +276,7 @@ module Sisimai
307
276
  if hookmethod.is_a? Proc
308
277
  # Call the hook method
309
278
  begin
310
- p = {
311
- 'datasrc' => 'email',
312
- 'headers' => mailheader,
313
- 'message' => bodystring,
314
- 'bounces' => nil
315
- }
279
+ p = { 'headers' => mailheader, 'message' => bodystring }
316
280
  havecaught = hookmethod.call(p)
317
281
  rescue StandardError => ce
318
282
  warn ' ***warning: Something is wrong in hook method :' << ce.to_s
@@ -98,12 +98,9 @@ module Sisimai
98
98
  # @return [Hash] Bounce data list and message/rfc822 part
99
99
  # @return [Nil] it failed to parse or the arguments are missing
100
100
  def make(mhead, mbody)
101
- require 'sisimai/mda'
102
-
103
101
  dscontents = [Sisimai::Lhost.DELIVERYSTATUS]
104
102
  bodyslices = mbody.scrub('?').split("\n")
105
103
  readslices = ['']
106
- mdabounced = Sisimai::MDA.make(mhead, mbody)
107
104
  rfc822text = '' # (String) message/rfc822 part text
108
105
  maybealias = nil # (String) Original-Recipient Field
109
106
  blanklines = 0 # (Integer) The number of blank lines
@@ -287,7 +284,7 @@ module Sisimai
287
284
  elsif readslices[-2].start_with?('Diagnostic-Code:') && cv = e.match(/\A[ \t]+(.+)\z/)
288
285
  # Continued line of the value of Diagnostic-Code header
289
286
  v['diagnosis'] << ' ' << cv[1]
290
- e = 'Diagnostic-Code: ' << e
287
+ readslices[-1] = 'Diagnostic-Code: ' << e
291
288
  else
292
289
  if cv = e.match(/\AReporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
293
290
  # 2.2.2 The Reporting-MTA DSN field
@@ -421,6 +418,8 @@ module Sisimai
421
418
  end
422
419
  return nil unless recipients > 0
423
420
 
421
+ require 'sisimai/mda'
422
+ mdabounced = Sisimai::MDA.make(mhead, mbody)
424
423
  dscontents.each do |e|
425
424
  # Set default values if each value is empty.
426
425
  connheader.each_key { |a| e[a] ||= connheader[a] || '' }
@@ -19,15 +19,11 @@ module Sisimai
19
19
  '.email.ua' => 'IUA',
20
20
  'lsean.ezweb.ne.jp' => 'KDDI',
21
21
  'msmx.au.com' => 'KDDI',
22
+ 'charter.net' => 'Spectrum',
23
+ 'cox.net' => 'Cox',
22
24
  '.qq.com' => 'TencentQQ',
23
25
  }.freeze
24
26
 
25
- # Retrun the list of remote hosts Sisimai support
26
- # @return [Array] Remote host list
27
- def list
28
- return RhostClass.keys
29
- end
30
-
31
27
  # The value of "rhost" is listed in RhostClass or not
32
28
  # @param [String] argvs Remote host name
33
29
  # @return [True,False] True: matched
@@ -49,9 +45,10 @@ module Sisimai
49
45
 
50
46
  # Detect the bounce reason from certain remote hosts
51
47
  # @param [Sisimai::Data] argvs Parsed email object
48
+ # @param [String] proxy The alternative of the "rhost"
52
49
  # @return [String] The value of bounce reason
53
- def get(argvs)
54
- remotehost = argvs.rhost.downcase
50
+ def get(argvs, proxy = nil)
51
+ remotehost = proxy || argvs.rhost.downcase
55
52
  rhostclass = ''
56
53
  modulename = ''
57
54
 
@@ -0,0 +1,112 @@
1
+ module Sisimai
2
+ module Rhost
3
+ # Sisimai::Rhost detects the bounce reason from the content of Sisimai::Data
4
+ # object as an argument of get() method when the value of "destination" of
5
+ # the object is "charter.net". This class is called only Sisimai::Data class.
6
+ module Cox
7
+ class << self
8
+ # Imported from p5-Sisimail/lib/Sisimai/Rhost/Cox.pm
9
+ ErrorCodes = {
10
+ # https://www.cox.com/residential/support/email-error-codes.html
11
+ 'CXBL' => 'blocked', # The sending IP address has been blocked by Cox due to exhibiting spam-like behavior.
12
+ 'CXTHRT' => 'securityerror', # Email sending limited due to suspicious account activity.
13
+ 'CXMJ' => 'securityerror', # Email sending blocked due to suspicious account activity on primary Cox account.
14
+ 'CXDNS' => 'blocked', # There was an issue with the connecting IP address Domain Name System (DNS).
15
+ 'CXSNDR' => 'rejected', # There was a problem with the sender's domain.
16
+ 'CXSMTP' => 'rejected', # Your email wasn't delivered because Cox was unable to verify that it came from a legitimate email sender.
17
+ 'CXCNCT' => 'toomanyconn', # There is a limit to the number of concurrent SMTP connections per IP address
18
+ 'CXMXRT' => 'toomanyconn', # The email sender has exceeded the maximum number of sent email allowed.
19
+ 'CDRBL' => 'blocked', # The sending IP address has been temporarily blocked by Cox due to exhibiting spam-like behavior.
20
+ 'IPBL0001' => 'blocked', # The sending IP address is listed in the Spamhaus Zen DNSBL.
21
+ 'IPBL0010' => 'blocked', # The sending IP is listed in the Return Path DNSBL.
22
+ 'IPBL0100' => 'blocked', # The sending IP is listed in the Invaluement ivmSIP DNSBL.
23
+ 'IPBL0011' => 'blocked', # The sending IP is in the Spamhaus Zen and Return Path DNSBLs.
24
+ 'IPBL0101' => 'blocked', # The sending IP is in the Spamhaus Zen and Invaluement ivmSIP DNSBLs.
25
+ 'IPBL0110' => 'blocked', # The sending IP is in the Return Path and Invaluement ivmSIP DNSBLs.
26
+ 'IPBL0111' => 'blocked', # The sending IP is in the Spamhaus Zen, Return Path and Invaluement ivmSIP DNSBLs.
27
+ 'IPBL1000' => 'blocked', # The sending IP address is listed on a CSI blacklist. You can check your status on the CSI website.
28
+ 'IPBL1001' => 'blocked', # The sending IP is listed in the Cloudmark CSI and Spamhaus Zen DNSBLs.
29
+ 'IPBL1010' => 'blocked', # The sending IP is listed in the Cloudmark CSI and Return Path DNSBLs.
30
+ 'IPBL1011' => 'blocked', # The sending IP is in the Cloudmark CSI, Spamhaus Zen and Return Path DNSBLs.
31
+ 'IPBL1100' => 'blocked', # The sending IP is listed in the Cloudmark CSI and Invaluement ivmSIP DNSBLs.
32
+ 'IPBL1101' => 'blocked', # The sending IP is in the Cloudmark CSI, Spamhaus Zen and Invaluement IVMsip DNSBLs.
33
+ 'IPBL1110' => 'blocked', # The sending IP is in the Cloudmark CSI, Return Path and Invaluement ivmSIP DNSBLs.
34
+ 'IPBL1111' => 'blocked', # The sending IP is in the Cloudmark CSI, Spamhaus Zen, Return Path and Invaluement ivmSIP DNSBLs.
35
+ 'IPBL00001' => 'blocked', # The sending IP address is listed on a Spamhaus blacklist. Check your status at Spamhaus.
36
+ 'URLBL011' => 'spamdetected', # A URL within the body of the message was found on blocklists SURBL and Spamhaus DBL.
37
+ 'URLBL101' => 'spamdetected', # A URL within the body of the message was found on blocklists SURBL and ivmURI.
38
+ 'URLBL110' => 'spamdetected', # A URL within the body of the message was found on blocklists Spamhaus DBL and ivmURI.
39
+ 'URLBL1001' => 'spamdetected', # The URL is listed on a Spamhaus blacklist. Check your status at Spamhaus.
40
+ }.freeze
41
+ MessagesOf = {
42
+ 'blocked' => [
43
+ # Cox requires that all connecting email servers contain valid reverse DNS PTR records.
44
+ 'rejected - no rDNS',
45
+ # An email client has repeatedly sent bad commands or invalid passwords resulting in a three-hour block of the client's IP address.
46
+ 'cox too many bad commands from',
47
+ # The reverse DNS check of the sending server IP address has failed.
48
+ 'DNS check failure - try again later',
49
+ # The sending IP address has exceeded the threshold of invalid recipients and has been blocked.
50
+ 'Too many invalid recipients',
51
+ ],
52
+ 'notaccept' => [
53
+ # Our systems are experiencing an issue which is causing a temporary inability to accept new email.
54
+ 'ESMTP server temporarily not available',
55
+ ],
56
+ 'policyviolation' => [
57
+ # The sending server has attempted to communicate too soon within the SMTP transaction
58
+ 'ESMTP no data before greeting',
59
+ # The message has been rejected because it contains an attachment with one of the following prohibited
60
+ # file types, which commonly contain viruses: .shb, .shs, .vbe, .vbs, .wsc, .wsf, .wsh, .pif, .msc,
61
+ # .msi, .msp, .reg, .sct, .bat, .chm, .isp, .cpl, .js, .jse, .scr, .exe.
62
+ 'attachment extension is forbidden',
63
+ ],
64
+ 'rejected' => [
65
+ # Cox requires that all sender domains resolve to a valid MX or A-record within DNS.
66
+ 'sender rejected',
67
+ ],
68
+ 'toomanyconn' => [
69
+ # The sending IP address has exceeded the five maximum concurrent connection limit.
70
+ 'too many sessions from',
71
+ # The SMTP connection has exceeded the 100 email message threshold and was disconnected.
72
+ 'requested action aborted: try again later',
73
+ # The sending IP address has exceeded one of these rate limits and has been temporarily blocked.
74
+ 'Message threshold exceeded',
75
+ ],
76
+ 'userunknown' => [
77
+ 'recipient rejected', # The intended recipient is not a valid Cox Email account.
78
+ ],
79
+ }.freeze
80
+
81
+ # Detect bounce reason from https://cox.com/
82
+ # @param [Sisimai::Data] argvs Parsed email object
83
+ # @return [String, Nil] The bounce reason at Cox
84
+ # @since v4.25.8
85
+ def get(argvs)
86
+ statusmesg = argvs.diagnosticcode
87
+ codenumber = 0
88
+
89
+ if cv = statusmesg.match(/AUP#([0-9A-Z]+)/)
90
+ # Capture the numeric part of the error code
91
+ codenumber = cv[1]
92
+ end
93
+ reasontext = ErrorCodes[codenumber] || ''
94
+
95
+ if reasontext.empty?
96
+ # The error code was not found in ErrorCodes
97
+ MessagesOf.each_key do |e|
98
+ # Try to find with each error message defined in MessagesOf
99
+ next unless MessagesOf[e].any? { |a| statusmesg.include?(a) }
100
+ reasontext = e
101
+ break
102
+ end
103
+ end
104
+
105
+ return reasontext
106
+ end
107
+
108
+ end
109
+ end
110
+ end
111
+ end
112
+
@@ -0,0 +1,73 @@
1
+ module Sisimai
2
+ module Rhost
3
+ # Sisimai::Rhost detects the bounce reason from the content of Sisimai::Data
4
+ # object as an argument of get() method when the value of "destination" of
5
+ # the object is "charter.net". This class is called only Sisimai::Data class.
6
+ module Spectrum
7
+ class << self
8
+ # Imported from p5-Sisimail/lib/Sisimai/Rhost/Spectrum.pm
9
+ ErrorCodes = {
10
+ # https://www.spectrumbusiness.net/support/internet/understanding-email-error-codes
11
+ # Error codes are placed in one of two categories: incoming or outgoing.
12
+ # 1. If you’re trying to send an email to a Charter email address from
13
+ # a non-Charter email address (such as Gmail, Yahoo, Hotmail, etc.),
14
+ # you may receive an error that begins with AUP#I, followed by four numbers.
15
+ #
16
+ # 2. If you are trying to send an email from a Charter email address
17
+ # to an outgoing recipient, you may get an error code beginning with
18
+ # AUP#O, also followed by four numbers.
19
+ #
20
+ 1000 => 'blocked', # Your IP address has been blocked due to suspicious activity.
21
+ 1010 => 'rejected', # This email account has been blocked from sending emails due to suspicious activity.
22
+ 1090 => 'systemerror', # The email you're trying to send can't be processed. Try sending again at a later time.
23
+ 1260 => 'networkerror', # Spectrum doesn't process IPV6 addresses. Connect with an IPv4 address and try again.
24
+ 1500 => 'rejected', # Your email was rejected for attempting to send as a different email address than you signed in under.
25
+ 1520 => 'rejected', # Your email was rejected for attempting to send as a different email address than a domain that we host.
26
+ 1530 => 'mesgtoobig', # Your email was rejected because it's larger than the maximum size of 20MB.
27
+ 1540 => 'toomanyconn', # Your emails were deferred for attempting to send too many in a single session.
28
+ 1550 => 'toomanyconn', # Your email was rejected for having too many recipients in one message.
29
+ 1560 => 'policyviolation', # Your email was rejected for having too many invalid recipients.
30
+ }.freeze
31
+ CodeRanges = [
32
+ [1020, 1080, 'rejected'], # This email account has limited access to send emails based on suspicious activity.
33
+ [1100, 1150, 'blocked'], # The IP address you're trying to connect from has an issue with the Domain Name System.
34
+ [1160, 1190, 'policyviolation'], # The email you tried to send goes against your domain's security policies.
35
+ [1200, 1210, 'blocked'], # The IP address you're trying to send from has been flagged by Cloudmark CSI as potential spam.
36
+ [1220, 1250, 'blokced'], # Your IP address has been blacklisted by Spamhaus.
37
+ [1300, 1340, 'toomanyconn'], # Spectrum limits the number of concurrent connections from a sender
38
+ [1350, 1490, 'toomanyconn'], # Spectrum limits emails by the number of messages sent, amount of recipients,...
39
+ ].freeze
40
+
41
+ # Detect bounce reason from https://www.spectrum.com/
42
+ # @param [Sisimai::Data] argvs Parsed email object
43
+ # @return [String, Nil] The bounce reason at Spectrum
44
+ # @since v4.25.8
45
+ def get(argvs)
46
+ statusmesg = argvs.diagnosticcode
47
+ codenumber = 0
48
+
49
+ if cv = statusmesg.match(/AUP#[-A-Za-z]*(\d{4})/)
50
+ # Capture the numeric part of the error code
51
+ codenumber = cv[1].to_i
52
+ end
53
+ reasontext = ErrorCodes[codenumber] || ''
54
+
55
+ if reasontext.empty?
56
+ # The error code was not found in ErrorCodes
57
+ CodeRanges.each do |e|
58
+ # Check the code range
59
+ next if codenumber < e[0]
60
+ next if codenumber > e[1]
61
+ reasontext = e[2]
62
+ break
63
+ end
64
+ end
65
+
66
+ return reasontext
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+ end
73
+
@@ -1,4 +1,4 @@
1
1
  # Define the version number of Sisimai
2
2
  module Sisimai
3
- VERSION = '4.25.7'.freeze
3
+ VERSION = '4.25.8'.freeze
4
4
  end
@@ -1,7 +1,7 @@
1
1
  About "set-of-emails" repository
2
2
  ================================================================================
3
3
  This repository hold bounce mail collections for developing Sisimai. Email files
4
- in this repository are read from `make test` at p5-Sisimai and rb-Sisimai.
4
+ in this repository are read from `make test` at p5-sisimai and rb-sisimai.
5
5
 
6
6
 
7
7
  | Directory | Description |
@@ -24,16 +24,17 @@ See Also
24
24
  ================================================================================
25
25
  * __Sisimai Project__ | [github.com/sisimai](https://github.com/sisimai)
26
26
  * __libsisimai.org__ | [Sisimai — A successor to bounceHammer, Library to parse error mails](https://libsisimai.org/)
27
- * __Perl Verson__ | [Perl version of Sisimai(Stable)](https://github.com/sisimai/p5-Sisimai)
28
- * __Ruby verson__ | [Ruby version of Sisimai(Under the development)](https://github.com/sisimai/rb-Sisimai)
27
+ * __Perl Verson__ | [Perl version of Sisimai(Stable)](https://github.com/sisimai/p5-sisimai)
28
+ * __Ruby verson__ | [Ruby version of Sisimai(Under the development)](https://github.com/sisimai/rb-sisimai)
29
29
 
30
30
  Author
31
31
  ===============================================================================
32
+ [@libsisimai](https://twitter.com/libsisimai)
32
33
  [@azumakuniyuki](https://twitter.com/azumakuniyuki)
33
34
 
34
35
  Copyright
35
36
  ===============================================================================
36
- Copyright (C) 2018-2019 azumakuniyuki, All Rights Reserved.
37
+ Copyright (C) 2018-2020 azumakuniyuki, All Rights Reserved.
37
38
 
38
39
  License
39
40
  ===============================================================================
@@ -70,7 +70,7 @@ Received: from [203.0.113.13] (unknown [127.0.0.1])
70
70
  (Authenticated sender: nekonyaan@example.com)
71
71
  by e22r.qin.example.com (Bossmail) with ESMTP id 99999999000
72
72
  for <kijitora@example.org>; Thu, 29 Apr 2017 23:34:45 +0000 (UTC)
73
- Content-Type: text/pkain
73
+ Content-Type: text/plain
74
74
  MIME-Version: 1.0
75
75
  Subject: Nyaan
76
76
  From: "Neko, Nyaan" <nekonyaan@example.com>
@@ -0,0 +1,192 @@
1
+ From MAILER-DAEMON Thu Jul 2 12:05:05 2020
2
+ Received: from mailer76.example.com (mailer76.example.com [111.22.33.44])
3
+ by bouncehandler.example.com (Postfix) with ESMTPS id 7939F4114A
4
+ for <bounce@mailer.cnt1.example.com>; Thu, 2 Jul 2020 12:05:05 -0400 (EDT)
5
+ Received: by tr2.example.com (Postfix)
6
+ id 6F3F839637A1; Thu, 2 Jul 2020 12:05:05 -0400 (EDT)
7
+ Date: Thu, 2 Jul 2020 12:05:05 -0400 (EDT)
8
+ From: MAILER-DAEMON@tr2.example.com (Mail Delivery System)
9
+ Subject: Undelivered Mail Returned to Sender
10
+ To: bounce@mailer.cnt1.example.com
11
+ Auto-Submitted: auto-replied
12
+ MIME-Version: 1.0
13
+ Content-Type: multipart/report; report-type=delivery-status;
14
+ boundary="D9E933966464.1593705905/tr2.example.com"
15
+ Content-Transfer-Encoding: 8bit
16
+ Message-Id: <20200702160505.6F3F839637A1@tr2.example.com>
17
+
18
+ This is a MIME-encapsulated message.
19
+
20
+ --D9E933966464.1593705905/tr2.example.com
21
+ Content-Description: Notification
22
+ Content-Type: text/plain; charset=utf-8
23
+ Content-Transfer-Encoding: 8bit
24
+
25
+ This is the mail system at host tr2.example.com.
26
+
27
+ I'm sorry to have to inform you that your message could not
28
+ be delivered to one or more recipients. It's attached below.
29
+
30
+ For further assistance, please send mail to postmaster.
31
+
32
+ If you do so, please include this problem report. You can
33
+ delete your own text from the attached returned message.
34
+
35
+ The mail system
36
+
37
+ <recipient55@cox.net>: host cxr.mx.a.cloudfilter.net[34.212.80.54] said: 550
38
+ 5.1.0 <bounce@mailer.cnt1.example.com> sender rejected. Refer to Error
39
+ Codes section at
40
+ https://www.cox.com/residential/support/email-error-codes.html for more
41
+ information. AUP#CDRBL (in reply to MAIL FROM command)
42
+
43
+ --D9E933966464.1593705905/tr2.example.com
44
+ Content-Description: Delivery report
45
+ Content-Type: message/delivery-status
46
+
47
+ Reporting-MTA: dns; tr2.example.com
48
+ X-Postfix-Queue-ID: D9E933966464
49
+ X-Postfix-Sender: rfc822; bounce@mailer.cnt1.example.com
50
+ Arrival-Date: Thu, 2 Jul 2020 06:04:42 -0400 (EDT)
51
+
52
+ Final-Recipient: rfc822; recipient55@cox.net
53
+ Original-Recipient: rfc822;recipient55@cox.net
54
+ Action: failed
55
+ Status: 5.1.0
56
+ Remote-MTA: dns; cxr.mx.a.cloudfilter.net
57
+ Diagnostic-Code: smtp; 550 5.1.0 <bounce@mailer.cnt1.example.com> sender
58
+ rejected. Refer to Error Codes section at
59
+ https://www.cox.com/residential/support/email-error-codes.html for more
60
+ information. AUP#CDRBL
61
+
62
+ --D9E933966464.1593705905/tr2.example.com
63
+ Content-Description: Undelivered Message Headers
64
+ Content-Type: text/rfc822-headers
65
+ Content-Transfer-Encoding: 8bit
66
+
67
+ Return-Path: <bounce@mailer.cnt1.example.com>
68
+ Received: from pixel1.example.com (pixel1 [104.207.134.97])
69
+ by tr2.example.com (Postfix) with ESMTPA id D9E933966464
70
+ for <recipient55@cox.net>; Thu, 2 Jul 2020 06:04:42 -0400 (EDT)
71
+ DKIM-Filter: OpenDKIM Filter v2.11.0 tr2.example.com D9E933966464
72
+ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com;
73
+ s=mail; t=1593684282;
74
+ bh=QCJqru6dH/ii/ts4AH9NsNa/v562Fc43deLk8w1KKJ8=;
75
+ h=To:Subject:Date:From:Reply-To:List-Unsubscribe:From;
76
+ b=EXtMRJLuGhK9gq/gZspsdSSTRmLXOTxQstFekcdNQsxLxKEHmOijeZWiDlz8W8FKn
77
+ 95nVfTtlOk8dCFE/4EeLyBWlPoQ0EdpLPUcEcwHbBynoCQHwRI1iUiE4r2+Mc5iX51
78
+ 1eRfb2xphpVwWyJhA2I7qXAeOuJ27J6cdRI7ijlI=
79
+ Received: by pixel1.example.com (Postfix, from userid 501)
80
+ id C3726626BC; Thu, 2 Jul 2020 06:04:42 -0400 (EDT)
81
+ To: "recipient55@cox.net" <recipient55@cox.net>
82
+ Subject: Take down your patio umbrella
83
+ X-PHP-Originating-Script: 501:phpmailer.php
84
+ Date: Thu, 2 Jul 2020 06:04:42 -0400
85
+ From: deas <emma@cnt1.example.com>
86
+ Reply-To: Example <no-reply@example.com>
87
+ Message-ID: <5119e0e9531a692224d1bd44ef560e62@pixel1.example.com>
88
+ X-Priority: 3
89
+ X-Mailer: PHPMailer 5.2.7 (https://github.com/PHPMailer/PHPMailer/)
90
+ X-se: fol_new_t
91
+ X-date: 20200702
92
+ X-version: version_C_ht
93
+ X-SES-CONFIGURATION-SET: ded-content
94
+ X-CONFIGSET: conf-content
95
+ Feedback-ID: 21053362:version_C_ht:newsletter:example
96
+ List-Unsubscribe: https://www.example.com/unsubscribe
97
+ MIME-Version: 1.0
98
+ Content-Type: multipart/alternative;
99
+ boundary="b1_5119e0e9531a692224d1bd44ef560e62"
100
+ Content-Transfer-Encoding: 8bit
101
+
102
+ --D9E933966464.1593705905/tr2.example.com--
103
+ From double-bounce@tr2.example.com Thu Jul 2 12:05:05 2020
104
+ Received: from mailer74.example.com (mailer74.example.com [108.61.68.74])
105
+ by bouncehandler.example.com (Postfix) with ESMTPS id 803294114A
106
+ for <bounce@mailer.example.com>; Thu, 2 Jul 2020 12:05:05 -0400 (EDT)
107
+ Received: by tr2.example.com (Postfix)
108
+ id 75BA239637A5; Thu, 2 Jul 2020 12:05:05 -0400 (EDT)
109
+ Date: Thu, 2 Jul 2020 12:05:05 -0400 (EDT)
110
+ From: MAILER-DAEMON@tr2.example.com (Mail Delivery System)
111
+ Subject: Postmaster Copy: Undelivered Mail
112
+ To: bounce@mailer.example.com
113
+ Auto-Submitted: auto-generated
114
+ MIME-Version: 1.0
115
+ Content-Type: multipart/report; report-type=delivery-status;
116
+ boundary="D9E933966464.1593705905/tr2.example.com"
117
+ Content-Transfer-Encoding: 8bit
118
+ Message-Id: <20200702160505.75BA239637A5@tr2.example.com>
119
+
120
+ This is a MIME-encapsulated message.
121
+
122
+ --D9E933966464.1593705905/tr2.example.com
123
+ Content-Description: Notification
124
+ Content-Type: text/plain; charset=utf-8
125
+ Content-Transfer-Encoding: 8bit
126
+
127
+
128
+ <recipient55@cox.net>: host cxr.mx.a.cloudfilter.net[34.212.80.54] said: 550
129
+ 5.1.0 <bounce@mailer.cnt1.example.com> sender rejected. Refer to Error
130
+ Codes section at
131
+ https://www.cox.com/residential/support/email-error-codes.html for more
132
+ information. AUP#CDRBL (in reply to MAIL FROM command)
133
+
134
+ --D9E933966464.1593705905/tr2.example.com
135
+ Content-Description: Delivery report
136
+ Content-Type: message/delivery-status
137
+
138
+ Reporting-MTA: dns; tr2.example.com
139
+ X-Postfix-Queue-ID: D9E933966464
140
+ X-Postfix-Sender: rfc822; bounce@mailer.cnt1.example.com
141
+ Arrival-Date: Thu, 2 Jul 2020 06:04:42 -0400 (EDT)
142
+
143
+ Final-Recipient: rfc822; recipient55@cox.net
144
+ Original-Recipient: rfc822;recipient55@cox.net
145
+ Action: failed
146
+ Status: 5.1.0
147
+ Remote-MTA: dns; cxr.mx.a.cloudfilter.net
148
+ Diagnostic-Code: smtp; 550 5.1.0 <bounce@mailer.cnt1.example.com> sender
149
+ rejected. Refer to Error Codes section at
150
+ https://www.cox.com/residential/support/email-error-codes.html for more
151
+ information. AUP#CDRBL
152
+
153
+ --D9E933966464.1593705905/tr2.example.com
154
+ Content-Description: Undelivered Message Headers
155
+ Content-Type: text/rfc822-headers
156
+ Content-Transfer-Encoding: 8bit
157
+
158
+ Return-Path: <bounce@mailer.cnt1.example.com>
159
+ Received: from pixel1.example.com (pixel1 [111.22.33.44])
160
+ by tr2.example.com (Postfix) with ESMTPA id D9E933966464
161
+ for <recipient55@cox.net>; Thu, 2 Jul 2020 06:04:42 -0400 (EDT)
162
+ DKIM-Filter: OpenDKIM Filter v2.11.0 tr2.example.com D9E933966464
163
+ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com;
164
+ s=mail; t=1593684282;
165
+ bh=QCJqru6dH/ii/ts4AH9NsNa/v562Fc43deLk8w1KKJ8=;
166
+ h=To:Subject:Date:From:Reply-To:List-Unsubscribe:From;
167
+ b=EXtMRJLuGhK9gq/gZspsdSSTRmLXOTxQstFekcdNQsxLxKEHmOijeZWiDlz8W8FKn
168
+ 95nVfTtlOk8dCFE/4EeLyBWlPoQ0EdpLPUcEcwHbBynoCQHwRI1iUiE4r2+Mc5iX51
169
+ 1eRfb2xphpVwWyJhA2I7qXAeOuJ27J6cdRI7ijlI=
170
+ Received: by pixel1.example.com (Postfix, from userid 501)
171
+ id C3726626BC; Thu, 2 Jul 2020 06:04:42 -0400 (EDT)
172
+ To: "recipient55@cox.net" <recipient55@cox.net>
173
+ Subject: Take down your patio umbrella
174
+ X-PHP-Originating-Script: 501:phpmailer.php
175
+ Date: Thu, 2 Jul 2020 06:04:42 -0400
176
+ From: Ideas <emma.jones@cnt1.example.com>
177
+ Reply-To: Example <no-reply@example.com>
178
+ Message-ID: <5119e0e9531a692224d1bd44ef560e62@pixel1.example.com>
179
+ X-Priority: 3
180
+ X-Mailer: PHPMailer 5.2.7 (https://github.com/PHPMailer/PHPMailer/)
181
+ X-se: fol_new_t
182
+ X-date: 20200702
183
+ X-version: version_C_ht
184
+ X-SES-CONFIGURATION-SET: ded-content
185
+ X-CONFIGSET: conf-content
186
+ List-Unsubscribe: https://www.example.com/unsubscribe
187
+ MIME-Version: 1.0
188
+ Content-Type: multipart/alternative;
189
+ boundary="b1_5119e0e9531a692224d1bd44ef560e62"
190
+ Content-Transfer-Encoding: 8bit
191
+
192
+ --D9E933966464.1593705905/tr2.example.com--
@@ -0,0 +1,111 @@
1
+ From MAILER-DAEMON Thu May 28 19:08:03 2020
2
+ Received: from a14-88.smtp-out.amazonses.com (a14-88.smtp-out.amazonses.com [54.240.14.88])
3
+ by bouncehandler.example.com (Postfix) with ESMTPS id 2FD8D41621
4
+ for <bounce@mailer.mrk1.example.com>; Thu, 28 May 2020 19:08:03 -0400 (EDT)
5
+ DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
6
+ s=224i4yxa5dv7c2xz3womw6peuasteono; d=amazonses.com; t=1590707282;
7
+ h=From:To:Message-ID:Subject:MIME-Version:Content-Type:Date:Feedback-ID;
8
+ bh=X2t+7WVLvOBJJO9EAydrKQu2sTcW6CrAs/a2QN6ed24=;
9
+ b=khjEHACRHcoR1zmndIQnp5cv9l827WEdXmeQsItXgqlVHlKSMGUNPoCIZ328BLh2
10
+ Muv0D53QJk+s/EGwn3eNXYM3VHRURpuaiKuY++jhMnUbwJLASsNmIRRbGf2ni4VLZWJ
11
+ t0RlU9yKWMsjvD0pk496vC/WyZ1+59psK4j8a454=
12
+ From: MAILER-DAEMON@amazonses.com
13
+ To: bounce@mailer.mrk1.example.com
14
+ Message-ID: <010001725d8ae2e4-dedcd904-7f4c-4f5d-8039-4366b9b3ccf9-000000@email.amazonses.com>
15
+ Subject: Delivery Status Notification (Failure)
16
+ MIME-Version: 1.0
17
+ Content-Type: multipart/report;
18
+ boundary="----=_Part_1053912_1113443423.1590707282683";
19
+ report-type=delivery-status
20
+ Date: Thu, 28 May 2020 23:08:02 +0000
21
+ X-SES-Outgoing: 2020.05.28-54.240.14.88
22
+ Feedback-ID: 1.us-east-1.D1mWDvwUtiZJdKFArGKkGBe9wfRCdAX2ofq5lyeEo20=:AmazonSES
23
+
24
+ ------=_Part_1053912_1113443423.1590707282683
25
+ Content-Type: text/plain; charset=us-ascii
26
+ Content-Transfer-Encoding: 7bit
27
+ Content-Description: Notification
28
+
29
+ An error occurred while trying to deliver the mail to the following recipients:
30
+ theusername@charter.net
31
+ ------=_Part_1053912_1113443423.1590707282683
32
+ Content-Type: message/delivery-status
33
+ Content-Transfer-Encoding: 7bit
34
+ Content-Description: Delivery Status Notification
35
+
36
+ Reporting-MTA: dsn; d217-29.smtp-out.amazonses.com
37
+
38
+ Action: failed
39
+ Final-Recipient: rfc822; theusername@charter.net
40
+ Diagnostic-Code: smtp; 550 5.1.0 <010001725d8ad4fc-9fe8fb1f-0292-430b-a634-1eba65166dbb-000000@amazonses.com> sender rejected. Please see https://www.spectrum.net/support/internet/understanding-email-error-codes for more information. AUP#In-1310
41
+ Status: 5.1.0
42
+
43
+
44
+ ------=_Part_1053912_1113443423.1590707282683
45
+ Content-Type: message/rfc822
46
+ Content-Description: Undelivered Message
47
+
48
+ To: "theusername@charter.net" <theusername@charter.net>
49
+ Subject: 11 things that can happen when you drink apple cider vinegar every day
50
+ X-PHP-Originating-Script: 501:phpmailer.php
51
+ Date: Thu, 28 May 2020 23:07:59 +0000
52
+ From: WellBeing <wellbeing@mrk1.example.com>
53
+ Reply-To: WellBeing <wellbeing@example.com>
54
+ Message-ID: <010001725d8ad4fc-9fe8fb1f-0292-430b-a634-1eba65166dbb-000000@email.amazonses.com>
55
+ X-Priority: 3
56
+ X-Mailer: PHPMailer 5.2.7 (https://github.com/PHPMailer/PHPMailer/)
57
+ X-se: well_being
58
+ X-date: 20200528
59
+ X-version: wellbeing_05282020_ses
60
+ X-CONFIGSET: conf-marketing
61
+ Feedback-ID: A:B:C:D
62
+ X-HT-Sig: A:B:C:D
63
+ MIME-Version: 1.0
64
+ Content-Type: multipart/alternative;
65
+ boundary="b1_6292d2dadff87acb9905a58b2f5bb8fa"
66
+ Content-Transfer-Encoding: 8bit
67
+ X-SES-Outgoing: 2020.05.28-23.249.217.29
68
+ DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
69
+ s=224i4yxa5dv7c2xz3womw6peuasteono; d=amazonses.com; t=1590707279;
70
+ h=To:Subject:Date:From:Reply-To:Message-ID:Feedback-ID:List-Unsubscribe:MIME-Version:Content-Type:Content-Transfer-Encoding;
71
+ bh=dbVbPN/b0GldCE5Hr1ySMcLIjaoiDFOHnO0XV0UPcZU=;
72
+ b=HawZMCbQpUBpp2iTrrOklUkAClA3Pql7Mk4B2+ozqpclWNSMT3Tf+rDZ6psgC30A
73
+ ABx3ecJeP0Dyi5TABqCTUZxspCSXjOLa9f+LB2992v2WoPeagwHYgsgUCe1o+Zfq6nc
74
+ C+SCqoolw7YugpVHtM3/dr6bqlG/73rL+wWmb0AQ=
75
+ DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
76
+ s=sisbtliceazfsxysk55m7kdlqqu2nqgn; d=mrk1.example.com;
77
+ t=1590707279;
78
+ h=To:Subject:Date:From:Reply-To:Message-ID:List-Unsubscribe:MIME-Version:Content-Type:Content-Transfer-Encoding;
79
+ bh=dbVbPN/b0GldCE5Hr1ySMcLIjaoiDFOHnO0XV0UPcZU=;
80
+ b=BzFKfcuz3sRhwrmZJmhdq2gZK6UaU1RiOTBWHIBsGDxt/eyfk00qM8WQTgbZ0wua
81
+ FJauQAkc9mcK1TbcwS1drUM7hDWnsJyMLVs1UelR7MeW1QFm63h6krxVQfOOwYOK3TQ
82
+ a+FP/eiAtCk7mfeb6S6bwqmDJl6EvgOEo05vPSy4=
83
+
84
+ --b1_6292d2dadff87acb9905a58b2f5bb8fa
85
+ Content-Type: text/plain; charset=UTF-8
86
+ Content-Transfer-Encoding: 8bit
87
+
88
+
89
+ You have received this message because you have chosen to receive notifications from OURSITE.com.
90
+
91
+
92
+
93
+ --b1_6292d2dadff87acb9905a58b2f5bb8fa
94
+ Content-Type: text/html; charset=UTF-8
95
+ Content-Transfer-Encoding: 8bit
96
+
97
+ <!DOCTYPE HTML>
98
+ <html lang="en">
99
+ <head>
100
+ <body>
101
+ <h1> Body removed</h1>
102
+ </body>
103
+ </html>
104
+
105
+
106
+
107
+
108
+ --b1_6292d2dadff87acb9905a58b2f5bb8fa--
109
+
110
+
111
+ ------=_Part_1053912_1113443423.1590707282683--
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sisimai
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.25.7
4
+ version: 4.25.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - azumakuniyuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-25 00:00:00.000000000 Z
11
+ date: 2020-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -200,12 +200,14 @@ files:
200
200
  - lib/sisimai/rfc3834.rb
201
201
  - lib/sisimai/rfc5322.rb
202
202
  - lib/sisimai/rhost.rb
203
+ - lib/sisimai/rhost/cox.rb
203
204
  - lib/sisimai/rhost/exchangeonline.rb
204
205
  - lib/sisimai/rhost/franceptt.rb
205
206
  - lib/sisimai/rhost/godaddy.rb
206
207
  - lib/sisimai/rhost/googleapps.rb
207
208
  - lib/sisimai/rhost/iua.rb
208
209
  - lib/sisimai/rhost/kddi.rb
210
+ - lib/sisimai/rhost/spectrum.rb
209
211
  - lib/sisimai/rhost/tencentqq.rb
210
212
  - lib/sisimai/smtp.rb
211
213
  - lib/sisimai/smtp/error.rb
@@ -680,6 +682,7 @@ files:
680
682
  - set-of-emails/maildir/bsd/rfc3834-02.eml
681
683
  - set-of-emails/maildir/bsd/rfc3834-03.eml
682
684
  - set-of-emails/maildir/bsd/rfc3834-04.eml
685
+ - set-of-emails/maildir/bsd/rhost-cox-01.eml
683
686
  - set-of-emails/maildir/bsd/rhost-exchange-online-01.eml
684
687
  - set-of-emails/maildir/bsd/rhost-exchange-online-02.eml
685
688
  - set-of-emails/maildir/bsd/rhost-exchange-online-03.eml
@@ -700,6 +703,7 @@ files:
700
703
  - set-of-emails/maildir/bsd/rhost-iua-01.eml
701
704
  - set-of-emails/maildir/bsd/rhost-kddi-01.eml
702
705
  - set-of-emails/maildir/bsd/rhost-kddi-02.eml
706
+ - set-of-emails/maildir/bsd/rhost-spectrum-01.eml
703
707
  - set-of-emails/maildir/bsd/rhost-tencentqq-01.eml
704
708
  - set-of-emails/maildir/bsd/rhost-tencentqq-02.eml
705
709
  - set-of-emails/maildir/bsd/rhost-tencentqq-03.eml