sisimai 5.0.3-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 +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
|
@@ -67,6 +67,15 @@ module Sisimai
|
|
|
67
67
|
# the associated IP address from the RBL.
|
|
68
68
|
#[550, '< details of RBL >'], NEED AN ACTUAL ERROR MESSAGE STRING
|
|
69
69
|
],
|
|
70
|
+
'expired' => [
|
|
71
|
+
# - Journal messages past the expiration
|
|
72
|
+
# - Attempts are being made to journal mail past the set expiry threshold.
|
|
73
|
+
# A retry response will replace the failure because the message is marked for retry
|
|
74
|
+
# if rejected, causing the journal queue to grow.
|
|
75
|
+
# - Check to confirm there are no significant time discrepancies on the mail server.
|
|
76
|
+
# Discontinue journaling old messages past the expiry threshold.
|
|
77
|
+
[550, 'Journal messages past the expiration'],
|
|
78
|
+
],
|
|
70
79
|
'mesgtoobig' => [
|
|
71
80
|
# - The email size either exceeds an Email Size Limit policy or is larger than the
|
|
72
81
|
# Mimecast service limit. The default is 100 MB for the Legacy MTA, and 200 MB for
|
|
@@ -96,6 +105,7 @@ module Sisimai
|
|
|
96
105
|
# - Mimecast customers should contact Mimecast Support to add the Authorized Outbound
|
|
97
106
|
# address, or to take other remedial action.
|
|
98
107
|
[451, 'open relay not allowed'],
|
|
108
|
+
[451, 'open relay is not allowed'],
|
|
99
109
|
],
|
|
100
110
|
'notaccept' => [
|
|
101
111
|
# - The customer account Inbound emails are disabled in the Administration Console.
|
|
@@ -133,6 +143,7 @@ module Sisimai
|
|
|
133
143
|
# - The message has triggered a Geographical Restriction policy.
|
|
134
144
|
# - Delete or amend the policy.
|
|
135
145
|
[554, 'host network not allowed'],
|
|
146
|
+
[554, 'host network, not allowed'],
|
|
136
147
|
],
|
|
137
148
|
'rejected' => [
|
|
138
149
|
# - The sender's email address or domain has triggered a Blocked Senders Policy or
|
|
@@ -160,6 +171,7 @@ module Sisimai
|
|
|
160
171
|
# sage on SMTP port 25.
|
|
161
172
|
[535, 'incorrect authentication data'],
|
|
162
173
|
[550, 'submitter failed to disabled'],
|
|
174
|
+
[550, 'submitter failed to authenticate'],
|
|
163
175
|
|
|
164
176
|
# - This email has been sent using SMTP, but TLS is required by policy.
|
|
165
177
|
# - Delete or change the Secure Receipt or Secure Delivery policy enforcing TLS.
|
|
@@ -267,13 +279,12 @@ module Sisimai
|
|
|
267
279
|
}.freeze
|
|
268
280
|
|
|
269
281
|
# Detect bounce reason from Mimecast
|
|
270
|
-
# @param [Sisimai::Fact] argvs
|
|
282
|
+
# @param [Sisimai::Fact] argvs Decoded email object
|
|
271
283
|
# @return [String] The bounce reason for mimecast.com
|
|
272
284
|
def get(argvs)
|
|
273
285
|
return '' unless Sisimai::SMTP::Reply.test(argvs['replycode'])
|
|
274
|
-
return '' unless argvs['diagnosticcode']
|
|
275
286
|
|
|
276
|
-
|
|
287
|
+
issuedcode = argvs['diagnosticcode'].downcase || ''
|
|
277
288
|
esmtpreply = argvs['replycode'].to_i
|
|
278
289
|
reasontext = ''
|
|
279
290
|
|
|
@@ -282,7 +293,7 @@ module Sisimai
|
|
|
282
293
|
MessagesOf[e].each do |f|
|
|
283
294
|
# Find an error reason
|
|
284
295
|
next unless esmtpreply == f[0]
|
|
285
|
-
next unless
|
|
296
|
+
next unless issuedcode.include?(f[1])
|
|
286
297
|
reasontext = e
|
|
287
298
|
break
|
|
288
299
|
end
|
|
@@ -12,7 +12,7 @@ module Sisimai
|
|
|
12
12
|
}.freeze
|
|
13
13
|
|
|
14
14
|
# Detect bounce reason from NTT DOCOMO
|
|
15
|
-
# @param [Sisimai::Fact] argvs
|
|
15
|
+
# @param [Sisimai::Fact] argvs Decoded email object
|
|
16
16
|
# @return [String] The bounce reason for docomo.ne.jp
|
|
17
17
|
def get(argvs)
|
|
18
18
|
statuscode = argvs['deliverystatus'] || ''
|
|
@@ -1,66 +1,126 @@
|
|
|
1
1
|
module Sisimai
|
|
2
2
|
module Rhost
|
|
3
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 "charter.net".
|
|
4
|
+
# of get() method when the value of "destination" of the object is "charter.net". This class is
|
|
5
5
|
# called only Sisimai::Fact class.
|
|
6
6
|
module Spectrum
|
|
7
7
|
class << self
|
|
8
|
-
ErrorCodes =
|
|
8
|
+
ErrorCodes = [
|
|
9
9
|
# https://www.spectrumbusiness.net/support/internet/understanding-email-error-codes
|
|
10
10
|
# Error codes are placed in one of two categories: incoming or outgoing.
|
|
11
|
-
# 1. If you
|
|
12
|
-
# address (such as Gmail, Yahoo, Hotmail, etc.),
|
|
13
|
-
# with AUP#I, followed by four numbers.
|
|
11
|
+
# 1. If you're trying to send an email to a Charter email address from
|
|
12
|
+
# a non-Charter email address (such as Gmail, Yahoo, Hotmail, etc.),
|
|
13
|
+
# you may receive an error that begins with AUP#I, followed by four numbers.
|
|
14
14
|
#
|
|
15
|
-
# 2. If you are trying to send an email from a Charter email address
|
|
16
|
-
# you may get an error code beginning with
|
|
15
|
+
# 2. If you are trying to send an email from a Charter email address
|
|
16
|
+
# to an outgoing recipient, you may get an error code beginning with
|
|
17
|
+
# AUP#O, also followed by four numbers.
|
|
17
18
|
#
|
|
18
|
-
1000
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
[
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
[
|
|
35
|
-
|
|
36
|
-
|
|
19
|
+
# 1000 Your IP address has been blocked due to suspicious activity. If you're a Spectrum
|
|
20
|
+
# customer using a Spectrum-issued IP, contact us. If you're using an IP address
|
|
21
|
+
# other than one provided by Spectrum, blocks will remain in place until they expire.
|
|
22
|
+
[1000, 0, 'blocked'],
|
|
23
|
+
|
|
24
|
+
# 1010 This email account has been blocked from sending emails due to suspicious activity.
|
|
25
|
+
# Blocks will expire based on the nature of the activity. If you're a Spectrum customer,
|
|
26
|
+
# change all of your Spectrum passwords to secure your account and then contact us.
|
|
27
|
+
[1010, 0, 'rejected'],
|
|
28
|
+
|
|
29
|
+
# 1020 This email account has limited access to send emails based on suspicious activity.
|
|
30
|
+
# 1080 Blocks will expire based on the nature of the activity.
|
|
31
|
+
# If you're a Spectrum customer, contact us to remove the block.
|
|
32
|
+
[1020, 1080, 'rejected'],
|
|
33
|
+
|
|
34
|
+
# 1090 The email you're trying to send can't be processed. Try sending again at a later time.
|
|
35
|
+
[1090, 0, 'systemerror'],
|
|
36
|
+
|
|
37
|
+
# 1100 The IP address you're trying to connect from has an issue with the Domain Name System.
|
|
38
|
+
# 1150 Spectrum requires a full circle DNS for emails to be allowed through. Verify the IP
|
|
39
|
+
# you're connecting from, and check the IP address to ensure a reverse DNS entry exists
|
|
40
|
+
# for the IP. If the IP address is a Spectrum-provided email address, contact us.
|
|
41
|
+
[1100, 1150, 'requireptr'],
|
|
42
|
+
|
|
43
|
+
# 1160 The email you tried to send goes against your domain's security policies.
|
|
44
|
+
# 1190 Please contact the email administrators of your domain.
|
|
45
|
+
[1160, 1190, 'policyviolation'],
|
|
46
|
+
|
|
47
|
+
# 1200 The IP address you're trying to send from has been flagged by Cloudmark CSI as
|
|
48
|
+
# 1210 potential spam. Have your IP administrator request a reset.
|
|
49
|
+
# Note: Cloudmark has sole discretion whether to remove the sending IP address from
|
|
50
|
+
# their lists.
|
|
51
|
+
[1200, 1210, 'blocked'],
|
|
52
|
+
|
|
53
|
+
# 1220 Your IP address has been blacklisted by Spamhaus. The owner of the IP address must
|
|
54
|
+
# 1250 contact Spamhaus to be removed from the list.
|
|
55
|
+
# Note: Spamhaus has sole discretion whether to remove the sending IP address from
|
|
56
|
+
# their lists.
|
|
57
|
+
[1220, 1250, 'blokced'],
|
|
58
|
+
|
|
59
|
+
# 1260 Spectrum doesn't process IPV6 addresses. Connect with an IPv4 address and try again.
|
|
60
|
+
[1260, 0, 'networkerror'],
|
|
61
|
+
|
|
62
|
+
# 1300 Spectrum limits the number of concurrent connections from a sender, as well as the
|
|
63
|
+
# 1340 total number of connections allowed. Limits vary based on the reputation of the IP
|
|
64
|
+
# address. Reduce your number of connections and try again later.
|
|
65
|
+
[1300, 1340, 'toomanyconn'],
|
|
66
|
+
|
|
67
|
+
# 1350 Spectrum limits emails by the number of messages sent, amount of recipients,
|
|
68
|
+
# 1490 potential for spam and invalid recipients.
|
|
69
|
+
[1350, 1490, 'speeding'],
|
|
70
|
+
|
|
71
|
+
# 1500 Your email was rejected for attempting to send as a different email address than you
|
|
72
|
+
# signed in under. Check that you're sending emails from the address you signed in with.
|
|
73
|
+
[1500, 0, 'rejected'],
|
|
74
|
+
|
|
75
|
+
# 1520 Your email was rejected for attempting to send as a different email address than a
|
|
76
|
+
# domain that we host. Check the outgoing email address and try again.
|
|
77
|
+
[1520, 0, 'rejected'],
|
|
78
|
+
|
|
79
|
+
# 1530 Your email was rejected because it's larger than the maximum size of 20MB.
|
|
80
|
+
[1530, 0, 'mesgtoobig'],
|
|
81
|
+
|
|
82
|
+
# 1540 Your emails were deferred for attempting to send too many in a single session.
|
|
83
|
+
# Reconnect and try reducing the number of emails you send at one time.
|
|
84
|
+
[1540, 0, 'speeding'],
|
|
85
|
+
|
|
86
|
+
# 1550 Your email was rejected for having too many recipients in one message. Reduce the
|
|
87
|
+
# number of recipients and try again later.
|
|
88
|
+
[1550, 0, 'speeding'],
|
|
89
|
+
|
|
90
|
+
# 1560 Your email was rejected for having too many invalid recipients. Check your outgoing
|
|
91
|
+
# email addresses and try again later.
|
|
92
|
+
[1560, 0, 'policyviolation'],
|
|
93
|
+
|
|
94
|
+
# 1580 You've tried to send messages to too many recipients in a short period of time.
|
|
95
|
+
# Wait a little while and try again later.
|
|
96
|
+
[1580, 0, 'speeding'],
|
|
37
97
|
].freeze
|
|
38
98
|
|
|
39
99
|
# Detect bounce reason from https://www.spectrum.com/
|
|
40
|
-
# @param [Sisimai::Fact] argvs
|
|
100
|
+
# @param [Sisimai::Fact] argvs Decoded email object
|
|
41
101
|
# @return [String, Nil] The bounce reason at Spectrum
|
|
42
102
|
# @since v4.25.8
|
|
43
103
|
def get(argvs)
|
|
44
|
-
|
|
45
|
-
|
|
104
|
+
issuedcode = argvs['diagnosticcode']
|
|
105
|
+
reasontext = ''
|
|
106
|
+
codenumber = if cv = issuedcode.match(/AUP#[-A-Za-z]*(\d{4})/) then cv[1].to_i else 0 end
|
|
46
107
|
|
|
47
|
-
|
|
48
|
-
#
|
|
49
|
-
codenumber
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
# Check the code range
|
|
108
|
+
ErrorCodes.each do |e|
|
|
109
|
+
# Try to find an error code matches with the code in the value of $diagnosticcode
|
|
110
|
+
if codenumber == e[0]
|
|
111
|
+
# [1500, 0, 'reason'] or [1500, 1550, 'reason']
|
|
112
|
+
reasontext = e[2]
|
|
113
|
+
break
|
|
114
|
+
else
|
|
115
|
+
# Check the code number is inlcuded the range like [1500, 1550, 'reason']
|
|
116
|
+
next if e[1] == 0
|
|
57
117
|
next if codenumber < e[0]
|
|
58
118
|
next if codenumber > e[1]
|
|
119
|
+
|
|
59
120
|
reasontext = e[2]
|
|
60
121
|
break
|
|
61
122
|
end
|
|
62
123
|
end
|
|
63
|
-
|
|
64
124
|
return reasontext
|
|
65
125
|
end
|
|
66
126
|
|
|
@@ -6,39 +6,60 @@ module Sisimai
|
|
|
6
6
|
module Tencent
|
|
7
7
|
class << self
|
|
8
8
|
MessagesOf = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
'
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
'
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
'
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
'
|
|
9
|
+
'authfailure' => [
|
|
10
|
+
'spf check failed', # https://service.mail.qq.com/detail/122/72
|
|
11
|
+
'dmarc check failed',
|
|
12
|
+
],
|
|
13
|
+
'blocked' => [
|
|
14
|
+
'suspected bounce attacks', # https://service.mail.qq.com/detail/122/57
|
|
15
|
+
'suspected spam ip', # https://service.mail.qq.com/detail/122/66
|
|
16
|
+
'connection denied', # https://service.mail.qq.com/detail/122/170
|
|
17
|
+
],
|
|
18
|
+
'mesgtoobig' => [
|
|
19
|
+
'message too large', # https://service.mail.qq.com/detail/122/168
|
|
20
|
+
],
|
|
21
|
+
'rejected' => [
|
|
22
|
+
'suspected spam', # https://service.mail.qq.com/detail/122/71
|
|
23
|
+
'mail is rejected by recipients', # https://service.mail.qq.com/detail/122/92
|
|
24
|
+
],
|
|
25
|
+
'spandetected' => [
|
|
26
|
+
'spam is embedded in the email', # https://service.mail.qq.com/detail/122/59
|
|
27
|
+
'mail content denied', # https://service.mail.qq.com/detail/122/171
|
|
28
|
+
],
|
|
29
|
+
'speeding' => [
|
|
30
|
+
'mailbox unavailable or access denined', # https://service.mail.qq.com/detail/122/166
|
|
31
|
+
],
|
|
32
|
+
'suspend' => [
|
|
33
|
+
'is a deactivated mailbox', # http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000742
|
|
34
|
+
],
|
|
35
|
+
'syntaxerror' => [
|
|
36
|
+
'bad address syntax', # https://service.mail.qq.com/detail/122/167
|
|
37
|
+
],
|
|
38
|
+
'toomanyconn' => [
|
|
39
|
+
'ip frequency limited', # https://service.mail.qq.com/detail/122/172
|
|
40
|
+
'domain frequency limited', # https://service.mail.qq.com/detail/122/173
|
|
41
|
+
'sender frequency limited', # https://service.mail.qq.com/detail/122/174
|
|
42
|
+
'connection frequency limited', # https://service.mail.qq.com/detail/122/175
|
|
43
|
+
],
|
|
44
|
+
'userunknown' => [
|
|
45
|
+
'mailbox not found', # https://service.mail.qq.com/detail/122/169
|
|
46
|
+
],
|
|
26
47
|
}.freeze
|
|
27
48
|
|
|
28
49
|
# Detect bounce reason from Tencent QQ
|
|
29
|
-
# @param [Sisimai::Fact] argvs
|
|
50
|
+
# @param [Sisimai::Fact] argvs Decoded email object
|
|
30
51
|
# @return [String] The bounce reason at Tencent QQ
|
|
31
52
|
def get(argvs)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
statusmesg = argvs['diagnosticcode'].downcase
|
|
53
|
+
issuedcode = argvs['diagnosticcode'].downcase
|
|
35
54
|
reasontext = ''
|
|
36
55
|
|
|
37
56
|
MessagesOf.each_key do |e|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
57
|
+
MessagesOf[e].each do |f|
|
|
58
|
+
next unless issuedcode.include?(f)
|
|
59
|
+
reasontext = e
|
|
60
|
+
break
|
|
61
|
+
end
|
|
62
|
+
break if reasontext.size > 0
|
|
42
63
|
end
|
|
43
64
|
return reasontext
|
|
44
65
|
end
|
|
@@ -0,0 +1,110 @@
|
|
|
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 "*.yahoodns.net".
|
|
5
|
+
# This class is called only Sisimai::Fact class.
|
|
6
|
+
module YahooInc
|
|
7
|
+
class << self
|
|
8
|
+
MessagesOf = {
|
|
9
|
+
'authfailure' => [
|
|
10
|
+
# - 550 5.7.9 This mail has been blocked because the sender is unauthenticated. Yahoo
|
|
11
|
+
# requires all senders to authenticate with either SPF or DKIM.
|
|
12
|
+
'yahoo requires all senders to authenticate with either spf or dkim',
|
|
13
|
+
],
|
|
14
|
+
'blocked' => [
|
|
15
|
+
# - 553 5.7.1 [BL21] Connections will not be accepted from 192.0.2.25,
|
|
16
|
+
# because the ip is in Spamhaus's list; see http://postmaster.yahoo.com/550-bl23.html
|
|
17
|
+
# - 553 5.7.1 [BL23] Connections not accepted from IP addresses on Spamhaus XBL;
|
|
18
|
+
# see http://postmaster.yahoo.com/errors/550-bl23.html [550]",
|
|
19
|
+
" because the ip is in spamhaus's list;",
|
|
20
|
+
'not accepted from ip addresses on spamhaus xbl',
|
|
21
|
+
],
|
|
22
|
+
'norelaying' => [
|
|
23
|
+
# - 550 relaying denied for <***@yahoo.com>
|
|
24
|
+
'relaying denied for ',
|
|
25
|
+
],
|
|
26
|
+
'notcomplaintrfc' => ['headers are not rfc compliant'],
|
|
27
|
+
'policyviolation' => [
|
|
28
|
+
# - 554 Message not allowed - [PH01] Email not accepted for policy reasons.
|
|
29
|
+
# Please visit https://postmaster.yahooinc.com/error-codes
|
|
30
|
+
# - 554 5.7.9 Message not accepted for policy reasons.
|
|
31
|
+
# See https://postmaster.yahooinc.com/error-codes
|
|
32
|
+
'not accepted for policy reasons',
|
|
33
|
+
],
|
|
34
|
+
'rejected' => [
|
|
35
|
+
# Observed the following error message since around March 2024:
|
|
36
|
+
#
|
|
37
|
+
# - 421 4.7.0 [TSS04] Messages from 192.0.2.25 temporarily deferred due to unexpected
|
|
38
|
+
# volume or user complaints - 4.16.55.1;
|
|
39
|
+
# see https://postmaster.yahooinc.com/error-codes (in reply to MAIL FROM command))
|
|
40
|
+
#
|
|
41
|
+
# However, the same error message is returned even for domains that are considered to
|
|
42
|
+
# have a poor reputation without SPF, DKIM, or DMARC settings, or for other reasons.
|
|
43
|
+
# It seems that the error message is not as granular as Google's.
|
|
44
|
+
'temporarily deferred due to unexpected volume or user complaints',
|
|
45
|
+
|
|
46
|
+
# - 451 Message temporarily deferred due to unresolvable RFC.5321 from domain.
|
|
47
|
+
# See https://senders.yahooinc.com/error-codes#unresolvable-from-domain
|
|
48
|
+
'due to unresolvable rfc.5321 domain',
|
|
49
|
+
|
|
50
|
+
# - 553 5.7.2 [TSS09] All messages from 192.0.2.25 will be permanently deferred;
|
|
51
|
+
# Retrying will NOT succeed. See https://postmaster.yahooinc.com/error-codes
|
|
52
|
+
# - 553 5.7.2 [TSS11] All messages from 192.0.2.25 will be permanently deferred;
|
|
53
|
+
# Retrying will NOT succeed. See https://postmaster.yahooinc.com/error-codes
|
|
54
|
+
' will be permanently deferred',
|
|
55
|
+
],
|
|
56
|
+
'speeding' => [
|
|
57
|
+
# - 450 User is receiving mail too quickly
|
|
58
|
+
'user is receiving mail too quickly',
|
|
59
|
+
],
|
|
60
|
+
'suspend' => [
|
|
61
|
+
# - 554 delivery error: dd ****@yahoo.com is no longer valid.
|
|
62
|
+
# - 554 30 Sorry, your message to *****@aol.jp cannot be delivered.
|
|
63
|
+
# This mailbox is disabled (554.30)
|
|
64
|
+
' is no longer valid.',
|
|
65
|
+
'this mailbox is disabled',
|
|
66
|
+
],
|
|
67
|
+
'syntaxerror' => [
|
|
68
|
+
# - 501 Syntax error in parameters or arguments
|
|
69
|
+
'syntax error in parameters or arguments',
|
|
70
|
+
],
|
|
71
|
+
'toomanyconn' => [
|
|
72
|
+
# - 421 Max message per connection reached, closing transmission channel
|
|
73
|
+
'max message per connection reached',
|
|
74
|
+
],
|
|
75
|
+
'userunknown' => [
|
|
76
|
+
# - 554 delivery error: dd This user doesn't have a yahoo.com account (***@yahoo.com)
|
|
77
|
+
# - 552 1 Requested mail action aborted, mailbox not found (in reply to end of DATA command)
|
|
78
|
+
"dd this user doesn't have a ",
|
|
79
|
+
'mailbox not found',
|
|
80
|
+
],
|
|
81
|
+
}.freeze
|
|
82
|
+
|
|
83
|
+
# Detect bounce reason from Yahoo Inc. (*.yahoodns.net)
|
|
84
|
+
# @param [Sisimai::Fact] argvs Decoded email object
|
|
85
|
+
# @return [String] The bounce reason for YahooInc
|
|
86
|
+
# @see https://senders.yahooinc.com/smtp-error-codes
|
|
87
|
+
# https://smtpfieldmanual.com/provider/yahoo
|
|
88
|
+
# https://www.postmastery.com/yahoo-postmaster/
|
|
89
|
+
# @since v5.1.0
|
|
90
|
+
def get(argvs)
|
|
91
|
+
issuedcode = argvs['diagnosticcode'].downcase
|
|
92
|
+
reasontext = ''
|
|
93
|
+
|
|
94
|
+
MessagesOf.each_key do |e|
|
|
95
|
+
MessagesOf[e].each do |f|
|
|
96
|
+
next unless issuedcode.include?(f)
|
|
97
|
+
reasontext = e
|
|
98
|
+
break
|
|
99
|
+
end
|
|
100
|
+
break if reasontext.size > 0
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
return reasontext
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
data/lib/sisimai/rhost.rb
CHANGED
|
@@ -5,49 +5,41 @@ module Sisimai
|
|
|
5
5
|
module Rhost
|
|
6
6
|
class << self
|
|
7
7
|
RhostClass = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
'Apple' => ['.mail.icloud.com', '.apple.com', '.me.com'],
|
|
9
|
+
'Cox' => ['cox.net'],
|
|
10
|
+
'FrancePTT' => ['.laposte.net', '.orange.fr', '.wanadoo.fr'],
|
|
11
|
+
'GoDaddy' => ['smtp.secureserver.net', 'mailstore1.secureserver.net'],
|
|
12
|
+
'Google' => ['aspmx.l.google.com', 'gmail-smtp-in.l.google.com'],
|
|
13
|
+
'IUA' => ['.email.ua'],
|
|
14
|
+
'KDDI' => ['.ezweb.ne.jp', 'msmx.au.com'],
|
|
15
|
+
'Microsoft' => ['.prod.outlook.com', '.protection.outlook.com'],
|
|
16
|
+
'Mimecast' => ['.mimecast.com'],
|
|
17
|
+
'NTTDOCOMO' => ['mfsmax.docomo.ne.jp'],
|
|
18
|
+
'Spectrum' => ['charter.net'],
|
|
19
|
+
'Tencent' => ['.qq.com'],
|
|
20
|
+
'YahooInc' => ['.yahoodns.net'],
|
|
19
21
|
}.freeze
|
|
20
22
|
|
|
21
|
-
# The value of "rhost" is listed in RhostClass or not
|
|
22
|
-
# @param [String] argvs Remote host name
|
|
23
|
-
# @return [True,False] True: matched
|
|
24
|
-
# False: did not match
|
|
25
|
-
def match(rhost)
|
|
26
|
-
return false if rhost.empty?
|
|
27
|
-
|
|
28
|
-
host0 = rhost.downcase
|
|
29
|
-
match = false
|
|
30
|
-
RhostClass.each_key do |e|
|
|
31
|
-
# Try to match with each key of RhostClass
|
|
32
|
-
next unless RhostClass[e].any? { |a| host0.end_with?(a) }
|
|
33
|
-
match = true
|
|
34
|
-
break
|
|
35
|
-
end
|
|
36
|
-
return match
|
|
37
|
-
end
|
|
38
|
-
|
|
39
23
|
# Detect the bounce reason from certain remote hosts
|
|
40
|
-
# @param [Hash] argvs
|
|
41
|
-
# @param [String] proxy The alternative of the "rhost"
|
|
24
|
+
# @param [Hash] argvs Decoded email data
|
|
42
25
|
# @return [String] The value of bounce reason
|
|
43
|
-
def get(argvs
|
|
44
|
-
|
|
26
|
+
def get(argvs)
|
|
27
|
+
return nil if argvs['diagnosticcode'].empty?
|
|
28
|
+
|
|
29
|
+
remotehost = argvs['rhost'].downcase
|
|
30
|
+
domainpart = argvs['destination'].downcase
|
|
31
|
+
return nil if (remotehost + domainpart).empty?
|
|
32
|
+
|
|
33
|
+
rhostmatch = nil
|
|
45
34
|
rhostclass = ''
|
|
46
35
|
modulename = ''
|
|
47
36
|
|
|
48
37
|
RhostClass.each_key do |e|
|
|
49
|
-
# Try to match with each
|
|
50
|
-
|
|
38
|
+
# Try to match with each value of RhostClass
|
|
39
|
+
rhostmatch = true if RhostClass[e].any? { |a| remotehost.end_with?(a) }
|
|
40
|
+
rhostmatch ||= true if RhostClass[e].any? { |a| domainpart.end_with?(a) }
|
|
41
|
+
next unless rhostmatch
|
|
42
|
+
|
|
51
43
|
modulename = 'Sisimai::Rhost::' << e
|
|
52
44
|
rhostclass = 'sisimai/rhost/' << e.downcase
|
|
53
45
|
break
|
|
@@ -56,6 +48,7 @@ module Sisimai
|
|
|
56
48
|
|
|
57
49
|
require rhostclass
|
|
58
50
|
reasontext = Module.const_get(modulename).get(argvs)
|
|
51
|
+
return nil if reasontext.empty?
|
|
59
52
|
return reasontext
|
|
60
53
|
end
|
|
61
54
|
end
|
data/lib/sisimai/smtp/reply.rb
CHANGED
|
@@ -125,9 +125,10 @@ module Sisimai
|
|
|
125
125
|
|
|
126
126
|
if first == 2
|
|
127
127
|
# 2yz
|
|
128
|
-
return
|
|
129
|
-
return false if reply
|
|
130
|
-
return false if reply >
|
|
128
|
+
return true if reply == 235
|
|
129
|
+
return false if reply < 211
|
|
130
|
+
return false if reply > 252
|
|
131
|
+
return false if reply > 221 && reply < 250
|
|
131
132
|
return true
|
|
132
133
|
end
|
|
133
134
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
module Sisimai
|
|
2
2
|
module SMTP
|
|
3
|
-
# Sisimai::SMTP::Transcript is a
|
|
3
|
+
# Sisimai::SMTP::Transcript is a decoder for the transcript logs of the SMTP session
|
|
4
4
|
module Transcript
|
|
5
5
|
class << self
|
|
6
6
|
require 'sisimai/smtp/reply'
|
|
7
7
|
require 'sisimai/smtp/status'
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# @abstract decodes the transcript of the SMTP session and makes structured data
|
|
10
10
|
# @param [String] argv0 A transcript text MTA returned
|
|
11
11
|
# @param [String] argv1 A label string of a SMTP client
|
|
12
12
|
# @apram [String] argv2 A label string of a SMTP server
|
|
13
13
|
# @return [Array] Structured data
|
|
14
|
-
# [Nil] Failed to
|
|
14
|
+
# [Nil] Failed to decode or the 1st argument is missing
|
|
15
15
|
# @since v5.0.0
|
|
16
16
|
def rise(argv0 = '', argv1 = '>>>', argv2 = '<<<')
|
|
17
17
|
return nil if argv0.size == 0
|
data/lib/sisimai/version.rb
CHANGED
data/lib/sisimai.rb
CHANGED
|
@@ -7,12 +7,6 @@ module Sisimai
|
|
|
7
7
|
def version(); return Sisimai::VERSION; end
|
|
8
8
|
def libname(); return 'Sisimai'; end
|
|
9
9
|
|
|
10
|
-
# Emulate "rise" method for the backward compatible
|
|
11
|
-
def make(argv0, **argv1)
|
|
12
|
-
warn ' ***warning: Sisimai.make will be removed at v5.1.0. Use Sisimai.rise instead';
|
|
13
|
-
return Sisimai.rise(argv0, **argv1)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
10
|
# Wrapper method for decoding mailbox/maidir
|
|
17
11
|
# @param [String] argv0 Path to mbox or Maildir/
|
|
18
12
|
# @param [Hash] argv0 or Hash (decoded JSON)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
Received: from MAILER-DAEMON
|
|
2
|
+
id e0720
|
|
3
|
+
by df.example.jp (DragonFly Mail Agent v0.13);
|
|
4
|
+
Tue, 11 Jun 2024 18:02:02 +0900
|
|
5
|
+
X-Original-To: <pseudo-local-part@google.example.com>
|
|
6
|
+
From: MAILER-DAEMON <>
|
|
7
|
+
To: kijitora@df.example.jp
|
|
8
|
+
Subject: Mail delivery failed
|
|
9
|
+
Message-Id: <e0720@df.example.jp>
|
|
10
|
+
Date: Tue, 11 Jun 2024 18:02:02 +0900
|
|
11
|
+
|
|
12
|
+
This is the DragonFly Mail Agent v0.13 at df.example.jp.
|
|
13
|
+
|
|
14
|
+
There was an error delivering your mail to <pseudo-local-part@google.example.com>.
|
|
15
|
+
|
|
16
|
+
gmail-smtp-in.l.google.com [74.125.203.27] did not like our final DATA:
|
|
17
|
+
550-5.7.26 Unauthenticated email from example.jp is not accepted due to domain's
|
|
18
|
+
550-5.7.26 DMARC policy. Please contact the administrator of example.jp domain if
|
|
19
|
+
550-5.7.26 this was a legitimate mail. To learn about the DMARC initiative, go
|
|
20
|
+
550-5.7.26 to
|
|
21
|
+
550 5.7.26 https://support.google.com/mail/?p=DmarcRejection 98e67ed59e1d1-2c2d0e28189si6418580a91.13 - gsmtp
|
|
22
|
+
|
|
23
|
+
Message headers follow.
|
|
24
|
+
|
|
25
|
+
Received: from root (uid 0)
|
|
26
|
+
(envelope-from kijitora@df.example.jp)
|
|
27
|
+
id e06d1
|
|
28
|
+
by df.example.jp (DragonFly Mail Agent v0.13);
|
|
29
|
+
Tue, 11 Jun 2024 18:02:00 +0900
|
|
30
|
+
Subject: Nyaan 01
|
|
31
|
+
To: <pseudo-local-part@google.example.com>
|
|
32
|
+
User-Agent: mail (GNU Mailutils 3.14)
|
|
33
|
+
Date: Tue, 11 Jun 2024 18:02:00 +0900
|
|
34
|
+
Message-Id: <66681288.e06d1.3824794@df.example.jp>
|
|
35
|
+
From: <kijitora@df.example.jp>
|
|
36
|
+
|