sisimai 4.25.16 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -3
  3. data/ANALYTICAL-PRECISION +2 -2
  4. data/Benchmarks.mk +3 -3
  5. data/CONTRIBUTING +1 -1
  6. data/ChangeLog.md +424 -393
  7. data/Developers.mk +5 -6
  8. data/Gemfile +1 -1
  9. data/Makefile +15 -15
  10. data/README-JA.md +323 -149
  11. data/README.md +319 -148
  12. data/Rakefile +9 -3
  13. data/Repository.mk +2 -3
  14. data/lib/sisimai/address.rb +118 -74
  15. data/lib/sisimai/arf.rb +84 -82
  16. data/lib/sisimai/datetime.rb +5 -52
  17. data/lib/sisimai/{data → fact}/json.rb +7 -9
  18. data/lib/sisimai/fact/yaml.rb +31 -0
  19. data/lib/sisimai/fact.rb +468 -0
  20. data/lib/sisimai/lhost/activehunter.rb +12 -14
  21. data/lib/sisimai/lhost/amavis.rb +11 -14
  22. data/lib/sisimai/lhost/amazonses.rb +37 -41
  23. data/lib/sisimai/lhost/amazonworkmail.rb +15 -18
  24. data/lib/sisimai/lhost/aol.rb +12 -14
  25. data/lib/sisimai/lhost/apachejames.rb +19 -21
  26. data/lib/sisimai/lhost/barracuda.rb +10 -12
  27. data/lib/sisimai/lhost/bigfoot.rb +21 -21
  28. data/lib/sisimai/lhost/biglobe.rb +15 -16
  29. data/lib/sisimai/lhost/courier.rb +20 -20
  30. data/lib/sisimai/lhost/domino.rb +23 -19
  31. data/lib/sisimai/lhost/einsundeins.rb +23 -18
  32. data/lib/sisimai/lhost/exchange2003.rb +30 -29
  33. data/lib/sisimai/lhost/exchange2007.rb +70 -58
  34. data/lib/sisimai/lhost/exim.rb +175 -161
  35. data/lib/sisimai/lhost/ezweb.rb +31 -56
  36. data/lib/sisimai/lhost/facebook.rb +21 -33
  37. data/lib/sisimai/lhost/fml.rb +43 -48
  38. data/lib/sisimai/lhost/gmail.rb +29 -29
  39. data/lib/sisimai/lhost/gmx.rb +18 -17
  40. data/lib/sisimai/lhost/googlegroups.rb +9 -10
  41. data/lib/sisimai/lhost/gsuite.rb +21 -27
  42. data/lib/sisimai/lhost/imailserver.rb +25 -39
  43. data/lib/sisimai/lhost/interscanmss.rb +28 -31
  44. data/lib/sisimai/lhost/kddi.rb +22 -28
  45. data/lib/sisimai/lhost/mailfoundry.rb +11 -12
  46. data/lib/sisimai/lhost/mailmarshalsmtp.rb +25 -29
  47. data/lib/sisimai/lhost/mailru.rb +33 -27
  48. data/lib/sisimai/lhost/mcafee.rb +21 -31
  49. data/lib/sisimai/lhost/messagelabs.rb +17 -20
  50. data/lib/sisimai/lhost/messagingserver.rb +40 -37
  51. data/lib/sisimai/lhost/mfilter.rb +15 -16
  52. data/lib/sisimai/lhost/mxlogic.rb +24 -23
  53. data/lib/sisimai/lhost/notes.rb +17 -17
  54. data/lib/sisimai/lhost/office365.rb +63 -27
  55. data/lib/sisimai/lhost/opensmtpd.rb +12 -13
  56. data/lib/sisimai/lhost/outlook.rb +12 -15
  57. data/lib/sisimai/lhost/postfix.rb +179 -129
  58. data/lib/sisimai/lhost/powermta.rb +12 -14
  59. data/lib/sisimai/lhost/qmail.rb +44 -47
  60. data/lib/sisimai/lhost/receivingses.rb +15 -20
  61. data/lib/sisimai/lhost/sendgrid.rb +34 -32
  62. data/lib/sisimai/lhost/sendmail.rb +66 -53
  63. data/lib/sisimai/lhost/surfcontrol.rb +19 -19
  64. data/lib/sisimai/lhost/v5sendmail.rb +45 -39
  65. data/lib/sisimai/lhost/verizon.rb +35 -39
  66. data/lib/sisimai/lhost/x1.rb +18 -17
  67. data/lib/sisimai/lhost/x2.rb +17 -14
  68. data/lib/sisimai/lhost/x3.rb +19 -19
  69. data/lib/sisimai/lhost/x4.rb +72 -57
  70. data/lib/sisimai/lhost/x5.rb +17 -19
  71. data/lib/sisimai/lhost/x6.rb +41 -17
  72. data/lib/sisimai/lhost/yahoo.rb +17 -16
  73. data/lib/sisimai/lhost/yandex.rb +16 -20
  74. data/lib/sisimai/lhost/zoho.rb +16 -15
  75. data/lib/sisimai/lhost.rb +8 -10
  76. data/lib/sisimai/mail/maildir.rb +1 -3
  77. data/lib/sisimai/mail/mbox.rb +3 -4
  78. data/lib/sisimai/mail/memory.rb +0 -1
  79. data/lib/sisimai/mail/stdin.rb +1 -3
  80. data/lib/sisimai/mail.rb +3 -7
  81. data/lib/sisimai/mda.rb +28 -42
  82. data/lib/sisimai/message.rb +435 -326
  83. data/lib/sisimai/order.rb +5 -5
  84. data/lib/sisimai/reason/authfailure.rb +64 -0
  85. data/lib/sisimai/reason/badreputation.rb +53 -0
  86. data/lib/sisimai/reason/blocked.rb +94 -160
  87. data/lib/sisimai/reason/contenterror.rb +8 -9
  88. data/lib/sisimai/reason/delivered.rb +4 -6
  89. data/lib/sisimai/reason/exceedlimit.rb +10 -12
  90. data/lib/sisimai/reason/expired.rb +6 -8
  91. data/lib/sisimai/reason/feedback.rb +2 -3
  92. data/lib/sisimai/reason/filtered.rb +17 -19
  93. data/lib/sisimai/reason/hasmoved.rb +9 -10
  94. data/lib/sisimai/reason/hostunknown.rb +15 -15
  95. data/lib/sisimai/reason/mailboxfull.rb +10 -12
  96. data/lib/sisimai/reason/mailererror.rb +18 -20
  97. data/lib/sisimai/reason/mesgtoobig.rb +9 -11
  98. data/lib/sisimai/reason/networkerror.rb +5 -8
  99. data/lib/sisimai/reason/norelaying.rb +8 -11
  100. data/lib/sisimai/reason/notaccept.rb +13 -14
  101. data/lib/sisimai/reason/notcompliantrfc.rb +43 -0
  102. data/lib/sisimai/reason/onhold.rb +6 -9
  103. data/lib/sisimai/reason/policyviolation.rb +14 -12
  104. data/lib/sisimai/reason/rejected.rb +26 -24
  105. data/lib/sisimai/reason/requireptr.rb +69 -0
  106. data/lib/sisimai/reason/securityerror.rb +33 -36
  107. data/lib/sisimai/reason/spamdetected.rb +114 -147
  108. data/lib/sisimai/reason/speeding.rb +49 -0
  109. data/lib/sisimai/reason/suspend.rb +11 -11
  110. data/lib/sisimai/reason/syntaxerror.rb +11 -10
  111. data/lib/sisimai/reason/systemerror.rb +7 -9
  112. data/lib/sisimai/reason/systemfull.rb +7 -8
  113. data/lib/sisimai/reason/toomanyconn.rb +9 -11
  114. data/lib/sisimai/reason/undefined.rb +2 -3
  115. data/lib/sisimai/reason/userunknown.rb +129 -146
  116. data/lib/sisimai/reason/vacation.rb +3 -4
  117. data/lib/sisimai/reason/virusdetected.rb +10 -11
  118. data/lib/sisimai/reason.rb +59 -64
  119. data/lib/sisimai/rfc1894.rb +55 -28
  120. data/lib/sisimai/rfc2045.rb +373 -0
  121. data/lib/sisimai/rfc3464.rb +250 -308
  122. data/lib/sisimai/rfc3834.rb +42 -45
  123. data/lib/sisimai/rfc5322.rb +75 -100
  124. data/lib/sisimai/rfc5965.rb +31 -0
  125. data/lib/sisimai/rhost/cox.rb +5 -6
  126. data/lib/sisimai/rhost/franceptt.rb +6 -8
  127. data/lib/sisimai/rhost/godaddy.rb +12 -12
  128. data/lib/sisimai/rhost/google.rb +530 -0
  129. data/lib/sisimai/rhost/iua.rb +9 -10
  130. data/lib/sisimai/rhost/kddi.rb +6 -8
  131. data/lib/sisimai/rhost/{exchangeonline.rb → microsoft.rb} +115 -114
  132. data/lib/sisimai/rhost/mimecast.rb +42 -40
  133. data/lib/sisimai/rhost/nttdocomo.rb +12 -12
  134. data/lib/sisimai/rhost/spectrum.rb +10 -12
  135. data/lib/sisimai/rhost/{tencentqq.rb → tencent.rb} +7 -8
  136. data/lib/sisimai/rhost.rb +23 -31
  137. data/lib/sisimai/smtp/command.rb +59 -0
  138. data/lib/sisimai/smtp/error.rb +4 -7
  139. data/lib/sisimai/smtp/reply.rb +161 -74
  140. data/lib/sisimai/smtp/status.rb +507 -393
  141. data/lib/sisimai/smtp/transcript.rb +124 -0
  142. data/lib/sisimai/smtp.rb +0 -1
  143. data/lib/sisimai/string.rb +74 -5
  144. data/lib/sisimai/time.rb +1 -2
  145. data/lib/sisimai/version.rb +1 -1
  146. data/lib/sisimai.rb +46 -31
  147. data/set-of-emails/maildir/bsd/lhost-domino-02.eml +6 -3
  148. data/set-of-emails/maildir/bsd/lhost-googlegroups-15.eml +174 -0
  149. data/set-of-emails/maildir/bsd/lhost-gsuite-15.eml +229 -0
  150. data/set-of-emails/maildir/bsd/lhost-postfix-75.eml +51 -0
  151. data/set-of-emails/maildir/bsd/lhost-postfix-76.eml +101 -0
  152. data/set-of-emails/maildir/bsd/lhost-postfix-77.eml +74 -0
  153. data/set-of-emails/maildir/bsd/lhost-postfix-78.eml +91 -0
  154. data/set-of-emails/maildir/bsd/lhost-receivingses-08.eml +88 -0
  155. data/set-of-emails/maildir/bsd/rfc3464-43.eml +88 -0
  156. data/set-of-emails/maildir/bsd/rhost-google-03.eml +101 -0
  157. data/set-of-emails/maildir/bsd/rhost-google-04.eml +102 -0
  158. data/set-of-emails/maildir/bsd/rhost-google-05.eml +82 -0
  159. data/set-of-emails/maildir/bsd/rhost-google-06.eml +102 -0
  160. data/set-of-emails/maildir/bsd/rhost-google-07.eml +69 -0
  161. data/set-of-emails/maildir/bsd/rhost-google-08.eml +99 -0
  162. data/sisimai-java.gemspec +1 -1
  163. data/sisimai.gemspec +1 -1
  164. metadata +41 -20
  165. data/.rspec +0 -2
  166. data/lib/sisimai/data/yaml.rb +0 -33
  167. data/lib/sisimai/data.rb +0 -411
  168. data/lib/sisimai/mime.rb +0 -456
  169. data/lib/sisimai/rhost/googleapps.rb +0 -261
  170. /data/set-of-emails/maildir/bsd/{rfc3464-41.eml → rfc3834-05.eml} +0 -0
  171. /data/set-of-emails/maildir/bsd/{rhost-googleapps-01.eml → rhost-google-01.eml} +0 -0
  172. /data/set-of-emails/maildir/bsd/{rhost-googleapps-02.eml → rhost-google-02.eml} +0 -0
  173. /data/set-of-emails/maildir/bsd/{rhost-exchangeonline-01.eml → rhost-microsoft-01.eml} +0 -0
  174. /data/set-of-emails/maildir/bsd/{rhost-exchangeonline-02.eml → rhost-microsoft-02.eml} +0 -0
  175. /data/set-of-emails/maildir/bsd/{rhost-exchangeonline-03.eml → rhost-microsoft-03.eml} +0 -0
  176. /data/set-of-emails/maildir/bsd/{rhost-tencentqq-01.eml → rhost-tencent-01.eml} +0 -0
  177. /data/set-of-emails/maildir/bsd/{rhost-tencentqq-02.eml → rhost-tencent-02.eml} +0 -0
  178. /data/set-of-emails/maildir/bsd/{rhost-tencentqq-03.eml → rhost-tencent-03.eml} +0 -0
data/README-JA.md CHANGED
@@ -1,15 +1,26 @@
1
1
  ![](https://libsisimai.org/static/images/logo/sisimai-x01.png)
2
-
3
2
  [![License](https://img.shields.io/badge/license-BSD%202--Clause-orange.svg)](https://github.com/sisimai/rb-sisimai/blob/master/LICENSE)
4
3
  [![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
- [![Ruby](https://img.shields.io/badge/ruby-v2.1.0--v2.6.0-red.svg)](https://www.ruby-lang.org/)
4
+ [![Ruby](https://img.shields.io/badge/ruby-v2.4.0--v3.3.0-red.svg)](https://www.ruby-lang.org/)
8
5
  [![Gem Version](https://badge.fury.io/rb/sisimai.svg)](https://badge.fury.io/rb/sisimai)
9
6
 
7
+ > [!IMPORTANT]
8
+ > **2024年2月2日の時点でこのリポジトリのデフォルトブランチは[5-stable](https://github.com/sisimai/rb-sisimai/tree/5-stable)
9
+ > (Sisimai 5)になりました。** もし古いバージョンを使いたい場合は[4-stable](https://github.com/sisimai/rb-sisimai/tree/4-stable)[^1]
10
+ > ブランチを見てください。また`main`や`master`ブランチはもうこのリポジトリでは使用していません。
11
+ [^1]: 4系を`clone`する場合は`git clone -b 4-stable https://github.com/sisimai/rb-sisimai.git`
12
+
13
+ > [!WARNING]
14
+ > Sisimai 5はRuby 2.4以上が必要です。インストール/アップグレードを実行する前に`ruby -v`コマンドで
15
+ > システムに入っているRubyのバージョンを確認してください。
16
+
17
+ > [!NOTE]
18
+ > SisimaiはPerlモジュールまたはRuby Gemですが、PHPやPython、GoやRustなどJSONを読める言語であれば
19
+ > どのような環境においても解析結果を得ることでバウンスの発生状況を捉えるのにとても有用です。
20
+
10
21
  - [**README(English)**](README.md)
11
22
  - [シシマイ? | What is Sisimai](#what-is-sisimai)
12
- - [主な特徴的機能 | Key features](#key-features)
23
+ - [主な特徴的機能 | The key features](#the-key-features-of-sisimai)
13
24
  - [コマンドラインでのデモ | Command line demo](#command-line-demo)
14
25
  - [シシマイを使う準備 | Setting Up Sisimai](#setting-up-sisimai)
15
26
  - [動作環境 | System requirements](#system-requirements)
@@ -22,12 +33,14 @@
22
33
  - [コールバック機能 | Callback feature](#callback-feature)
23
34
  - [ワンライナー | One-Liner](#one-liner)
24
35
  - [出力例 | Output example](#output-example)
25
- - [シシマイの仕様 | Sisimai Specification](#sisimai-specification)
26
- - [Ruby版とPerl版の違い | Differences between Ruby version and Perl version](#differences-between-ruby-version-and-perl-version)
27
- - [その他の仕様詳細 | Other specification of Sisimai](#other-specification-of-sisimai)
36
+ - [Sisimai 4とSisimai 5の違い](#differences-between-sisimai-4-and-sisimai-5)
37
+ - [機能など](#features)
38
+ - [解析メソッド](#decoding-methods)
39
+ - [MTA/ESPモジュール](#mtaesp-module-names)
40
+ - [バウンス理由](#bounce-reasons)
28
41
  - [Contributing](#contributing)
29
42
  - [バグ報告 | Bug report](#bug-report)
30
- - [解析できないメール | Emails could not be parsed](#emails-could-not-be-parsed)
43
+ - [解析できないメール | Emails could not be decoded](#emails-could-not-be-decoded)
31
44
  - [その他の情報 | Other Information](#other-information)
32
45
  - [関連サイト | Related sites](#related-sites)
33
46
  - [参考情報| See also](#see-also)
@@ -36,224 +49,385 @@
36
49
  - [ライセンス | License](#license)
37
50
 
38
51
  What is Sisimai
39
- ===============================================================================
40
- Sisimai(シシマイ)はRFC5322準拠のエラーメールを解析し、解析結果をデータ構造に
41
- 変換するインターフェイスを提供するRubyライブラリです。
42
- [github.com/sisimai/p5-sisimai](https://github.com/sisimai/p5-sisimai/)
43
- で公開しているPerl版シシマイから移植しました。
44
-
45
- ![](https://libsisimai.org/static/images/figure/sisimai-overview-1.png)
46
-
47
- Key features
48
- -------------------------------------------------------------------------------
49
- * __エラーメールをデータ構造に変換__
50
- * Rubyのデータ形式(HashとArray)とJSON(String)に対応
51
- * __インストールも使用も簡単__
52
- * gem install
53
- * git clone & make
54
- * __高い解析精度__
55
- * 解析精度はbounceHammerの2倍
56
- * 68種類のMTA/MDA/ESPに対応
57
- * Feedback Loopにも対応
58
- * 29種類のエラー理由を検出
52
+ ===================================================================================================
53
+ Sisimai(シシマイ)は複雑で多種多様なバウンスメールを解析してバウンスした理由や宛先メールアドレスなど
54
+ 配信が失敗した結果を構造化データで出力するライブラリでJSONでの出力も可能です。Ruby版シシマイは
55
+ [github.com/sisimai/p5-sisimai](https://github.com/sisimai/p5-sisimai/)で公開しているPerl版シシマイ
56
+ から移植しました。
57
+
58
+ ![](https://libsisimai.org/static/images/figure/sisimai-overview-2.png)
59
+
60
+ The key features of Sisimai
61
+ ---------------------------------------------------------------------------------------------------
62
+ * __バウンスメールを構造化したデータに変換__
63
+ * 以下24項目の情報を含むデータ構造[^2]
64
+ * __基本的情報__: `timestamp`, `origin`
65
+ * __発信者情報__: `addresser`, `senderdomain`,
66
+ * __受信者情報__: `recipient`, `destination`, `alias`
67
+ * __配信の情報__: `action`, `replycode`,`action`, `replycode`, `deliverystatus`
68
+ * __エラー情報__: `reason`, `diagnosticcode`, `diagnostictype`, `feedbacktype`, `hardbounce`
69
+ * __メール情報__: `subject`, `messageid`, `listid`,
70
+ * __その他情報__: `smtpagent`, `timezoneoffset`, `lhost`, `rhost`, `token`, `catch`
71
+ * __出力可能な形式__
72
+ * Ruby (Hash, Array)
73
+ * JSON
74
+ * ([`oj`](https://rubygems.org/gems/oj)を使用(CRuby))
75
+ * ([`jrjackson`](https://rubygems.org/gems/jrjackson)を使用(JRuby))
76
+ * YAML ([`yaml`](https://rubygems.org/gems/yaml)が必要)
77
+ * __インストールも使用も簡単__
78
+ * `gem install`
79
+ * `git clone && make`
80
+ * __高い解析精度__
81
+ * [70種類のMTAs/MDAs/ESPs](https://libsisimai.org/en/engine/)に対応
82
+ * Feedback Loop(ARF)にも対応
83
+ * [34種類のバウンス理由](https://libsisimai.org/en/reason/)を検出
84
+
85
+ [^2]: コールバック機能を使用すると`catch`アクセサの下に独自のデータを追加できます
86
+
87
+
88
+ Command line demo
89
+ ---------------------------------------------------------------------------------------------------
90
+ 次の画像のように、Ruby版シシマイ(rb-sisimai)はコマンドラインから簡単にバウンスメールを解析すること
91
+ ができます。
92
+ ![](https://libsisimai.org/static/images/demo/sisimai-5-cli-dump-r01.gif)
59
93
 
60
- Setting Up Sisimai
61
- ===============================================================================
62
94
 
95
+ Setting Up Sisimai
96
+ ===================================================================================================
63
97
  System requirements
64
- -------------------------------------------------------------------------------
65
- Sisimaiの動作環境についての詳細は
66
- [Sisimai | シシマイを使ってみる](https://libsisimai.org/ja/start/)をご覧ください。
98
+ ---------------------------------------------------------------------------------------------------
99
+ Sisimaiの動作環境についての詳細は[Sisimai | シシマイを使ってみる](https://libsisimai.org/ja/start/)
100
+ をご覧ください。
67
101
 
68
102
 
69
- * [Ruby 2.1.0 or later](http://www.ruby-lang.org/)
70
- * [__Oj | The fastest JSON parser and object serializer__](https://rubygems.org/gems/oj)
71
- * Also works on [JRuby 9.0.4.0 or later](http://jruby.org)
72
- * [__JrJackson | A mostly native JRuby wrapper for the java jackson json processor jar__](https://rubygems.org/gems/jrjackson)
103
+ * [Ruby 2.4.0 or later](http://www.ruby-lang.org/)
104
+ * [__oj | The fastest JSON parser and object serializer__](https://rubygems.org/gems/oj)
105
+ * Also works on [JRuby 9.0.4.0 - 9.1.17.0](http://jruby.org)
106
+ * [__jrjackson | A mostly native JRuby wrapper for the java jackson json processor jar__](https://rubygems.org/gems/jrjackson)
73
107
 
74
108
  Install
75
- -------------------------------------------------------------------------------
109
+ ---------------------------------------------------------------------------------------------------
76
110
  ### From RubyGems.org
77
-
78
111
  ```shell
79
112
  $ sudo gem install sisimai
80
- Fetching: sisimai-4.25.5.gem (100%)
81
- Successfully installed sisimai-4.25.5
82
- Parsing documentation for sisimai-4.25.5
83
- Installing ri documentation for sisimai-4.25.5
113
+ Fetching: sisimai-5.0.1.gem (100%)
114
+ Successfully installed sisimai-5.0.1
115
+ Parsing documentation for sisimai-5.0.1
116
+ Installing ri documentation for sisimai-5.0.1
84
117
  Done installing documentation for sisimai after 6 seconds
85
118
  1 gem installed
86
119
  ```
87
120
 
88
121
  ### From GitHub
122
+ > [!WARNING]
123
+ > Sisimai 5はRuby 2.4以上が必要です。インストール/アップグレードを実行する前に`ruby -v`コマンドで
124
+ > システムに入っているRubyのバージョンを確認してください。
89
125
 
90
126
  ```shell
127
+ % ruby -v
128
+ ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin21]
129
+
91
130
  $ cd /usr/local/src
92
131
  $ git clone https://github.com/sisimai/rb-sisimai.git
132
+
93
133
  $ cd ./rb-sisimai
94
134
  $ sudo make depend install-from-local
95
- gem install bundle rake rspec coveralls
135
+ gem install bundle rake minitest
136
+ ...
137
+ 3 gems installed
138
+ if [ -d "/usr/local/jr" ]; then \
139
+ PATH="/usr/local/jr/bin:$PATH" /usr/local/jr/bin/gem install bundle rake minitest; \
140
+ fi
96
141
  ...
97
- 4 gems installed
98
- bundle exec rake install
99
- sisimai 4.25.5 built to pkg/sisimai-4.25.5.gem.
100
- sisimai (4.25.5) installed.
142
+ 3 gems installed
143
+ /opt/local/bin/rake install
144
+ sisimai 5.0.0 built to pkg/sisimai-5.0.0.gem.
145
+ sisimai (5.0.0) installed.
146
+ if [ -d "/usr/local/jr" ]; then \
147
+ PATH="/usr/local/jr/bin:$PATH" /usr/local/jr/bin/rake install; \
148
+ fi
149
+ sisimai 5.0.0 built to pkg/sisimai-5.0.0-java.gem.
150
+ sisimai (5.0.0) installed.
101
151
  ```
102
152
 
103
153
  Usage
104
154
  ======
105
-
106
155
  Basic usage
107
- -------------------------------------------------------------------------------
108
- 下記のようにSisimaiの`make()`メソッドをmboxかMaildirのPATHを引数にして実行すると
109
- 解析結果が配列で返ってきます。v4.25.6から元データとなった電子メールファイルへの
110
- PATHを保持する`origin`が利用できます。
156
+ ---------------------------------------------------------------------------------------------------
157
+ 下記のようにSisimaiの`rise()`メソッドをmboxかMaildirのPATHを引数にして実行すると解析結果が配列で
158
+ 返ってきます。v4.25.6から元データとなった電子メールファイルへのPATHを保持する`origin`が利用できます。
111
159
 
112
160
  ```ruby
113
161
  #! /usr/bin/env ruby
114
162
  require 'sisimai'
115
- v = Sisimai.make('/path/to/mbox') # or path to Maildir/
163
+ v = Sisimai.rise('/path/to/mbox') # またはMaildir/へのPATH
164
+
165
+ # v4.23.0からSisimaiクラスのrise()メソッドとdump()メソッドはPATH以外にもバウンスメール全体を文字列
166
+ # として読めるようになりました
167
+ f = File.open('/path/to/mbox', 'r'); # またはMaildir/へのPATH
168
+ v = Sisimai.rise(f.read)
116
169
 
117
- # Beginning with v4.23.0, both make() and dump() method of Sisimai class can
118
- # read bounce messages from variable instead of a path to mailbox
119
- f = File.open('/path/to/mbox', 'r'); # or path to Maildir/
120
- v = Sisimai.make(f.read)
170
+ # もし"delivered"(配信成功)となる解析結果も必要な場合は以下に示すとおりrise()メソッドに"delivered"
171
+ # オプションを指定してください
172
+ v = Sisimai.rise('/path/to/mbox', delivered: true)
121
173
 
122
- # If you want to get bounce records which reason is "delivered", set "delivered"
123
- # option to make() method like the following:
124
- v = Sisimai.make('/path/to/mbox', delivered: true)
174
+ # v5.0.0からSisimaiはバウンス理由が"vacation"となる解析結果をデフォルトで返さなくなりました。もし
175
+ # "vacation"となる解析結果も必要な場合は次のコードで示すようにrise()メソッドに"vacation"オプション
176
+ # を指定してください。
177
+ v = Sisimai.rise('/path/to/mbox', vacation: true);
125
178
 
126
179
  if v.is_a? Array
127
180
  v.each do |e|
128
- puts e.class # Sisimai::Data
181
+ puts e.class # Sisimai::Fact
129
182
  puts e.recipient.class # Sisimai::Address
130
183
  puts e.timestamp.class # Sisimai::Time
131
184
 
132
- puts e.addresser.address # shironeko@example.org # From
133
- puts e.recipient.address # kijitora@example.jp # To
134
- puts e.recipient.host # example.jp
135
- puts e.deliverystatus # 5.1.1
136
- puts e.replycode # 550
137
- puts e.reason # userunknown
138
- puts e.origin # /var/spool/bounce/Maildir/new/1740074341.eml
139
-
140
- h = e.damn # Convert to HASH
141
- j = e.dump('json') # Convert to JSON string
142
- puts e.dump('json') # JSON formatted bounce data
185
+ puts e.addresser.address # "michitsuna@example.org" # From
186
+ puts e.recipient.address # "kijitora@example.jp" # To
187
+ puts e.recipient.host # "example.jp"
188
+ puts e.deliverystatus # "5.1.1"
189
+ puts e.replycode # "550"
190
+ puts e.reason # "userunknown"
191
+ puts e.origin # "/var/spool/bounce/Maildir/new/1740074341.eml"
192
+ puts e.hardbounce # true
193
+
194
+ h = e.damn # Hashに変換
195
+ j = e.dump('json') # JSON(文字列)に変換
196
+ puts e.dump('json') # JSON化したバウンスメールの解析結果を表示
143
197
  end
144
198
  end
145
199
  ```
146
200
 
147
201
  Convert to JSON
148
- -------------------------------------------------------------------------------
149
- 下記のようにSisimaiの`dump()`メソッドをmboxかMaildirのPATHを引数にして実行すると
150
- 解析結果が文字列(JSON)で返ってきます。
202
+ ---------------------------------------------------------------------------------------------------
203
+ 下記のようにSisimaiの`dump()`メソッドをmboxかMaildirのPATHを引数にして実行すると解析結果が文字列
204
+ (JSON)で返ってきます。
151
205
 
152
206
  ```ruby
153
- # Get JSON string from parsed mailbox or Maildir/
154
- puts Sisimai.dump('/path/to/mbox') # or path to Maildir/
207
+ # メールボックスまたはMaildir/から解析した結果をJSONにする
208
+ puts Sisimai.dump('/path/to/mbox') # またはMaildir/へのPATH
155
209
 
156
- # dump() method also accepts "delivered" option like the following code:
157
- puts Sisimai.dump('/path/to/mbox', delivered: true)
210
+ # dump()メソッドは"delivered"オプションや"vacation"オプションも指定可能
211
+ puts Sisimai.dump('/path/to/mbox', delivered: true, vacation: true)
158
212
  ```
159
213
 
160
214
  Callback feature
161
- -------------------------------------------------------------------------------
162
- Sisimai 4.19.0から`Sisimai.make()`と`Sisimai.dump()`にLamda(Procオブジェクト)
163
- を引数`hook`に指定できるコールバック機能が実装されました。
164
- `hook`に指定したコードによって処理された結果は`Sisimai::Data.catch`
165
- メソッドで得ることができます。
215
+ ---------------------------------------------------------------------------------------------------
216
+ `Sisimai.rise`と`Sisimai.dump`の`:c___`引数(`c`と`_`が三個/魚用の釣り針に見える)はコールバック機能
217
+ で呼び出される`Proc`オブジェクトを保持する配列です。`:c___`の1番目の要素には`Sisimai::Message.sift`
218
+ で呼び出される`Proc`オブジェクトでメールヘッダと本文に対して行う処理を、2番目の要素には、解析対象の
219
+ メールファイルに対して行う処理をそれぞれ入れます。
220
+
221
+ 各Procオブジェクトで処理した結果は`Sisimai::Fact.catch`を通して得られます。
222
+
223
+ ### [0] メールヘッダと本文に対して
224
+ `:c___`に渡す配列の最初の要素に入れたProcオブジェクトは`Sisimai::Message->parse()`で呼び出されます。
166
225
 
167
226
  ```ruby
168
227
  #! /usr/bin/env ruby
169
228
  require 'sisimai'
170
- callbackto = lambda do |v|
171
- r = { 'x-mailer' => '', 'queue-id' => '' }
229
+ code = lambda do |args|
230
+ head = args['headers'] # (*Hash) メールヘッダー
231
+ body = args['message'] # (String) メールの本文
232
+ adds = { 'x-mailer' => '', 'queue-id' => '' }
172
233
 
173
- if cv = v['message'].match(/^X-Postfix-Queue-ID:\s*(.+)$/)
174
- r['queue-id'] = cv[1]
234
+ if cv = body.match(/^X-Postfix-Queue-ID:\s*(.+)$/)
235
+ adds['queue-id'] = cv[1]
175
236
  end
176
- r['x-mailer'] = v['headers']['x-mailer'] || ''
177
- return r
237
+ r['x-mailer'] = head['x-mailer'] || ''
238
+ return adds
178
239
  end
179
240
 
180
- data = Sisimai.make('/path/to/mbox', hook: callbackto)
181
- json = Sisimai.dump('/path/to/mbox', hook: callbackto)
241
+ data = Sisimai.rise('/path/to/mbox', c___: [code, nil])
242
+ json = Sisimai.dump('/path/to/mbox', c___: [code, nil])
182
243
 
183
- puts data[0].catch['x-mailer'] # Apple Mail (2.1283)
244
+ puts data[0].catch['x-mailer'] # "Apple Mail (2.1283)"
245
+ puts data[0].catch['queue-id'] # "43f4KX6WR7z1xcMG"
184
246
  ```
185
247
 
186
- コールバック機能のより詳細な使い方は
187
- [Sisimai | 解析方法 - コールバック機能](https://libsisimai.org/ja/usage/#callback)
188
- をご覧ください。
248
+ ### 各メールのファイルに対して
249
+ `Sisimai.rise`と`Sisimai.dump`の両メソッドに渡せる引数`:c___`(配列)の2番目に入れた`Proc`オブジェクト
250
+ は解析したメールのファイルごとに呼び出されます。
189
251
 
252
+ ```ruby
253
+ path = '/path/to/maildir'
254
+ code = lambda do |args|
255
+ kind = args['kind'] # (String) Sisimai::Mail.kind
256
+ mail = args['mail'] # (String) Entire email message
257
+ path = args['path'] # (String) Sisimai::Mail.path
258
+ fact = args['fact'] # (Array) List of Sisimai::Fact
259
+
260
+ fact.each do |e|
261
+ # "catch"アクセサの中に独自の情報を保存する
262
+ e.catch ||= {}
263
+ e.catch['size'] = mail.size
264
+ e.catch['kind'] = kind.capitalize
265
+
266
+ if cv = mail.match(/^Return-Path: (.+)$/)
267
+ # Return-Path: <MAILER-DAEMON>
268
+ e.catch['return-path'] = cv[1]
269
+ end
270
+ e.catch['parsedat'] = Time.new.localtime.to_s
271
+
272
+ # "X-Sisimai-Parsed:"ヘッダーを追加して別のPATHに元メールを保存する
273
+ a = sprintf("X-Sisimai-Parsed: %d", fact.size)
274
+ p = sprintf("/path/to/another/directory/sisimai-%s.eml", e.token)
275
+ v = mail.sub(/^(From:.+?)$/, '\1' + "\n" + a)
276
+ f = File.open(p, 'w:UTF-8')
277
+ f.write(v)
278
+ f.close
279
+
280
+ # 解析が終わったらMaildir/にあるファイルを削除する
281
+ File.delete(path) if kind == 'maildir'
282
+
283
+ # 特に何か値をReturnする必要はない
284
+ end
285
+ end
190
286
 
191
- One-Liner
192
- -------------------------------------------------------------------------------
287
+ list = Sisimai.rise(path, c___: [nil, code])
193
288
 
289
+ puts list[0].catch['size'] # 2202
290
+ puts list[0].catch['kind'] # "Maildir"
291
+ puts list[0].catch['return-path'] # "<MAILER-DAEMON>"
292
+ ```
293
+
294
+ コールバック機能のより詳細な使い方は
295
+ [Sisimai | 解析方法 - コールバック機能](https://libsisimai.org/ja/usage/#callback)をご覧ください。
296
+
297
+ One-Liner
298
+ ---------------------------------------------------------------------------------------------------
194
299
  ```shell
195
300
  $ ruby -rsisimai -e 'puts Sisimai.dump($*.shift)' /path/to/mbox
196
301
  ```
197
302
 
198
303
  Output example
199
- -------------------------------------------------------------------------------
200
- ![](https://libsisimai.org/static/images/demo/sisimai-dump-02.gif)
304
+ ---------------------------------------------------------------------------------------------------
305
+ ![](https://libsisimai.org/static/images/demo/sisimai-5-cli-dump-r01.gif)
201
306
 
202
307
  ```json
203
- [{"catch":{"x-mailer":"","return-path":"neko@example.com"},"token":"7e81d3b9306fc7a7f3fb4c7b705189d6806d3d6b","lhost":"omls-1.kuins.neko.example.jp","rhost":"nekonyaan0022.apcprd01.prod.exchangelabs.com","alias":"","listid":"","reason":"userunknown","action":"failed","origin":"set-of-emails/maildir/bsd/lhost-office365-13.eml","subject":"にゃーん","messageid":"","replycode":"550","smtpagent":"Office365","softbounce":0,"smtpcommand":"","destination":"neko.kyoto.example.jp","senderdomain":"example.com","feedbacktype":"","diagnosticcode":"Error Details Reported error: 550 5.1.10 RESOLVER.ADR.RecipientNotFound; Recipient not found by SMTP address lookup DSN generated by: NEKONYAAN0022.apcprd01.prod.exchangelabs.com","diagnostictype":"","deliverystatus":"5.1.10","timezoneoffset":"+0000","addresser":"neko@example.com","recipient":"kijitora-nyaan@neko.kyoto.example.jp","timestamp":1493508885}]
308
+ [
309
+ {
310
+ "destination": "google.example.com",
311
+ "lhost": "gmail-smtp-in.l.google.com",
312
+ "hardbounce": 0,
313
+ "reason": "authfailure",
314
+ "catch": null,
315
+ "addresser": "michitsuna@example.jp",
316
+ "alias": "nekochan@example.co.jp",
317
+ "smtpagent": "Postfix",
318
+ "smtpcommand": "DATA",
319
+ "senderdomain": "example.jp",
320
+ "listid": "",
321
+ "action": "failed",
322
+ "feedbacktype": "",
323
+ "messageid": "hwK7pzjzJtz0RF9Y@relay3.example.com",
324
+ "origin": "./gmail-5.7.26.eml",
325
+ "recipient": "kijitora@google.example.com",
326
+ "rhost": "gmail-smtp-in.l.google.com",
327
+ "subject": "Nyaan",
328
+ "timezoneoffset": "+0900",
329
+ "replycode": 550,
330
+ "token": "84656774898baa90660be3e12fe0526e108d4473",
331
+ "diagnostictype": "SMTP",
332
+ "timestamp": 1650119685,
333
+ "diagnosticcode": "host gmail-smtp-in.l.google.com[64.233.187.27] said: This mail has been blocked because the sender is unauthenticated. Gmail requires all senders to authenticate with either SPF or DKIM. Authentication results: DKIM = did not pass SPF [relay3.example.com] with ip: [192.0.2.22] = did not pass For instructions on setting up authentication, go to https://support.google.com/mail/answer/81126#authentication c2-202200202020202020222222cat.127 - gsmtp (in reply to end of DATA command)",
334
+ "deliverystatus": "5.7.26"
335
+ }
336
+ ]
204
337
  ```
205
338
 
206
- Sisimai Specification
207
- ===============================================================================
208
-
209
- Differences between Ruby version and Perl version
210
- -------------------------------------------------------------------------------
211
- 公開中のPerl版Sisimai(p5-sisimai)とRuby版Sisimai(rb-sisimai)は下記のような違いが
212
- あります。bounceHammer 2.7.13p3とSisimai(シシマイ)の違いについては
213
- [Sisimai | 違いの一覧](https://libsisimai.org/ja/diff/)をご覧ください。
214
-
215
- | 機能 | Ruby version | Perl version |
216
- |---------------------------------------------|----------------|---------------|
217
- | 動作環境 | Ruby 2.1 - 2.6 | Perl 5.10 - |
218
- | | JRuby 9.0.4.0- | |
219
- | 解析精度の割合(2000通のメール)[1] | 1.00 | 1.00 |
220
- | メール解析速度(1000通のメール) | 2.22秒[2] | 1.35秒 |
221
- | インストール方法 | gem install | cpanm, cpm |
222
- | 依存モジュール数(コアモジュールを除く) | 1モジュール | 2モジュール |
223
- | LOC:ソースコードの行数 | 10600行 | 10800行 |
224
- | テスト件数(spec/,t/,xt/ディレクトリ) | 241000件 | 270000件 |
225
- | ライセンス | 二条項BSD | 二条項BSD |
226
- | 開発会社によるサポート契約 | 提供中 | 提供中 |
227
-
228
- 1. [./ANALYTICAL-PRECISION](https://github.com/sisimai/rb-sisimai/blob/master/ANALYTICAL-PRECISION)を参照
229
- 2. Xeon E5-2640 2.5GHz x 2 cores | 5000 bogomips | 1GB RAM | Ruby 2.3.4p301
230
-
231
- Other spec of Sisimai
232
- -------------------------------------------------------------------------------
233
- - [**解析モジュールの一覧**](https://libsisimai.org/ja/engine/)
234
- - [**バウンス理由の一覧**](https://libsisimai.org/ja/reason/)
235
- - [**Sisimai::Dataのデータ構造**](https://libsisimai.org/ja/data/)
339
+ Differences between Sisimai 4 and Sisimai 5
340
+ ===================================================================================================
341
+ [Sisimai 4.25.16p1](https://github.com/sisimai/rb-sisimai/releases/tag/v4.25.16p1)と
342
+ [Sisimai 5](https://github.com/sisimai/rb-sisimai/releases/tag/v5.0.0)には下記のような違いがあります。
343
+ それぞれの詳細は[Sisimai | 違いの一覧](https://libsisimai.org/ja/diff/)を参照してください。
344
+
345
+ Features
346
+ ---------------------------------------------------------------------------------------------------
347
+ Sisimai 5.0.0から**Ruby 2.4以上**が必要になります。
348
+
349
+ | 機能 | Sisimai 4 | Sisimai 5 |
350
+ |------------------------------------------------------|--------------------|---------------------|
351
+ | 動作環境(CRuby) | 2.1 - | **2.4** - 3.3.0 |
352
+ | 動作環境(JRuby) | 9.0.4.0 - 9.1.17.0 | 9.0.4.0 - 9.1.17.0 |
353
+ | 元メールファイルを操作可能なコールバック機能 | なし | あり[^3] |
354
+ | 解析エンジン(MTA/ESPモジュール)の数 | 68 | 70 |
355
+ | 検出可能なバウンス理由の数 | 29 | 34 |
356
+ | 依存Gem数(Ruby Standard Gemsを除く) | 1 Gem | 1 Gem |
357
+ | ソースコードの行数 | 10,800 行 | 11,400 行 |
358
+ | テストフレームワーク | rspec | minitest |
359
+ | テスト件数(spec/またはtest/ディレクトリ) | 311,000 件 | 336,000 件 |
360
+ | 1秒間に解析できるバウンスメール数[^4] | 231 通 | 305 通 |
361
+ | ライセンス | 2条項BSD | 2条項BSD |
362
+ | 開発会社による商用サポート | 提供中 | 提供中 |
363
+
364
+ [^3]: `Sisimai.rise`メソッドで指定する`:c___`パラメーター第二引数で指定可能
365
+ [^4]: macOS Monterey/1.6GHz Dual-Core Intel Core i5/16GB-RAM/Ruby 3.3.0
366
+
367
+ Decoding Method
368
+ ---------------------------------------------------------------------------------------------------
369
+ いくつかの解析メソッド名、クラス名、パラメーター名がSisimai 5で変更になっています。解析済みデータの
370
+ 各項目は[LIBSISIMAI.ORG/JA/DATA](https://libsisimai.org/ja/data/)を参照してください。
371
+
372
+ | 解析用メソッド周辺の変更箇所 | Sisimai 4 | Sisimai 5 |
373
+ |------------------------------------------------------|--------------------|---------------------|
374
+ | 解析メソッド名 | `Sisimai.make` | `Sisimai.rise` |
375
+ | 出力メソッド名 | `Sisimai.dump` | `Sisimai.dump` |
376
+ | 解析メソッドが返すオブジェクトのクラス | `Sisimai::Data` | `Sisimai::Fact` |
377
+ | コールバック用のパラメーター名 | `hook` | `c___`[^5] |
378
+ | ハードバウンスかソフトバウンスかを識別するメソッド名 | `softbounce` | `hardbounce` |
379
+ | "vacation"をデフォルトで検出するかどうか | 検出する | 検出しない |
380
+ | Sisimai::Messageがオブジェクトを返すかどうか | 返す | 返さない |
381
+ | MIME解析用クラスの名前 | `Sisimai::MIME` | `Sisimai::RFC2045` |
382
+ | SMTPセッションの解析をするかどうか | しない | する[^6] |
383
+
384
+ [^5]: `:c___`は漁港で使う釣り針に見える
385
+ [^6]: `Sisimai::SMTP::Transcript.rise`メソッドによる
386
+
387
+ MTA/ESP Module Names
388
+ ---------------------------------------------------------------------------------------------------
389
+ Sisimai 5で3個のESPモジュール名(解析エンジン)が変更になりました。詳細はMTA/ESPモジュールの一覧/
390
+ [LIBSISIMAI.ORG/JA/ENGINE](https://libsisimai.org/ja/engine/)を参照してください。
391
+
392
+ | `Sisimai::Rhost::` | Sisimai 4 | Sisimai 5 |
393
+ |------------------------------------------------------|--------------------|---------------------|
394
+ | Microsoft Exchange Online | `ExchangeOnline` | `Microsoft` |
395
+ | Google Workspace | `GoogleApps` | `Google` |
396
+ | Tencent | `TencentQQ` | `Tencent` |
397
+
398
+ Bounce Reasons
399
+ ---------------------------------------------------------------------------------------------------
400
+ Sisimai 5では新たに5個のバウンス理由が増えました。検出可能なバウンス理由の一覧は
401
+ [LIBSISIMAI.ORG/JA/REASON](https://libsisimai.org/en/reason/)を参照してください。
402
+
403
+ | バウンスした理由 | Sisimai 4 | Sisimai 5 |
404
+ |------------------------------------------------------|--------------------|---------------------|
405
+ | ドメイン認証によるもの(SPF,DKIM,DMARC) | `SecurityError` | `AuthFailure` |
406
+ | 送信者のドメイン・IPアドレスの低いレピュテーション | `Blocked` | `BadReputation` |
407
+ | PTRレコードが未設定または無効なPTRレコード | `Blocked` | `RequirePTR` |
408
+ | RFCに準拠していないメール[^7] | `SecurityError` | `NotCompliantRFC` |
409
+ | 単位時間の流量制限・送信速度が速すぎる | `SecurityError` | `Speeding` |
410
+
411
+ [^7]: RFC5322など
236
412
 
237
413
  Contributing
238
- ===============================================================================
239
-
414
+ ===================================================================================================
240
415
  Bug report
241
- -------------------------------------------------------------------------------
242
- もしもSisimaiにバグを発見した場合は[Issues](https://github.com/sisimai/rb-sisimai/issues)
243
- にて連絡をいただけると助かります。
416
+ ---------------------------------------------------------------------------------------------------
417
+ もしもSisimaiにバグを発見した場合は[Issues](https://github.com/sisimai/rb-sisimai/issues)にて連絡を
418
+ いただけると助かります。
244
419
 
245
- Emails could not be parsed
246
- -------------------------------------------------------------------------------
420
+ Emails could not be decoded
421
+ ---------------------------------------------------------------------------------------------------
247
422
  Sisimaiで解析できないバウンスメールは
248
423
  [set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet](https://github.com/sisimai/set-of-emails/tree/master/to-be-debugged-because/sisimai-cannot-parse-yet)リポジトリに追加してPull-Requestを送ってください。
249
424
 
250
425
  Other Information
251
- ===============================================================================
252
-
426
+ ===================================================================================================
253
427
  Related sites
254
- -------------------------------------------------------------------------------
428
+ ---------------------------------------------------------------------------------------------------
255
429
  * __@libsisimai__ | [Sisimai on Twitter (@libsisimai)](https://twitter.com/libsisimai)
256
- * __libSISIMAI.ORG__ | [Sisimai | The successor to bounceHammer, Library to parse bounce mails](https://libsisimai.org/)
430
+ * __LIBSISIMAI.ORG__ | [SISIMAI | MAIL ANALYZING INTERFACE | DECODING BOUNCES, BETTER AND FASTER.](https://libsisimai.org/)
257
431
  * __Sisimai Blog__ | [blog.libsisimai.org](http://blog.libsisimai.org/)
258
432
  * __Facebook Page__ | [facebook.com/libsisimai](https://www.facebook.com/libsisimai/)
259
433
  * __GitHub__ | [github.com/sisimai/rb-sisimai](https://github.com/sisimai/rb-sisimai)
@@ -262,7 +436,7 @@ Related sites
262
436
  * __Fixtures__ | [set-of-emails - Sample emails for "make test"](https://github.com/sisimai/set-of-emails)
263
437
 
264
438
  See also
265
- -------------------------------------------------------------------------------
439
+ ---------------------------------------------------------------------------------------------------
266
440
  * [README.md - README.md in English](https://github.com/sisimai/rb-sisimai/blob/master/README.md)
267
441
  * [RFC3463 - Enhanced Mail System Status Codes](https://tools.ietf.org/html/rfc3463)
268
442
  * [RFC3464 - An Extensible Message Format for Delivery Status Notifications](https://tools.ietf.org/html/rfc3464)
@@ -271,14 +445,14 @@ See also
271
445
  * [RFC5322 - Internet Message Format](https://tools.ietf.org/html/rfc5322)
272
446
 
273
447
  Author
274
- ===============================================================================
448
+ ===================================================================================================
275
449
  [@azumakuniyuki](https://twitter.com/azumakuniyuki)
276
450
 
277
451
  Copyright
278
- ===============================================================================
279
- Copyright (C) 2015-2022 azumakuniyuki, All Rights Reserved.
452
+ ===================================================================================================
453
+ Copyright (C) 2015-2024 azumakuniyuki, All Rights Reserved.
280
454
 
281
455
  License
282
- ===============================================================================
456
+ ===================================================================================================
283
457
  This software is distributed under The BSD 2-Clause License.
284
458