sisimai 5.0.2-java → 5.1.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/codecovio.yml +35 -0
- data/.github/workflows/rake-test.yml +27 -24
- data/ChangeLog.md +62 -0
- data/Gemfile +2 -0
- data/README-JA.md +21 -18
- data/README.md +23 -20
- data/lib/sisimai/arf.rb +27 -8
- 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 +6 -5
- 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 +9 -9
- data/lib/sisimai/order.rb +1 -0
- data/lib/sisimai/reason/badreputation.rb +1 -1
- data/lib/sisimai/reason/blocked.rb +1 -0
- data/lib/sisimai/reason/expired.rb +7 -0
- data/lib/sisimai/reason/filtered.rb +1 -0
- data/lib/sisimai/reason/mailboxfull.rb +3 -0
- data/lib/sisimai/reason/norelaying.rb +2 -0
- data/lib/sisimai/reason/rejected.rb +2 -1
- data/lib/sisimai/reason/suspend.rb +4 -0
- data/lib/sisimai/reason/userunknown.rb +4 -1
- 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 +85 -72
- data/lib/sisimai/rhost/iua.rb +2 -2
- data/lib/sisimai/rhost/kddi.rb +6 -5
- data/lib/sisimai/rhost/microsoft.rb +12 -5
- data/lib/sisimai/rhost/mimecast.rb +15 -4
- data/lib/sisimai/rhost/nttdocomo.rb +4 -4
- 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/arf-26.eml +27 -0
- 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-microsoft-04.eml +86 -0
- data/set-of-emails/maildir/bsd/rhost-microsoft-05.eml +83 -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 +69 -3
- data/.travis.yml +0 -23
data/lib/sisimai/lhost/x5.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Sisimai::Lhost
|
|
2
|
-
# Sisimai::Lhost::X5
|
|
2
|
+
# Sisimai::Lhost::X5 decodes a bounce email which created by Unknown MTA #5. Methods in the module
|
|
3
3
|
# are called from only Sisimai::Message.
|
|
4
4
|
module X5
|
|
5
5
|
class << self
|
|
@@ -9,11 +9,11 @@ module Sisimai::Lhost
|
|
|
9
9
|
Boundaries = ['Content-Type: message/rfc822'].freeze
|
|
10
10
|
StartingOf = { message: ['Content-Type: message/delivery-status'] }.freeze
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# @abstract Decodes the bounce message from Unknown MTA #5
|
|
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
|
match = 0
|
|
19
19
|
match += 1 if mhead['to'].to_s.include?('NotificationRecipients')
|
data/lib/sisimai/lhost/x6.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Sisimai::Lhost
|
|
2
|
-
# Sisimai::Lhost::X6
|
|
2
|
+
# Sisimai::Lhost::X6 decodes a bounce email which created by Unknown MTA #6. Methods in the module
|
|
3
3
|
# are called from only Sisimai::Message.
|
|
4
4
|
module X6
|
|
5
5
|
class << self
|
|
@@ -9,11 +9,11 @@ module Sisimai::Lhost
|
|
|
9
9
|
Boundaries = ['The attachment contains the original mail headers'].freeze
|
|
10
10
|
StartingOf = { message: ['We had trouble delivering your message. Full details follow:'] }.freeze
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# @abstract Decodes the bounce message from Unknown MTA #6
|
|
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
|
return nil unless mhead['subject'].start_with?('There was an error sending your mail')
|
data/lib/sisimai/lhost/yahoo.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Sisimai::Lhost
|
|
2
|
-
# Sisimai::Lhost::Yahoo
|
|
3
|
-
# are called from only Sisimai::Message.
|
|
2
|
+
# Sisimai::Lhost::Yahoo decodes a bounce email which created by Yahoo Mail https://mail.yahoo.com/.
|
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
|
4
4
|
module Yahoo
|
|
5
5
|
class << self
|
|
6
6
|
require 'sisimai/lhost'
|
|
@@ -9,11 +9,11 @@ module Sisimai::Lhost
|
|
|
9
9
|
Boundaries = ['--- Below this line is a copy of the message.'].freeze
|
|
10
10
|
StartingOf = { message: ['Sorry, we were unable to deliver your message'] }.freeze
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# @abstract Decodes the bounce message from Yahoo Mail
|
|
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
|
# X-YMailISG: YtyUVyYWLDsbDh...
|
|
19
19
|
# X-YMail-JAS: Pb65aU4VM1mei...
|
data/lib/sisimai/lhost/yandex.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Sisimai::Lhost
|
|
2
|
-
# Sisimai::Lhost::Yandex
|
|
3
|
-
# are called from only Sisimai::Message.
|
|
2
|
+
# Sisimai::Lhost::Yandex decodes a bounce email which created by Yandex Mail https://360.yandex.com/mail/'.
|
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
|
4
4
|
module Yandex
|
|
5
5
|
class << self
|
|
6
6
|
require 'sisimai/lhost'
|
|
@@ -9,11 +9,11 @@ module Sisimai::Lhost
|
|
|
9
9
|
Boundaries = ['Content-Type: message/rfc822'].freeze
|
|
10
10
|
StartingOf = { message: ['This is the mail system at host yandex.ru.'] }.freeze
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# @abstract Decodes the bounce message from Yandex Mail
|
|
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
|
# X-Yandex-Front: mxback1h.mail.yandex.net
|
|
19
19
|
# X-Yandex-TimeMark: 1417885948
|
data/lib/sisimai/lhost/zoho.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Sisimai::Lhost
|
|
2
|
-
# Sisimai::Lhost::Zoho
|
|
3
|
-
# called from only Sisimai::Message.
|
|
2
|
+
# Sisimai::Lhost::Zoho decodes a bounce email which created by Zoho Mail https://www.zoho.com/mail/.
|
|
3
|
+
# Methods in the module are called from only Sisimai::Message.
|
|
4
4
|
module Zoho
|
|
5
5
|
class << self
|
|
6
6
|
require 'sisimai/lhost'
|
|
@@ -10,11 +10,11 @@ module Sisimai::Lhost
|
|
|
10
10
|
StartingOf = { message: ['This message was created automatically by mail delivery'] }.freeze
|
|
11
11
|
MessagesOf = { 'expired' => ['Host not reachable'] }.freeze
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# @abstract Decodes the bounce message from Zoho Mail
|
|
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-ZohoMail: Si CHF_MF_NL SS_10 UW48 UB48 FMWL UW48 UB48 SGR3_1_09124_42
|
|
20
20
|
# X-Zoho-Virus-Status: 2
|
data/lib/sisimai/lhost.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Sisimai
|
|
|
4
4
|
class << self
|
|
5
5
|
require 'sisimai/rfc5322'
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# @abstract Returns the data structure for decoded bounce messages
|
|
8
8
|
# @return [Hash] Data structure for delivery status
|
|
9
9
|
# @private
|
|
10
10
|
def DELIVERYSTATUS
|
|
@@ -42,8 +42,8 @@ module Sisimai
|
|
|
42
42
|
def index
|
|
43
43
|
return %w[
|
|
44
44
|
Activehunter Amavis AmazonSES AmazonWorkMail Aol ApacheJames Barracuda Bigfoot Biglobe
|
|
45
|
-
Courier Domino EZweb EinsUndEins Exchange2003 Exchange2007 Exim FML Facebook GMX
|
|
46
|
-
GoogleGroups Gmail IMailServer InterScanMSS KDDI MXLogic MailFoundry MailMarshalSMTP
|
|
45
|
+
Courier Domino DragonFly EZweb EinsUndEins Exchange2003 Exchange2007 Exim FML Facebook GMX
|
|
46
|
+
GSuite GoogleGroups Gmail IMailServer InterScanMSS KDDI MXLogic MailFoundry MailMarshalSMTP
|
|
47
47
|
MailRu McAfee MessageLabs MessagingServer Notes Office365 OpenSMTPD Outlook Postfix
|
|
48
48
|
PowerMTA ReceivingSES SendGrid Sendmail SurfControl V5sendmail Verizon X1 X2 X3 X4 X5 X6
|
|
49
49
|
Yahoo Yandex Zoho MFILTER Qmail
|
|
@@ -64,11 +64,11 @@ module Sisimai
|
|
|
64
64
|
return table
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
# @abstract
|
|
67
|
+
# @abstract decode bounce messages
|
|
68
68
|
# @param [Hash] mhead Message headers of a bounce email
|
|
69
69
|
# @param [String] mbody Message body of a bounce email
|
|
70
70
|
# @return [Hash] Bounce data list and message/rfc822 part
|
|
71
|
-
# @return [Nil] it failed to
|
|
71
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
|
72
72
|
def inquire; return nil; end
|
|
73
73
|
def description; return ''; end
|
|
74
74
|
end
|
data/lib/sisimai/mail/maildir.rb
CHANGED
data/lib/sisimai/mail/stdin.rb
CHANGED
data/lib/sisimai/mda.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Sisimai
|
|
2
|
-
# Sisimai::MDA - Error message
|
|
2
|
+
# Sisimai::MDA - Error message decoder for MDA
|
|
3
3
|
module MDA
|
|
4
4
|
class << self
|
|
5
5
|
AgentNames = {
|
|
@@ -66,11 +66,11 @@ module Sisimai
|
|
|
66
66
|
},
|
|
67
67
|
}.freeze
|
|
68
68
|
|
|
69
|
-
#
|
|
69
|
+
# @abstract Decodes the message body and return the MDA name, the reason, and the error message
|
|
70
70
|
# @param [Hash] mhead Message headers of a bounce email
|
|
71
71
|
# @param [String] mbody Message body of a bounce email
|
|
72
72
|
# @return [Hash] Bounce data list and message/rfc822 part
|
|
73
|
-
# @return [Nil] it failed to
|
|
73
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
|
74
74
|
def inquire(mhead, mbody)
|
|
75
75
|
return nil unless mhead
|
|
76
76
|
return nil unless mbody.size > 0
|
data/lib/sisimai/message.rb
CHANGED
|
@@ -351,11 +351,11 @@ module Sisimai
|
|
|
351
351
|
# @param options mail [String] from From line of mbox
|
|
352
352
|
# @param options mail [Hash] header Email header data
|
|
353
353
|
# @param options mail [String] rfc822 Original message part
|
|
354
|
-
# @param options mail [Array] ds Delivery status list(
|
|
354
|
+
# @param options mail [Array] ds Delivery status list(decoded data)
|
|
355
355
|
# @param options argvs [String] body Email message body
|
|
356
356
|
# @param options argvs [Array] tryonfirst MTA module list to load on first
|
|
357
357
|
# @param options argvs [Array] tobeloaded User defined MTA module list
|
|
358
|
-
# @return [Hash]
|
|
358
|
+
# @return [Hash] Decoded and structured bounce mails
|
|
359
359
|
def sift(argvs)
|
|
360
360
|
return nil unless argvs['mail']
|
|
361
361
|
return nil unless argvs['body']
|
|
@@ -414,7 +414,7 @@ module Sisimai
|
|
|
414
414
|
end
|
|
415
415
|
end
|
|
416
416
|
|
|
417
|
-
catch :
|
|
417
|
+
catch :DECODER do
|
|
418
418
|
while true
|
|
419
419
|
# 1. User-Defined Module
|
|
420
420
|
# 2. MTA Module Candidates to be tried on first
|
|
@@ -428,7 +428,7 @@ module Sisimai
|
|
|
428
428
|
havesifted = Module.const_get(r).inquire(mailheader, bodystring)
|
|
429
429
|
haveloaded[r] = true
|
|
430
430
|
modulename = r
|
|
431
|
-
throw :
|
|
431
|
+
throw :DECODER if havesifted
|
|
432
432
|
end
|
|
433
433
|
|
|
434
434
|
[argvs['tryonfirst'], DefaultSet].flatten.each do |r|
|
|
@@ -438,7 +438,7 @@ module Sisimai
|
|
|
438
438
|
havesifted = Module.const_get(r).inquire(mailheader, bodystring)
|
|
439
439
|
haveloaded[r] = true
|
|
440
440
|
modulename = r
|
|
441
|
-
throw :
|
|
441
|
+
throw :DECODER if havesifted
|
|
442
442
|
end
|
|
443
443
|
|
|
444
444
|
unless haveloaded['Sisimai::RFC3464']
|
|
@@ -446,14 +446,14 @@ module Sisimai
|
|
|
446
446
|
require 'sisimai/rfc3464'
|
|
447
447
|
havesifted = Sisimai::RFC3464.inquire(mailheader, bodystring)
|
|
448
448
|
modulename = 'RFC3464'
|
|
449
|
-
throw :
|
|
449
|
+
throw :DECODER if havesifted
|
|
450
450
|
end
|
|
451
451
|
|
|
452
452
|
unless haveloaded['Sisimai::ARF']
|
|
453
453
|
# Feedback Loop message
|
|
454
454
|
require 'sisimai/arf'
|
|
455
|
-
havesifted = Sisimai::ARF.inquire(mailheader, bodystring)
|
|
456
|
-
throw :
|
|
455
|
+
havesifted = Sisimai::ARF.inquire(mailheader, bodystring)
|
|
456
|
+
throw :DECODER if havesifted
|
|
457
457
|
end
|
|
458
458
|
|
|
459
459
|
unless haveloaded['Sisimai::RFC3834']
|
|
@@ -461,7 +461,7 @@ module Sisimai
|
|
|
461
461
|
require 'sisimai/rfc3834'
|
|
462
462
|
havesifted = Sisimai::RFC3834.inquire(mailheader, bodystring)
|
|
463
463
|
modulename = 'RFC3834'
|
|
464
|
-
throw :
|
|
464
|
+
throw :DECODER if havesifted
|
|
465
465
|
end
|
|
466
466
|
|
|
467
467
|
break # as of now, we have no sample email for coding this block
|
data/lib/sisimai/order.rb
CHANGED
|
@@ -19,6 +19,7 @@ module Sisimai
|
|
|
19
19
|
'has been temporarily rate limited due to ip reputation',
|
|
20
20
|
'ip/domain reputation problems',
|
|
21
21
|
'likely suspicious due to the very low reputation',
|
|
22
|
+
'temporarily deferred due to unexpected volume or user complaints', # Yahoo Inc.
|
|
22
23
|
"the sending mta's poor reputation",
|
|
23
24
|
].freeze
|
|
24
25
|
def text; return 'badreputation'; end
|
|
@@ -40,7 +41,6 @@ module Sisimai
|
|
|
40
41
|
# false: is not BadReputation
|
|
41
42
|
# @see http://www.ietf.org/rfc/rfc2822.txt
|
|
42
43
|
def true(argvs)
|
|
43
|
-
return nil if argvs['deliverystatus'].empty?
|
|
44
44
|
return true if argvs['reason'] == 'badreputation'
|
|
45
45
|
return true if match(argvs['diagnosticcode'].downcase)
|
|
46
46
|
return false
|
|
@@ -62,6 +62,7 @@ module Sisimai
|
|
|
62
62
|
'we do not accept mail from dynamic ips', # @mail.ru
|
|
63
63
|
'you are not allowed to connect',
|
|
64
64
|
'you are sending spam',
|
|
65
|
+
'your ip address is listed in the rbl',
|
|
65
66
|
'your network is temporary blacklisted',
|
|
66
67
|
'your server requires confirmation',
|
|
67
68
|
].freeze
|
|
@@ -7,10 +7,13 @@ module Sisimai
|
|
|
7
7
|
# the message you sent has been in the queue for long time.
|
|
8
8
|
module Expired
|
|
9
9
|
class << self
|
|
10
|
+
require 'sisimai/string'
|
|
11
|
+
|
|
10
12
|
Index = [
|
|
11
13
|
'connection timed out',
|
|
12
14
|
'could not find a gateway for',
|
|
13
15
|
'delivery attempts will continue to be',
|
|
16
|
+
'delivery expired',
|
|
14
17
|
'delivery time expired',
|
|
15
18
|
'failed to deliver to domain ',
|
|
16
19
|
'giving up on',
|
|
@@ -28,6 +31,9 @@ module Sisimai
|
|
|
28
31
|
'was not reachable within the allowed queue period',
|
|
29
32
|
'your message could not be delivered for more than',
|
|
30
33
|
].freeze
|
|
34
|
+
Pairs = [
|
|
35
|
+
['could not be delivered for', ' days'],
|
|
36
|
+
].freeze
|
|
31
37
|
|
|
32
38
|
def text; return 'expired'; end
|
|
33
39
|
def description; return 'Delivery time has expired due to a connection failure'; end
|
|
@@ -39,6 +45,7 @@ module Sisimai
|
|
|
39
45
|
def match(argv1)
|
|
40
46
|
return nil unless argv1
|
|
41
47
|
return true if Index.any? { |a| argv1.include?(a) }
|
|
48
|
+
return true if Pairs.any? { |a| Sisimai::String.aligned(argv1, a) }
|
|
42
49
|
return false
|
|
43
50
|
end
|
|
44
51
|
|
|
@@ -21,6 +21,7 @@ module Sisimai
|
|
|
21
21
|
'resolver.rst.notauthorized', # Microsoft Exchange
|
|
22
22
|
'this account is protected by',
|
|
23
23
|
'user not found', # Filter on MAIL.RU
|
|
24
|
+
'user refuses to receive this mail',
|
|
24
25
|
'user reject',
|
|
25
26
|
'we failed to deliver mail because the following address recipient id refuse to receive mail', # Willcom
|
|
26
27
|
'you have been blocked by the recipient',
|
|
@@ -8,6 +8,7 @@ module Sisimai
|
|
|
8
8
|
module MailboxFull
|
|
9
9
|
class << self
|
|
10
10
|
Index = [
|
|
11
|
+
'452 insufficient disk space',
|
|
11
12
|
'account disabled temporarly for exceeding receiving limits',
|
|
12
13
|
'account is exceeding their quota',
|
|
13
14
|
'account is over quota',
|
|
@@ -35,7 +36,9 @@ module Sisimai
|
|
|
35
36
|
'maildir delivery failed: userdisk quota ',
|
|
36
37
|
'maildir delivery failed: domaindisk quota ',
|
|
37
38
|
'mailfolder is full',
|
|
39
|
+
'no space left on device',
|
|
38
40
|
'not enough storage space in',
|
|
41
|
+
'not sufficient disk space',
|
|
39
42
|
'over the allowed quota',
|
|
40
43
|
'quota exceeded',
|
|
41
44
|
'quota violation for',
|
|
@@ -15,6 +15,7 @@ module Sisimai
|
|
|
15
15
|
'insecure mail relay',
|
|
16
16
|
'is not permitted to relay through this server without authentication',
|
|
17
17
|
'mail server requires authentication when attempting to send to a non-local e-mail address', # MailEnable
|
|
18
|
+
'no relaying',
|
|
18
19
|
'not a gateway',
|
|
19
20
|
'not allowed to relay through this machine',
|
|
20
21
|
'not an open relay, so get lost',
|
|
@@ -24,6 +25,7 @@ module Sisimai
|
|
|
24
25
|
'relay not permitted',
|
|
25
26
|
'relaying denied', # Sendmail
|
|
26
27
|
'relaying mail to ',
|
|
28
|
+
'specified domain is not allowed',
|
|
27
29
|
"that domain isn't in my list of allowed rcpthost",
|
|
28
30
|
'this system is not configured to relay mail',
|
|
29
31
|
'unable to relay for',
|
|
@@ -38,7 +38,7 @@ module Sisimai
|
|
|
38
38
|
'email address is on senderfilterconfig list',
|
|
39
39
|
'emetteur invalide',
|
|
40
40
|
'empty envelope senders not allowed',
|
|
41
|
-
'envelope blocked
|
|
41
|
+
'envelope blocked - ',
|
|
42
42
|
'error: no third-party dsns', # SpamWall - block empty sender
|
|
43
43
|
'from: domain is invalid. please provide a valid from:',
|
|
44
44
|
'fully qualified email address required', # McAfee
|
|
@@ -63,6 +63,7 @@ module Sisimai
|
|
|
63
63
|
'sender rejected',
|
|
64
64
|
'sender domain is empty',
|
|
65
65
|
'sender verify failed', # Exim callout
|
|
66
|
+
'sender was rejected', # qmail
|
|
66
67
|
'spam reporting address', # SendGrid|a message to an address has previously been marked as Spam by the recipient.
|
|
67
68
|
'syntax error: empty email address',
|
|
68
69
|
'the message has been rejected by batv defense',
|
|
@@ -12,17 +12,21 @@ module Sisimai
|
|
|
12
12
|
'boite du destinataire archivee',
|
|
13
13
|
'email account that you tried to reach is disabled',
|
|
14
14
|
'has been suspended',
|
|
15
|
+
'inactive account',
|
|
15
16
|
'invalid/inactive user',
|
|
16
17
|
'is a deactivated mailbox', # http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000742
|
|
17
18
|
'is unavailable: user is terminated',
|
|
18
19
|
'mailbox currently suspended',
|
|
20
|
+
'mailbox disabled',
|
|
19
21
|
'mailbox is frozen',
|
|
20
22
|
'mailbox unavailable or access denied',
|
|
21
23
|
'recipient rejected: temporarily inactive',
|
|
22
24
|
'recipient suspend the service',
|
|
23
25
|
'this account has been disabled or discontinued',
|
|
26
|
+
'this account has been temporarily suspended',
|
|
24
27
|
'this address no longer accepts mail',
|
|
25
28
|
'this mailbox is disabled',
|
|
29
|
+
'user or domain is disabled',
|
|
26
30
|
'user suspended', # http://mail.163.com/help/help_spam_16.htm
|
|
27
31
|
'vdelivermail: account is locked email bounced',
|
|
28
32
|
].freeze
|
|
@@ -63,7 +63,6 @@ module Sisimai
|
|
|
63
63
|
'no such mailbox',
|
|
64
64
|
'no such person at this address',
|
|
65
65
|
'no such recipient',
|
|
66
|
-
|
|
67
66
|
'no such user',
|
|
68
67
|
'no thank you rejected: account unavailable',
|
|
69
68
|
'no valid recipients, bye',
|
|
@@ -76,7 +75,9 @@ module Sisimai
|
|
|
76
75
|
'recipient address rejected: invalid user',
|
|
77
76
|
'recipient address rejected: invalid-recipient',
|
|
78
77
|
'recipient address rejected: unknown user',
|
|
78
|
+
'recipient address rejected: userunknown',
|
|
79
79
|
'recipient does not exist',
|
|
80
|
+
'recipient is not accepted',
|
|
80
81
|
'recipient is not local',
|
|
81
82
|
'recipient not exist',
|
|
82
83
|
'recipient not found',
|
|
@@ -125,6 +126,7 @@ module Sisimai
|
|
|
125
126
|
['no ', ' in name directory'],
|
|
126
127
|
['non', 'existent user'],
|
|
127
128
|
['rcpt <', ' does not exist'],
|
|
129
|
+
['rcpt (', 't exist '],
|
|
128
130
|
['recipient ', ' was not found in'],
|
|
129
131
|
['recipient address rejected: user ', ' does not exist'],
|
|
130
132
|
['recipient address rejected: user unknown in ', ' table'],
|
|
@@ -135,6 +137,7 @@ module Sisimai
|
|
|
135
137
|
['unknown local', 'part'],
|
|
136
138
|
['user ', ' was not found'],
|
|
137
139
|
['user ', ' does not exist'],
|
|
140
|
+
['user (', ') unknown'],
|
|
138
141
|
].freeze
|
|
139
142
|
|
|
140
143
|
def text; return 'userunknown'; end
|
data/lib/sisimai/reason.rb
CHANGED
|
@@ -38,13 +38,13 @@ module Sisimai
|
|
|
38
38
|
ClassOrder = [
|
|
39
39
|
%w[
|
|
40
40
|
MailboxFull MesgTooBig ExceedLimit Suspend HasMoved NoRelaying AuthFailure UserUnknown
|
|
41
|
-
Filtered RequirePTR NotCompliantRFC Rejected HostUnknown SpamDetected Speeding
|
|
42
|
-
Blocked
|
|
41
|
+
Filtered RequirePTR NotCompliantRFC BadReputation Rejected HostUnknown SpamDetected Speeding
|
|
42
|
+
TooManyConn Blocked
|
|
43
43
|
],
|
|
44
44
|
%w[
|
|
45
|
-
MailboxFull SpamDetected
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
MailboxFull AuthFailure BadReputation Speeding SpamDetected VirusDetected PolicyViolation
|
|
46
|
+
NoRelaying SystemError NetworkError Suspend ContentError SystemFull NotAccept Expired
|
|
47
|
+
SecurityError MailerError
|
|
48
48
|
],
|
|
49
49
|
%w[
|
|
50
50
|
MailboxFull MesgTooBig ExceedLimit Suspend UserUnknown Filtered Rejected HostUnknown
|
|
@@ -55,7 +55,7 @@ module Sisimai
|
|
|
55
55
|
]
|
|
56
56
|
|
|
57
57
|
# Detect the bounce reason
|
|
58
|
-
# @param [Hash] argvs
|
|
58
|
+
# @param [Hash] argvs Decoded email object
|
|
59
59
|
# @return [String, nil] Bounce reason or nil if the argument is missing or not Hash
|
|
60
60
|
# @see anotherone
|
|
61
61
|
def get(argvs)
|
|
@@ -112,7 +112,7 @@ module Sisimai
|
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
# Detect the other bounce reason, fall back method for get()
|
|
115
|
-
# @param [Hash] argvs
|
|
115
|
+
# @param [Hash] argvs Decoded email object
|
|
116
116
|
# @return [String, Nil] Bounce reason or nli if the argument is missing or not Hash
|
|
117
117
|
# @see get
|
|
118
118
|
def anotherone(argvs)
|
|
@@ -216,7 +216,7 @@ module Sisimai
|
|
|
216
216
|
end
|
|
217
217
|
return reasontext unless reasontext.empty?
|
|
218
218
|
|
|
219
|
-
if issuedcode.upcase
|
|
219
|
+
if issuedcode.upcase.include?('X-UNIX; ')
|
|
220
220
|
# X-Unix; ...
|
|
221
221
|
reasontext = 'mailererror'
|
|
222
222
|
else
|
data/lib/sisimai/rfc3464.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Sisimai
|
|
2
|
-
# Sisimai::RFC3464 - bounce mail
|
|
2
|
+
# Sisimai::RFC3464 - bounce mail decoder class for Fallback.
|
|
3
3
|
module RFC3464
|
|
4
4
|
class << self
|
|
5
5
|
require 'sisimai/lhost'
|
|
@@ -96,7 +96,7 @@ module Sisimai
|
|
|
96
96
|
# @param [Hash] mhead Message headers of a bounce email
|
|
97
97
|
# @param [String] mbody Message body of a bounce email
|
|
98
98
|
# @return [Hash] Bounce data list and message/rfc822 part
|
|
99
|
-
# @return [Nil] it failed to
|
|
99
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
|
100
100
|
def inquire(mhead, mbody)
|
|
101
101
|
fieldtable = Sisimai::RFC1894.FIELDTABLE
|
|
102
102
|
permessage = {} # (Hash) Store values of each Per-Message field
|
|
@@ -233,7 +233,7 @@ module Sisimai
|
|
|
233
233
|
|
|
234
234
|
# -----------------------------------------------------------------------------------------
|
|
235
235
|
while true
|
|
236
|
-
# Fallback,
|
|
236
|
+
# Fallback, decode the entire message body
|
|
237
237
|
break if recipients > 0
|
|
238
238
|
|
|
239
239
|
# Failed to get a recipient address at code above
|
data/lib/sisimai/rfc3834.rb
CHANGED
|
@@ -33,7 +33,7 @@ module Sisimai
|
|
|
33
33
|
# @param [Hash] mhead Message headers of a bounce email
|
|
34
34
|
# @param [String] mbody Message body of a bounce email
|
|
35
35
|
# @return [Hash] Bounce data list and message/rfc822 part
|
|
36
|
-
# @return [Nil] it failed to
|
|
36
|
+
# @return [Nil] it failed to decode or the arguments are missing
|
|
37
37
|
def inquire(mhead, mbody)
|
|
38
38
|
leave = 0
|
|
39
39
|
match = 0
|
|
@@ -98,7 +98,7 @@ module Sisimai
|
|
|
98
98
|
MarkingsOf[:boundary] = q unless q.empty?
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
-
#
|
|
101
|
+
# MESSAGE_BODY: Get the vacation message
|
|
102
102
|
while e = bodyslices.shift do
|
|
103
103
|
# Read the first 5 lines except a blank line
|
|
104
104
|
countuntil += 1 if e.include?(MarkingsOf[:boundary])
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module Sisimai
|
|
2
|
+
module Rhost
|
|
3
|
+
# Sisimai::Rhost detects the bounce reason from the content of Sisimai::Fact object as an argument
|
|
4
|
+
# of get() method when the value of "destination" of the object is "mail.icloud.com" or "apple.com".
|
|
5
|
+
# This class is called only Sisimai::Fact class.
|
|
6
|
+
module Apple
|
|
7
|
+
class << self
|
|
8
|
+
MessagesOf = {
|
|
9
|
+
'authfailure' => [
|
|
10
|
+
# - 554 5.7.1 Your message was rejected due to example.jp's DMARC policy.
|
|
11
|
+
# See https://support.apple.com/en-us/HT204137 for
|
|
12
|
+
# - 554 5.7.1 [HME1] This message was blocked for failing both SPF and DKIM authentication
|
|
13
|
+
# checks. See https://support.apple.com/en-us/HT204137 for mailing best practices
|
|
14
|
+
's dmarc policy',
|
|
15
|
+
'blocked for failing both spf and dkim autentication checks',
|
|
16
|
+
],
|
|
17
|
+
'blocked' => [
|
|
18
|
+
# - 550 5.7.0 Blocked - see https://support.proofpoint.com/dnsbl-lookup.cgi?ip=192.0.1.2
|
|
19
|
+
# - 550 5.7.1 Your email was rejected due to having a domain present in the Spamhaus
|
|
20
|
+
# DBL -- see https://www.spamhaus.org/dbl/
|
|
21
|
+
# - 550 5.7.1 Mail from IP 192.0.2.1 was rejected due to listing in Spamhaus SBL.
|
|
22
|
+
# For details please see http://www.spamhaus.org/query/bl?ip=x.x.x.x
|
|
23
|
+
# - 554 ****-smtpin001.me.com ESMTP not accepting connections
|
|
24
|
+
'rejected due to having a domain present in the spamhaus',
|
|
25
|
+
'rejected due to listing in spamhaus',
|
|
26
|
+
'blocked - see https://support.proofpoint.com/dnsbl-lookup',
|
|
27
|
+
'not accepting connections',
|
|
28
|
+
],
|
|
29
|
+
'hasmoved' => [
|
|
30
|
+
# - 550 5.1.6 recipient no longer on server: *****@icloud.com
|
|
31
|
+
'recipient no longer on server',
|
|
32
|
+
],
|
|
33
|
+
'mailboxfull' => [
|
|
34
|
+
# - 552 5.2.2 <****@icloud.com>: user is over quota (in reply to RCPT TO command)
|
|
35
|
+
'user is over quota',
|
|
36
|
+
],
|
|
37
|
+
'norelaying' => [
|
|
38
|
+
# - 554 5.7.1 <*****@icloud.com>: Relay access denied
|
|
39
|
+
'relay access denied',
|
|
40
|
+
],
|
|
41
|
+
'notaccept' => ['host/domain does not accept mail'],
|
|
42
|
+
'policyviolation' => [
|
|
43
|
+
# - 550 5.7.1 [CS01] Message rejected due to local policy.
|
|
44
|
+
# Please visit https://support.apple.com/en-us/HT204137
|
|
45
|
+
'due to local policy',
|
|
46
|
+
],
|
|
47
|
+
'rejected' => [
|
|
48
|
+
# - 450 4.1.8 <kijitora@example.jp>: Sender address rejected: Domain not found
|
|
49
|
+
'sender address rejected',
|
|
50
|
+
],
|
|
51
|
+
'speeding' => [
|
|
52
|
+
# - 421 4.7.1 Messages to ****@icloud.com deferred due to excessive volume.
|
|
53
|
+
# Try again later - https://support.apple.com/en-us/HT204137
|
|
54
|
+
'due to excessive volume',
|
|
55
|
+
],
|
|
56
|
+
'userunknown' => [
|
|
57
|
+
# - 550 5.1.1 <****@icloud.com>: inactive email address (in reply to RCPT TO command)
|
|
58
|
+
# - 550 5.1.1 unknown or illegal alias: ****@icloud.com
|
|
59
|
+
'inactive email address',
|
|
60
|
+
'user does not exist',
|
|
61
|
+
'unknown or illegal alias',
|
|
62
|
+
],
|
|
63
|
+
}.freeze
|
|
64
|
+
|
|
65
|
+
# Detect bounce reason from Apple iCloud Mail
|
|
66
|
+
# @param [Sisimai::Fact] argvs Decoded email object
|
|
67
|
+
# @return [String] The bounce reason for Apple
|
|
68
|
+
# @see https://support.apple.com/en-us/102322
|
|
69
|
+
# https://www.postmastery.com/icloud-postmastery-page/
|
|
70
|
+
# https://smtpfieldmanual.com/provider/apple
|
|
71
|
+
# @since v5.1.0
|
|
72
|
+
def get(argvs)
|
|
73
|
+
issuedcode = argvs['diagnosticcode'].downcase
|
|
74
|
+
reasontext = ''
|
|
75
|
+
|
|
76
|
+
MessagesOf.each_key do |e|
|
|
77
|
+
MessagesOf[e].each do |f|
|
|
78
|
+
next unless issuedcode.include?(f)
|
|
79
|
+
reasontext = e
|
|
80
|
+
break
|
|
81
|
+
end
|
|
82
|
+
break if reasontext.size > 0
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
return reasontext
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|