sisimai 5.0.3-java → 5.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/codecovio.yml +3 -1
- data/.github/workflows/rake-test.yml +6 -2
- data/ChangeLog.md +34 -0
- data/README-JA.md +20 -17
- data/README.md +20 -17
- data/lib/sisimai/arf.rb +3 -3
- data/lib/sisimai/fact/json.rb +2 -2
- data/lib/sisimai/fact/yaml.rb +2 -2
- data/lib/sisimai/fact.rb +4 -19
- data/lib/sisimai/lhost/activehunter.rb +4 -3
- data/lib/sisimai/lhost/amavis.rb +4 -4
- data/lib/sisimai/lhost/amazonses.rb +6 -6
- data/lib/sisimai/lhost/amazonworkmail.rb +4 -4
- data/lib/sisimai/lhost/aol.rb +4 -4
- data/lib/sisimai/lhost/apachejames.rb +4 -4
- data/lib/sisimai/lhost/barracuda.rb +4 -4
- data/lib/sisimai/lhost/bigfoot.rb +4 -4
- data/lib/sisimai/lhost/biglobe.rb +4 -4
- data/lib/sisimai/lhost/courier.rb +4 -4
- data/lib/sisimai/lhost/domino.rb +4 -4
- data/lib/sisimai/lhost/dragonfly.rb +114 -0
- data/lib/sisimai/lhost/einsundeins.rb +4 -4
- data/lib/sisimai/lhost/exchange2003.rb +4 -3
- data/lib/sisimai/lhost/exchange2007.rb +4 -3
- data/lib/sisimai/lhost/exim.rb +4 -4
- data/lib/sisimai/lhost/ezweb.rb +4 -4
- data/lib/sisimai/lhost/facebook.rb +4 -4
- data/lib/sisimai/lhost/fml.rb +4 -4
- data/lib/sisimai/lhost/gmail.rb +4 -4
- data/lib/sisimai/lhost/gmx.rb +4 -4
- data/lib/sisimai/lhost/googlegroups.rb +4 -4
- data/lib/sisimai/lhost/gsuite.rb +4 -4
- data/lib/sisimai/lhost/imailserver.rb +4 -3
- data/lib/sisimai/lhost/interscanmss.rb +5 -4
- data/lib/sisimai/lhost/kddi.rb +4 -4
- data/lib/sisimai/lhost/mailfoundry.rb +4 -4
- data/lib/sisimai/lhost/mailmarshalsmtp.rb +5 -4
- data/lib/sisimai/lhost/mailru.rb +4 -4
- data/lib/sisimai/lhost/mcafee.rb +4 -4
- data/lib/sisimai/lhost/messagelabs.rb +4 -3
- data/lib/sisimai/lhost/messagingserver.rb +5 -4
- data/lib/sisimai/lhost/mfilter.rb +4 -4
- data/lib/sisimai/lhost/mxlogic.rb +3 -3
- data/lib/sisimai/lhost/notes.rb +4 -4
- data/lib/sisimai/lhost/office365.rb +4 -4
- data/lib/sisimai/lhost/opensmtpd.rb +9 -7
- data/lib/sisimai/lhost/outlook.rb +4 -4
- data/lib/sisimai/lhost/postfix.rb +4 -4
- data/lib/sisimai/lhost/powermta.rb +4 -4
- data/lib/sisimai/lhost/qmail.rb +10 -10
- data/lib/sisimai/lhost/receivingses.rb +4 -4
- data/lib/sisimai/lhost/sendgrid.rb +4 -4
- data/lib/sisimai/lhost/sendmail.rb +4 -4
- data/lib/sisimai/lhost/surfcontrol.rb +4 -4
- data/lib/sisimai/lhost/v5sendmail.rb +5 -4
- data/lib/sisimai/lhost/verizon.rb +4 -4
- data/lib/sisimai/lhost/x1.rb +3 -3
- data/lib/sisimai/lhost/x2.rb +3 -3
- data/lib/sisimai/lhost/x3.rb +3 -3
- data/lib/sisimai/lhost/x4.rb +3 -3
- data/lib/sisimai/lhost/x5.rb +3 -3
- data/lib/sisimai/lhost/x6.rb +3 -3
- data/lib/sisimai/lhost/yahoo.rb +4 -4
- data/lib/sisimai/lhost/yandex.rb +4 -4
- data/lib/sisimai/lhost/zoho.rb +4 -4
- data/lib/sisimai/lhost.rb +5 -5
- data/lib/sisimai/mail/maildir.rb +1 -1
- data/lib/sisimai/mail/stdin.rb +1 -1
- data/lib/sisimai/mda.rb +3 -3
- data/lib/sisimai/message.rb +8 -8
- data/lib/sisimai/order.rb +1 -0
- data/lib/sisimai/reason/badreputation.rb +1 -1
- data/lib/sisimai/reason/norelaying.rb +1 -0
- data/lib/sisimai/reason/rejected.rb +1 -0
- data/lib/sisimai/reason.rb +8 -8
- data/lib/sisimai/rfc3464.rb +3 -3
- data/lib/sisimai/rfc3834.rb +2 -2
- data/lib/sisimai/rhost/apple.rb +92 -0
- data/lib/sisimai/rhost/cox.rb +81 -32
- data/lib/sisimai/rhost/franceptt.rb +84 -81
- data/lib/sisimai/rhost/godaddy.rb +205 -43
- data/lib/sisimai/rhost/google.rb +3 -5
- data/lib/sisimai/rhost/iua.rb +2 -2
- data/lib/sisimai/rhost/kddi.rb +6 -5
- data/lib/sisimai/rhost/microsoft.rb +4 -5
- data/lib/sisimai/rhost/mimecast.rb +15 -4
- data/lib/sisimai/rhost/nttdocomo.rb +1 -1
- data/lib/sisimai/rhost/spectrum.rb +100 -40
- data/lib/sisimai/rhost/tencent.rb +46 -25
- data/lib/sisimai/rhost/yahooinc.rb +110 -0
- data/lib/sisimai/rhost.rb +28 -35
- data/lib/sisimai/smtp/reply.rb +4 -3
- data/lib/sisimai/smtp/transcript.rb +3 -3
- data/lib/sisimai/version.rb +1 -1
- data/lib/sisimai.rb +0 -6
- data/set-of-emails/maildir/bsd/lhost-dragonfly-01.eml +36 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-02.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-03.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-04.eml +31 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-05.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-06.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-07.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-08.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-09.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-10.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-11.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-12.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-13.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-14.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-15.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-16.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-17.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-18.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-19.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-20.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-21.eml +33 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-22.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-23.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-24.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-25.eml +33 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-26.eml +33 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-27.eml +47 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-28.eml +47 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-29.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-dragonfly-30.eml +32 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-10.eml +58 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-11.eml +58 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-12.eml +62 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-13.eml +62 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-14.eml +58 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-15.eml +63 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-16.eml +62 -0
- data/set-of-emails/maildir/bsd/lhost-opensmtpd-17.eml +63 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-11.eml +29 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-12.eml +29 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-13.eml +29 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-14.eml +34 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-15.eml +30 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-16.eml +31 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-17.eml +38 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-18.eml +31 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-19.eml +31 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-20.eml +46 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-21.eml +41 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-22.eml +42 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-23.eml +43 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-24.eml +43 -0
- data/set-of-emails/maildir/bsd/lhost-qmail-25.eml +54 -0
- data/set-of-emails/maildir/bsd/rhost-apple-01.eml +79 -0
- data/set-of-emails/maildir/bsd/rhost-apple-02.eml +81 -0
- data/set-of-emails/maildir/bsd/rhost-apple-03.eml +75 -0
- data/set-of-emails/maildir/bsd/rhost-apple-04.eml +74 -0
- data/set-of-emails/maildir/bsd/rhost-yahooinc-01.eml +80 -0
- data/set-of-emails/maildir/bsd/rhost-yahooinc-02.eml +83 -0
- data/set-of-emails/maildir/bsd/rhost-yahooinc-03.eml +125 -0
- metadata +65 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddf0430c212f7bed1058a268f5dbbff54ecbcfdf7560259647552b6edf082e94
|
4
|
+
data.tar.gz: 978bceb01352802bc8c2f597a2eacca31309fd9b8be107229ca3e4598d849f04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc57b195ed29e0644c63a0217f8a4e0f6f7d055aef63e638c7ed484a575b61d4991a194ced77be9c8bf6520aebab565ac1aa33879b065a3695bd3635ceb6b478
|
7
|
+
data.tar.gz: 4217c94e42e8805db27369da7d1f4f5f052f8865cf28ae38910fe2262cd37073d5c8f938e2b774d2f352b21eea96999e7537c314b02751588ffae263476dc9ea
|
@@ -3,13 +3,15 @@ on:
|
|
3
3
|
push:
|
4
4
|
branches: ["5-stable"]
|
5
5
|
pull_request:
|
6
|
-
branches: ["
|
6
|
+
branches: ["*"]
|
7
7
|
jobs:
|
8
8
|
codecov:
|
9
9
|
runs-on: ubuntu-latest
|
10
10
|
steps:
|
11
11
|
- name: Checkout the repository(CRuby)
|
12
12
|
uses: actions/checkout@v4
|
13
|
+
with:
|
14
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
13
15
|
- name: Setup CRuby
|
14
16
|
uses: ruby/setup-ruby@v1
|
15
17
|
with:
|
@@ -3,7 +3,7 @@ on:
|
|
3
3
|
push:
|
4
4
|
branches: ["5-stable"]
|
5
5
|
pull_request:
|
6
|
-
branches: ["
|
6
|
+
branches: ["*"]
|
7
7
|
jobs:
|
8
8
|
test-cruby:
|
9
9
|
name: rake test with CRuby ${{ matrix.cruby }}
|
@@ -15,6 +15,8 @@ jobs:
|
|
15
15
|
steps:
|
16
16
|
- name: Checkout the repository(CRuby)
|
17
17
|
uses: actions/checkout@v4
|
18
|
+
with:
|
19
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
18
20
|
- name: Setup CRuby
|
19
21
|
uses: ruby/setup-ruby@v1
|
20
22
|
with:
|
@@ -38,7 +40,9 @@ jobs:
|
|
38
40
|
jruby: ["jruby-9.2", "jruby-9.4"]
|
39
41
|
steps:
|
40
42
|
- name: Checkout the repository(JRuby)
|
41
|
-
uses: actions/checkout@
|
43
|
+
uses: actions/checkout@v4
|
44
|
+
with:
|
45
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
42
46
|
- name: Setup JRuby
|
43
47
|
uses: ruby/setup-ruby@v1
|
44
48
|
with:
|
data/ChangeLog.md
CHANGED
@@ -3,6 +3,40 @@ RELEASE NOTES for Ruby version of Sisimai
|
|
3
3
|
- releases: "https://github.com/sisimai/rb-sisimai/releases"
|
4
4
|
- download: "https://rubygems.org/gems/sisimai"
|
5
5
|
|
6
|
+
v5.1.0
|
7
|
+
---------------------------------------------------------------------------------------------------
|
8
|
+
- release: "Mon, 1 Jul 2024 12:02:22 +0900 (JST)"
|
9
|
+
- version: "5.1.0"
|
10
|
+
- changes:
|
11
|
+
- #297 #300 Remove v4 compatible features
|
12
|
+
- `Sisimai.make()`
|
13
|
+
- `Sisimai::Fact.softbounce()`
|
14
|
+
- #292 #293 Implement `Sisimai::Lhost::DragonFly`
|
15
|
+
- Add 30 sample emails generated by DMA: DrangonFly Mail Agent (lhost-dragonfly-*.eml)
|
16
|
+
- #288 Consolidate error messages scattered under `Sisimai::Reason::*` into `Sisimai::Rhost::*`
|
17
|
+
classes for each email service #289
|
18
|
+
- `Sisimai::Rhost::YahooInc` for https://senders.yahooinc.com/smtp-error-codes/
|
19
|
+
- `Sisimai::Rhost::Apple` for iCloud Mail
|
20
|
+
- The following sample emails in `set-of-emails/maildir/bsd`:
|
21
|
+
- 3 sample emails (rhost-yahooinc-0[1-3].eml)
|
22
|
+
- 4 sample emails (rhost-apple-0[1-4].eml)
|
23
|
+
- #290 #291 #295 Sisimai::Rhost improvements
|
24
|
+
- Update the error code list and error message patterns in the following classes:
|
25
|
+
- `Sisimai::Rhost::Cox`
|
26
|
+
- `Sisimai::Rhost::FrancePTT`
|
27
|
+
- `Sisimai::Rhost::GoDaddy`
|
28
|
+
- `Sisimai::Rhost::Mimecast`
|
29
|
+
- `Sisimai::Rhost::Spectrum`
|
30
|
+
- `Sisimai::Rhost::Tencent`
|
31
|
+
- Each error message should be compared with the lowercased string
|
32
|
+
- Follow any updates of the SMTP error code and message list in each email services related to
|
33
|
+
`AuthFailure`, `BadReputation`, `RequirePTR`, and other error reasons added at v5
|
34
|
+
- No longer needed method `Sisimai::Rhost.match` method has been removed
|
35
|
+
- #296 Add 8 sample emails (lhost-opensmtpd-1[0-7].eml)generated by OpenSMTPD 6.8.0p2
|
36
|
+
- #298 Add 9 sample emails (lhost-qmail-1[1-9].eml) generated by notqmail 1.08
|
37
|
+
- #299 Add 6 sample emails (lhost-qmail-2[0-5].eml) generated by indimail 3.0.7
|
38
|
+
- Sisimai works on Ruby 3.3.3
|
39
|
+
|
6
40
|
v5.0.3
|
7
41
|
---------------------------------------------------------------------------------------------------
|
8
42
|
- release: "Wed, 22 May 2024 14:12:22 +0900 (JST)"
|
data/README-JA.md
CHANGED
@@ -78,7 +78,7 @@ The key features of Sisimai
|
|
78
78
|
* `gem install`
|
79
79
|
* `git clone && make`
|
80
80
|
* __高い解析精度__
|
81
|
-
* [
|
81
|
+
* [73種類のMTAs/MDAs/ESPs](https://libsisimai.org/en/engine/)に対応
|
82
82
|
* Feedback Loop(ARF)にも対応
|
83
83
|
* [34種類のバウンス理由](https://libsisimai.org/en/reason/)を検出
|
84
84
|
|
@@ -110,10 +110,10 @@ Install
|
|
110
110
|
### From RubyGems.org
|
111
111
|
```shell
|
112
112
|
$ sudo gem install sisimai
|
113
|
-
Fetching: sisimai-5.0.
|
114
|
-
Successfully installed sisimai-5.0
|
115
|
-
Parsing documentation for sisimai-5.0
|
116
|
-
Installing ri documentation for sisimai-5.0
|
113
|
+
Fetching: sisimai-5.1.0.gem (100%)
|
114
|
+
Successfully installed sisimai-5.1.0
|
115
|
+
Parsing documentation for sisimai-5.1.0
|
116
|
+
Installing ri documentation for sisimai-5.1.0
|
117
117
|
Done installing documentation for sisimai after 6 seconds
|
118
118
|
1 gem installed
|
119
119
|
```
|
@@ -141,13 +141,13 @@ if [ -d "/usr/local/jr" ]; then \
|
|
141
141
|
...
|
142
142
|
3 gems installed
|
143
143
|
/opt/local/bin/rake install
|
144
|
-
sisimai 5.0
|
145
|
-
sisimai (5.0
|
144
|
+
sisimai 5.1.0 built to pkg/sisimai-5.1.0.gem.
|
145
|
+
sisimai (5.1.0) installed.
|
146
146
|
if [ -d "/usr/local/jr" ]; then \
|
147
147
|
PATH="/usr/local/jr/bin:$PATH" /usr/local/jr/bin/rake install; \
|
148
148
|
fi
|
149
|
-
sisimai 5.0
|
150
|
-
sisimai (5.0
|
149
|
+
sisimai 5.1.0 built to pkg/sisimai-5.1.0-java.gem.
|
150
|
+
sisimai (5.1.0) installed.
|
151
151
|
```
|
152
152
|
|
153
153
|
Usage
|
@@ -351,12 +351,12 @@ Sisimai 5.0.0から**Ruby 2.4以上**が必要になります。
|
|
351
351
|
| 動作環境(CRuby) | 2.1 - | **2.4** or later |
|
352
352
|
| 動作環境(JRuby) | 9.0.4.0 - 9.1.17.0 | **9.2** or later |
|
353
353
|
| 元メールファイルを操作可能なコールバック機能 | なし | あり[^3] |
|
354
|
-
| 解析エンジン(MTA/ESPモジュール)の数 | 68 |
|
354
|
+
| 解析エンジン(MTA/ESPモジュール)の数 | 68 | 73 |
|
355
355
|
| 検出可能なバウンス理由の数 | 29 | 34 |
|
356
356
|
| 依存Gem数(Ruby Standard Gemsを除く) | 1 Gem | 1 Gem |
|
357
|
-
| ソースコードの行数 | 10,800 行 | 11,
|
357
|
+
| ソースコードの行数 | 10,800 行 | 11,660 行 |
|
358
358
|
| テストフレームワーク | rspec | minitest |
|
359
|
-
| テスト件数(spec/またはtest/ディレクトリ) | 311,000 件 |
|
359
|
+
| テスト件数(spec/またはtest/ディレクトリ) | 311,000 件 | 414,000 件 |
|
360
360
|
| 1秒間に解析できるバウンスメール数[^4] | 231 通 | 305 通 |
|
361
361
|
| ライセンス | 2条項BSD | 2条項BSD |
|
362
362
|
| 開発会社による商用サポート | 提供中 | 提供中 |
|
@@ -389,11 +389,14 @@ MTA/ESP Module Names
|
|
389
389
|
Sisimai 5で3個のESPモジュール名(解析エンジン)が変更になりました。詳細はMTA/ESPモジュールの一覧/
|
390
390
|
[LIBSISIMAI.ORG/JA/ENGINE](https://libsisimai.org/ja/engine/)を参照してください。
|
391
391
|
|
392
|
-
| `Sisimai
|
393
|
-
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
392
|
+
| `Sisimai::` | Sisimai 4 | Sisimai 5 |
|
393
|
+
|-------------------------------------------------|-------------------------|---------------------|
|
394
|
+
| Apple iCloud Mail (added at v5.1.0) | なし | `Rhost::Apple` |
|
395
|
+
| Microsoft Exchange Online | `Rhost::ExchangeOnline` | `Rhost::Microsoft` |
|
396
|
+
| Google Workspace | `Rhost::GoogleApps` | `Rhost::Google` |
|
397
|
+
| Tencent | `Rhost::TencentQQ` | `Rhost::Tencent` |
|
398
|
+
| Yahoo Mail (added at v5.1.0) | なし | `Rhost::YahooInc` |
|
399
|
+
| DragonFly Mail Agent (added at v5.1.0) | なし | `Lhost::DragonFly` |
|
397
400
|
|
398
401
|
Bounce Reasons
|
399
402
|
---------------------------------------------------------------------------------------------------
|
data/README.md
CHANGED
@@ -80,7 +80,7 @@ The key features of Sisimai
|
|
80
80
|
* `gem install`
|
81
81
|
* `git clone && make`
|
82
82
|
* __High Precision of Analysis__
|
83
|
-
* Support [
|
83
|
+
* Support [73 MTAs/MDAs/ESPs](https://libsisimai.org/en/engine/)
|
84
84
|
* Support Feedback Loop Message(ARF)
|
85
85
|
* Can detect [34 bounce reasons](https://libsisimai.org/en/reason/)
|
86
86
|
|
@@ -109,10 +109,10 @@ Install
|
|
109
109
|
### From RubyGems
|
110
110
|
```shell
|
111
111
|
$ sudo gem install sisimai
|
112
|
-
Fetching: sisimai-5.0.
|
113
|
-
Successfully installed sisimai-5.0
|
114
|
-
Parsing documentation for sisimai-5.0
|
115
|
-
Installing ri documentation for sisimai-5.0
|
112
|
+
Fetching: sisimai-5.1.0.gem (100%)
|
113
|
+
Successfully installed sisimai-5.1.0
|
114
|
+
Parsing documentation for sisimai-5.1.0
|
115
|
+
Installing ri documentation for sisimai-5.1.0
|
116
116
|
Done installing documentation for sisimai after 6 seconds
|
117
117
|
1 gem installed
|
118
118
|
```
|
@@ -140,13 +140,13 @@ if [ -d "/usr/local/jr" ]; then \
|
|
140
140
|
...
|
141
141
|
3 gems installed
|
142
142
|
/opt/local/bin/rake install
|
143
|
-
sisimai 5.0
|
144
|
-
sisimai (5.0
|
143
|
+
sisimai 5.1.0 built to pkg/sisimai-5.1.0.gem.
|
144
|
+
sisimai (5.1.0) installed.
|
145
145
|
if [ -d "/usr/local/jr" ]; then \
|
146
146
|
PATH="/usr/local/jr/bin:$PATH" /usr/local/jr/bin/rake install; \
|
147
147
|
fi
|
148
|
-
sisimai 5.0
|
149
|
-
sisimai (5.0
|
148
|
+
sisimai 5.1.0 built to pkg/sisimai-5.1.0-java.gem.
|
149
|
+
sisimai (5.1.0) installed.
|
150
150
|
```
|
151
151
|
|
152
152
|
Usage
|
@@ -350,12 +350,12 @@ Beginning with v5.0.0, Sisimai requires **Ruby 2.4.0 or later.**
|
|
350
350
|
| System requirements (CRuby) | 2.1 - 3.3.0 | **2.4** or later |
|
351
351
|
| System requirements (JRuby) | 9.0.4.0 - 9.1.17.0 | **9.2** or later |
|
352
352
|
| Callback feature for the original email file | N/A | Available[^3] |
|
353
|
-
| The number of MTA/ESP modules | 68 |
|
353
|
+
| The number of MTA/ESP modules | 68 | 73 |
|
354
354
|
| The number of detectable bounce reasons | 29 | 34 |
|
355
355
|
| Dependencies (Except Ruby Standard Gems) | 1 gem | 1 gem |
|
356
|
-
| Source lines of code | 10,300 lines | 11,
|
356
|
+
| Source lines of code | 10,300 lines | 11,660 lines |
|
357
357
|
| Test frameworks | rspec | minitest |
|
358
|
-
| The number of tests in spec/ or test/ directory | 311,000 tests |
|
358
|
+
| The number of tests in spec/ or test/ directory | 311,000 tests | 414,000 tests |
|
359
359
|
| The number of bounce emails decoded/sec (CRuby)[^4] | 231 emails | 305 emails |
|
360
360
|
| License | 2 Clause BSD | 2 Caluse BSD |
|
361
361
|
| Commercial support | Available | Available |
|
@@ -390,11 +390,14 @@ MTA/ESP Module Names
|
|
390
390
|
Three ESP module names have been changed at Sisimai 5. The list of the all MTA/ESP modules is
|
391
391
|
available at [LIBSISIMAI.ORG/EN/ENGINE](https://libsisimai.org/en/engine/)
|
392
392
|
|
393
|
-
| `Sisimai
|
394
|
-
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
393
|
+
| `Sisimai::` | Sisimai 4 | Sisimai 5 |
|
394
|
+
|-------------------------------------------------|-------------------------|---------------------|
|
395
|
+
| Apple iCloud Mail (added at v5.1.0) | None | `Rhost::Apple` |
|
396
|
+
| Microsoft Exchange Online | `Rhost::ExchangeOnline` | `Rhost::Microsoft` |
|
397
|
+
| Google Workspace | `Rhost::GoogleApps` | `Rhost::Google` |
|
398
|
+
| Tencent | `Rhost::TencentQQ` | `Rhost::Tencent` |
|
399
|
+
| Yahoo Mail (added at v5.1.0) | None | `Rhost::YahooInc` |
|
400
|
+
| DragonFly Mail Agent (added at v5.1.0) | None | `Lhost::DragonFly` |
|
398
401
|
|
399
402
|
Bounce Reasons
|
400
403
|
---------------------------------------------------------------------------------------------------
|
data/lib/sisimai/arf.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Sisimai
|
2
|
-
# Sisimai::ARF is a
|
2
|
+
# Sisimai::ARF is a decoder for the email returned as a FeedBack Loop report message.
|
3
3
|
module ARF
|
4
4
|
class << self
|
5
5
|
require 'sisimai/lhost'
|
@@ -58,11 +58,11 @@ module Sisimai
|
|
58
58
|
return match
|
59
59
|
end
|
60
60
|
|
61
|
-
# Detect an error for Feedback Loop
|
61
|
+
# @abstract Detect an error for Feedback Loop
|
62
62
|
# @param [Hash] mhead Message headers of a bounce email
|
63
63
|
# @param [String] mbody Message body of a bounce email
|
64
64
|
# @return [Hash] Bounce data list and message/rfc822 part
|
65
|
-
# @return [Nil] it failed to
|
65
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
66
66
|
def inquire(mhead, mbody)
|
67
67
|
return nil unless self.is_arf(mhead)
|
68
68
|
|
data/lib/sisimai/fact/json.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Sisimai
|
2
2
|
class Fact
|
3
|
-
# Sisimai::Fact::JSON dumps
|
4
|
-
# called from the parent object "Sisimai::Fact".
|
3
|
+
# Sisimai::Fact::JSON dumps decoded data object as a JSON format. This class and method should
|
4
|
+
# be called from the parent object "Sisimai::Fact".
|
5
5
|
module JSON
|
6
6
|
class << self
|
7
7
|
# Serializer (JSON)
|
data/lib/sisimai/fact/yaml.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Sisimai
|
2
2
|
class Fact
|
3
|
-
# Sisimai::Fact::YAML dumps
|
4
|
-
# called from the parent object "Sisimai::Fact".
|
3
|
+
# Sisimai::Fact::YAML dumps decoded data object as a YAML format. This class and method should
|
4
|
+
# be called from the parent object "Sisimai::Fact".
|
5
5
|
module YAML
|
6
6
|
class << self
|
7
7
|
require 'yaml'
|
data/lib/sisimai/fact.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Sisimai
|
2
|
-
# Sisimai::Fact generate
|
2
|
+
# Sisimai::Fact generate the list of decoded bounce data
|
3
3
|
class Fact
|
4
4
|
require 'sisimai/message'
|
5
5
|
require 'sisimai/rfc1894'
|
@@ -383,15 +383,9 @@ module Sisimai
|
|
383
383
|
# REASON: Decide the reason of email bounce
|
384
384
|
if o['reason'].empty? || RetryIndex[o['reason']]
|
385
385
|
# The value of "reason" is empty or is needed to check with other values again
|
386
|
-
re = ''
|
387
|
-
|
388
|
-
if
|
389
|
-
# Failed to detect a bounce reason by the value of "rhost"
|
390
|
-
re = Sisimai::Rhost.get(o, de) if Sisimai::Rhost.match(de)
|
391
|
-
re = Sisimai::Reason.get(o) if re.empty?
|
392
|
-
re = 'undefined' if re.empty?
|
393
|
-
end
|
394
|
-
o['reason'] = re
|
386
|
+
re = o['reason'].empty? ? 'undefined' : o['reason']
|
387
|
+
o['reason'] = Sisimai::Rhost.get(o) || Sisimai::Reason.get(o)
|
388
|
+
o['reason'] = re if o['reason'].empty?
|
395
389
|
end
|
396
390
|
|
397
391
|
# HARDBOUNCE: Set the value of "hardbounce", default value of "bouncebounce" is false
|
@@ -443,15 +437,6 @@ module Sisimai
|
|
443
437
|
return listoffact
|
444
438
|
end
|
445
439
|
|
446
|
-
# Emulate "softbounce" accessor for the backward compatible
|
447
|
-
# @return [Integer]
|
448
|
-
def softbounce
|
449
|
-
warn ' ***warning: Sisimai::Fact.softbounce will be removed at v5.1.0. Use Sisimai::Fact.hardbounce instead'
|
450
|
-
return 0 if self.hardbounce
|
451
|
-
return -1 if self.reason == 'delivered' || self.reason == 'feedback' || self.reason == 'vacation'
|
452
|
-
return 1
|
453
|
-
end
|
454
|
-
|
455
440
|
# Convert from Sisimai::Fact object to a Hash
|
456
441
|
# @return [Hash] Hashed data
|
457
442
|
def damn
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Activehunter
|
2
|
+
# Sisimai::Lhost::Activehunter decodes a bounce email which created by QUALITIA Active!hunter
|
3
|
+
# https://www.qualitia.com/jp/product/ah/function.html.
|
3
4
|
# Methods in the module are called from only Sisimai::Message.
|
4
5
|
module Activehunter
|
5
6
|
class << self
|
@@ -9,11 +10,11 @@ module Sisimai::Lhost
|
|
9
10
|
Boundaries = ['Content-Type: message/rfc822'].freeze
|
10
11
|
StartingOf = { message: [' ----- The following addresses had permanent fatal errors -----'] }.freeze
|
11
12
|
|
12
|
-
#
|
13
|
+
# @abstract decodes the bounce message from QUALITIA Active!hunter
|
13
14
|
# @param [Hash] mhead Message headers of a bounce email
|
14
15
|
# @param [String] mbody Message body of a bounce email
|
15
16
|
# @return [Hash] Bounce data list and message/rfc822 part
|
16
|
-
# @return [Nil] it failed to
|
17
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
17
18
|
def inquire(mhead, mbody)
|
18
19
|
# :from => %r/\A"MAILER-DAEMON"/,
|
19
20
|
# :subject => %r/FAILURE NOTICE :/,
|
data/lib/sisimai/lhost/amavis.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Amavis
|
3
|
-
# are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Amavis decodes a bounce email which created by amavsid-new.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Amavis
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -68,11 +68,11 @@ module Sisimai::Lhost
|
|
68
68
|
],
|
69
69
|
}.freeze
|
70
70
|
|
71
|
-
#
|
71
|
+
# @abstract Decodes the bounce message from amavisd-new
|
72
72
|
# @param [Hash] mhead Message headers of a bounce email
|
73
73
|
# @param [String] mbody Message body of a bounce email
|
74
74
|
# @return [Hash] Bounce data list and message/rfc822 part
|
75
|
-
# @return [Nil] it failed to
|
75
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
76
76
|
# @since v4.25.0
|
77
77
|
def inquire(mhead, mbody)
|
78
78
|
# From: "Content-filter at neko1.example.jp" <postmaster@neko1.example.jp>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::AmazonSES
|
3
|
-
# Methods in the module are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::AmazonSES decodes a bounce email which created by Amazon Simple Email Service
|
3
|
+
# https://aws.amazon.com/ses/. Methods in the module are called from only Sisimai::Message.
|
4
4
|
module AmazonSES
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -13,11 +13,11 @@ module Sisimai::Lhost
|
|
13
13
|
}.freeze
|
14
14
|
MessagesOf = { 'expired' => ['Delivery expired'] }.freeze
|
15
15
|
|
16
|
-
#
|
16
|
+
# @abstract Decodes the bounce message from Amazon SES
|
17
17
|
# @param [Hash] mhead Message headers of a bounce email
|
18
18
|
# @param [String] mbody Message body of a bounce email
|
19
19
|
# @return [Hash] Bounce data list and message/rfc822 part
|
20
|
-
# @return [Nil] it failed to
|
20
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
21
21
|
def inquire(mhead, mbody)
|
22
22
|
dscontents = [Sisimai::Lhost.DELIVERYSTATUS]
|
23
23
|
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
@@ -292,7 +292,7 @@ module Sisimai::Lhost
|
|
292
292
|
end
|
293
293
|
|
294
294
|
if recipients == 0 && mbody =~ /notificationType/
|
295
|
-
# Try to
|
295
|
+
# Try to decode with Sisimai::Lhost::AmazonSES module
|
296
296
|
j = Sisimai::Lhost::AmazonSES.json(mhead, mbody)
|
297
297
|
|
298
298
|
if j['ds'].is_a? Array
|
@@ -328,7 +328,7 @@ module Sisimai::Lhost
|
|
328
328
|
end
|
329
329
|
|
330
330
|
return { 'ds' => dscontents, 'rfc822' => emailparts[1] }
|
331
|
-
end # END of
|
331
|
+
end # END of the decoder for the email message
|
332
332
|
|
333
333
|
end
|
334
334
|
def description; return 'Amazon SES(Sending): https://aws.amazon.com/ses/'; end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::AmazonWorkMail
|
3
|
-
# in the module are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::AmazonWorkMail decodes a bounce email which created by Amazon WorkMail https://aws.amazon.com/workmail/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module AmazonWorkMail
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -10,11 +10,11 @@ module Sisimai::Lhost
|
|
10
10
|
Boundaries = ['Content-Type: message/rfc822'].freeze
|
11
11
|
StartingOf = { message: ['Technical report:'] }.freeze
|
12
12
|
|
13
|
-
#
|
13
|
+
# @abstract Decodes the bounce message from Amazon WorkMail
|
14
14
|
# @param [Hash] mhead Message headers of a bounce email
|
15
15
|
# @param [String] mbody Message body of a bounce email
|
16
16
|
# @return [Hash] Bounce data list and message/rfc822 part
|
17
|
-
# @return [Nil] it failed to
|
17
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
18
18
|
def inquire(mhead, mbody)
|
19
19
|
# X-Mailer: Amazon WorkMail
|
20
20
|
# X-Original-Mailer: Amazon WorkMail
|
data/lib/sisimai/lhost/aol.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Aol
|
3
|
-
# called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Aol decodes a bounce email which created by Aol Mail https://mail.aol.com/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Aol
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -13,11 +13,11 @@ module Sisimai::Lhost
|
|
13
13
|
'notaccept' => ['type=MX: Malformed or unexpected name server reply'],
|
14
14
|
}.freeze
|
15
15
|
|
16
|
-
#
|
16
|
+
# @abstract Decodes the bounce message from Aol Mail
|
17
17
|
# @param [Hash] mhead Message headers of a bounce email
|
18
18
|
# @param [String] mbody Message body of a bounce email
|
19
19
|
# @return [Hash] Bounce data list and message/rfc822 part
|
20
|
-
# @return [Nil] it failed to
|
20
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
21
21
|
def inquire(mhead, mbody)
|
22
22
|
# X-AOL-IP: 192.0.2.135
|
23
23
|
# X-AOL-VSS-INFO: 5600.1067/98281
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::ApacheJames
|
3
|
-
# module are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::ApacheJames decodes a bounce email which created by ApacheJames https://james.apache.org/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module ApacheJames
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -15,11 +15,11 @@ module Sisimai::Lhost
|
|
15
15
|
error: ['Error message below:'],
|
16
16
|
}.freeze
|
17
17
|
|
18
|
-
#
|
18
|
+
# @abstract decodes the bounce message from Apache James
|
19
19
|
# @param [Hash] mhead Message headers of a bounce email
|
20
20
|
# @param [String] mbody Message body of a bounce email
|
21
21
|
# @return [Hash] Bounce data list and message/rfc822 part
|
22
|
-
# @return [Nil] it failed to
|
22
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
23
23
|
def inquire(mhead, mbody)
|
24
24
|
match = 0
|
25
25
|
match += 1 if mhead['subject'] == '[BOUNCE]'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Barracuda
|
3
|
-
# are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Barracuda decodes a bounce email which created by Barracuda https://www.barracuda.com/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Barracuda
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -9,11 +9,11 @@ module Sisimai::Lhost
|
|
9
9
|
Boundaries = ['Content-Type: text/rfc822-headers'].freeze
|
10
10
|
StartingOf = { message: ['Your message to:'] }.freeze
|
11
11
|
|
12
|
-
#
|
12
|
+
# @abstract Decodes the bounce message from Barracuda
|
13
13
|
# @param [Hash] mhead Message headers of a bounce email
|
14
14
|
# @param [String] mbody Message body of a bounce email
|
15
15
|
# @return [Hash] Bounce data list and message/rfc822 part
|
16
|
-
# @return [Nil] it failed to
|
16
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
17
17
|
# @since v4.25.6
|
18
18
|
def inquire(mhead, mbody)
|
19
19
|
# Subject: **Message you sent blocked by our bulk email filter**
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Bigfoot
|
3
|
-
# are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Bigfoot decodes a bounce email which created by Bigfoot https://www.bigfoot.com/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Bigfoot
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -9,11 +9,11 @@ module Sisimai::Lhost
|
|
9
9
|
Boundaries = ['Content-Type: message/partial'].freeze
|
10
10
|
MarkingsOf = { message: ' ----- Transcript of session follows -----' }.freeze
|
11
11
|
|
12
|
-
#
|
12
|
+
# @abstract Decodes the bounce message from Bigfoot
|
13
13
|
# @param [Hash] mhead Message headers of a bounce email
|
14
14
|
# @param [String] mbody Message body of a bounce email
|
15
15
|
# @return [Hash] Bounce data list and message/rfc822 part
|
16
|
-
# @return [Nil] it failed to
|
16
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
17
17
|
def inquire(mhead, mbody)
|
18
18
|
# :subject => %r/\AReturned mail: /,
|
19
19
|
match = 0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Biglobe
|
3
|
-
# are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Biglobe decodes a bounce email which created by BIGLOBE https://www.biglobe.ne.jp/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Biglobe
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -16,11 +16,11 @@ module Sisimai::Lhost
|
|
16
16
|
'mailboxfull' => ["The number of messages in recipient's mailbox exceeded the local limit."],
|
17
17
|
}.freeze
|
18
18
|
|
19
|
-
#
|
19
|
+
# @asbtract Decodes the bounce message from Biglobe
|
20
20
|
# @param [Hash] mhead Message headers of a bounce email
|
21
21
|
# @param [String] mbody Message body of a bounce email
|
22
22
|
# @return [Hash] Bounce data list and message/rfc822 part
|
23
|
-
# @return [Nil] it failed to
|
23
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
24
24
|
def inquire(mhead, mbody)
|
25
25
|
return nil unless mhead['from'].include?('postmaster@')
|
26
26
|
return nil unless %w[biglobe inacatv tmtv ttv].any? { |a| mhead['from'].include?('@' + a + '.ne.jp') }
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Courier
|
3
|
-
# are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Courier decodes a bounce email which created by Courier MTA https://www.courier-mta.org/.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Courier
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -23,11 +23,11 @@ module Sisimai::Lhost
|
|
23
23
|
'networkerror' => ['DNS lookup failed.'],
|
24
24
|
}.freeze
|
25
25
|
|
26
|
-
#
|
26
|
+
# @abstract Decodes the bounce message from Courier MTA
|
27
27
|
# @param [Hash] mhead Message headers of a bounce email
|
28
28
|
# @param [String] mbody Message body of a bounce email
|
29
29
|
# @return [Hash] Bounce data list and message/rfc822 part
|
30
|
-
# @return [Nil] it failed to
|
30
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
31
31
|
def inquire(mhead, mbody)
|
32
32
|
match = 0
|
33
33
|
match += 1 if mhead['from'].include?('Courier mail server at ')
|
data/lib/sisimai/lhost/domino.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sisimai::Lhost
|
2
|
-
# Sisimai::Lhost::Domino
|
3
|
-
# module are called from only Sisimai::Message.
|
2
|
+
# Sisimai::Lhost::Domino decodes a bounce email which created by HCL Domino https://www.hcl-software.com/domino.
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
4
4
|
module Domino
|
5
5
|
class << self
|
6
6
|
require 'sisimai/lhost'
|
@@ -20,11 +20,11 @@ module Sisimai::Lhost
|
|
20
20
|
'systemerror' => ['Several matches found in Domino Directory'],
|
21
21
|
}.freeze
|
22
22
|
|
23
|
-
#
|
23
|
+
# @abstract Decodes the bounce message from HCL Domino (formerly IBM Domino Server (formerly Lotus Domino))
|
24
24
|
# @param [Hash] mhead Message headers of a bounce email
|
25
25
|
# @param [String] mbody Message body of a bounce email
|
26
26
|
# @return [Hash] Bounce data list and message/rfc822 part
|
27
|
-
# @return [Nil] it failed to
|
27
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
28
28
|
def inquire(mhead, mbody)
|
29
29
|
return nil unless mhead['subject'].start_with?('DELIVERY FAILURE:', 'DELIVERY_FAILURE:')
|
30
30
|
|