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 +4 -4
- data/Benchmarks.mk +1 -1
- data/ChangeLog.md +21 -1
- data/Developers.mk +2 -2
- data/Makefile +1 -1
- data/README-JA.md +13 -13
- data/README.md +13 -13
- data/Repository.mk +1 -1
- data/lib/sisimai/data.rb +8 -29
- data/lib/sisimai/lhost/fml.rb +0 -2
- data/lib/sisimai/lhost/x5.rb +7 -3
- data/lib/sisimai/message.rb +47 -83
- data/lib/sisimai/rfc3464.rb +3 -4
- data/lib/sisimai/rhost.rb +5 -8
- data/lib/sisimai/rhost/cox.rb +112 -0
- data/lib/sisimai/rhost/spectrum.rb +73 -0
- data/lib/sisimai/version.rb +1 -1
- data/set-of-emails/README.md +5 -4
- data/set-of-emails/maildir/bsd/lhost-postfix-38.eml +1 -1
- data/set-of-emails/maildir/bsd/rhost-cox-01.eml +192 -0
- data/set-of-emails/maildir/bsd/rhost-spectrum-01.eml +111 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a97d3034cddf47a54f0970f324fde0b8574f19a11fd29fd85e11ecad9753f5f3
|
4
|
+
data.tar.gz: d60fd6b598d277b852f26ee42e483a4ffce7d946f6beefa374fe9aaeef6485a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f569792981be8ffcf27846db477b98f814914fed55841d994b16843a668025926e737c7cf8b1ae5287049184714dddee99c0d7e2538f2de5e44ba35ab92f402c
|
7
|
+
data.tar.gz: cf079e53450f827e7c5e104a64a8abe75d8deba09be822f1cc178e85548abbd7829bc23f74f0a6ae361b331e2ebac07f705c207c9885a115bbcee1b7b125b2c7
|
data/Benchmarks.mk
CHANGED
data/ChangeLog.md
CHANGED
@@ -1,8 +1,28 @@
|
|
1
1
|
RELEASE NOTES for Ruby version of Sisimai
|
2
2
|
================================================================================
|
3
|
-
- releases: "https://github.com/sisimai/rb-
|
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)"
|
data/Developers.mk
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
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-
|
18
|
+
PERL5SISIMAI := p5-sisimai
|
19
19
|
PRECISIONTAB := ANALYTICAL-PRECISION
|
20
20
|
PARSERLOGDIR := tmp/parser-logs
|
21
21
|
MAILCLASSDIR := lib/$(NAME)/Lhost
|
data/Makefile
CHANGED
data/README-JA.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-
|
4
|
-
[![Coverage Status](https://img.shields.io/coveralls/sisimai/rb-
|
5
|
-
[![Build Status](https://travis-ci.org/sisimai/rb-
|
6
|
-
[![Codacy Badge](https://api.codacy.com/project/badge/grade/38340177e6284a65be69c0c7c3dc2b58)](https://www.codacy.com/app/azumakuniyuki/rb-
|
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-
|
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-
|
93
|
-
$ cd ./rb-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
4
|
-
[![Coverage Status](https://img.shields.io/coveralls/sisimai/rb-
|
5
|
-
[![Build Status](https://travis-ci.org/sisimai/rb-
|
6
|
-
[![Codacy Badge](https://api.codacy.com/project/badge/grade/38340177e6284a65be69c0c7c3dc2b58)](https://www.codacy.com/app/azumakuniyuki/rb-
|
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-
|
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-
|
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-
|
98
|
-
$ cd ./rb-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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)
|
data/Repository.mk
CHANGED
data/lib/sisimai/data.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
318
|
-
|
319
|
-
|
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
|
|
data/lib/sisimai/lhost/fml.rb
CHANGED
@@ -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>.
|
data/lib/sisimai/lhost/x5.rb
CHANGED
@@ -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[
|
63
|
+
next if (readcursor & Indicators[:deliverystatus]) == 0
|
60
64
|
next if e.empty?
|
61
65
|
|
62
66
|
v = dscontents[-1]
|
data/lib/sisimai/message.rb
CHANGED
@@ -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
|
-
|
46
|
+
param[e.to_s] = argvs[e]
|
44
47
|
end
|
48
|
+
tobeloaded = Sisimai::Message.load(param)
|
45
49
|
|
46
|
-
|
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
|
-
#
|
92
|
-
|
93
|
-
|
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
|
-
#
|
96
|
-
unless
|
57
|
+
# 4. Decode and rewrite the "Subject:" header
|
58
|
+
unless thing['header']['subject'].empty?
|
97
59
|
# Decode MIME-Encoded "Subject:" header
|
98
|
-
s =
|
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[
|
67
|
+
aftersplit[2] = aftersplit[2].gsub(/^[>]+[ ]/, '').gsub(/^[>]$/, '')
|
106
68
|
end
|
107
|
-
|
69
|
+
thing['header']['subject'] = q
|
108
70
|
end
|
109
71
|
|
110
|
-
#
|
111
|
-
|
112
|
-
|
113
|
-
'
|
114
|
-
'
|
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(
|
80
|
+
return nil unless bouncedata = Sisimai::Message.parse(param)
|
120
81
|
return nil if bouncedata.empty?
|
121
82
|
|
122
|
-
#
|
123
|
-
%w|ds catch rfc822|.each { |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[
|
126
|
-
|
127
|
-
|
128
|
-
|
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 [
|
143
|
+
# @return [Array] Email data after split
|
175
144
|
def self.divideup(email)
|
176
145
|
return nil if email.empty?
|
177
146
|
|
178
|
-
block =
|
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[
|
183
|
-
return nil unless block[
|
184
|
-
return nil unless block[
|
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[
|
155
|
+
if block[1].start_with?('From ')
|
187
156
|
# From MAILER-DAEMON Tue Feb 11 00:00:00 2014
|
188
|
-
block[
|
157
|
+
block[0] = block[1].split(/\n/, 2)[0].delete("\r")
|
189
158
|
else
|
190
159
|
# Set pseudo UNIX From line
|
191
|
-
block[
|
160
|
+
block[0] = 'MAILER-DAEMON Tue Feb 11 00:00:00 2014'
|
192
161
|
end
|
193
162
|
|
194
|
-
block[
|
195
|
-
block[
|
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
|
data/lib/sisimai/rfc3464.rb
CHANGED
@@ -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
|
-
|
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] || '' }
|
data/lib/sisimai/rhost.rb
CHANGED
@@ -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
|
+
|
data/lib/sisimai/version.rb
CHANGED
data/set-of-emails/README.md
CHANGED
@@ -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-
|
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-
|
28
|
-
* __Ruby verson__ | [Ruby version of Sisimai(Under the development)](https://github.com/sisimai/rb-
|
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-
|
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/
|
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.
|
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-
|
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
|