sisimai 4.14.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sisimai might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rubocop.yml +165 -0
- data/.travis.yml +21 -0
- data/ANALYTICAL-PRECISION +54 -0
- data/Changes +5 -0
- data/Developers.mk +129 -0
- data/Gemfile +9 -0
- data/LICENSE +26 -0
- data/Makefile +56 -0
- data/README.md +300 -0
- data/Rakefile +7 -0
- data/Repository.mk +69 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/sisimai.rb +60 -0
- data/lib/sisimai/address.rb +218 -0
- data/lib/sisimai/arf.rb +343 -0
- data/lib/sisimai/data.rb +413 -0
- data/lib/sisimai/data/json.rb +36 -0
- data/lib/sisimai/data/yaml.rb +32 -0
- data/lib/sisimai/datetime.rb +518 -0
- data/lib/sisimai/mail.rb +82 -0
- data/lib/sisimai/mail/maildir.rb +85 -0
- data/lib/sisimai/mail/mbox.rb +69 -0
- data/lib/sisimai/mail/stdin.rb +52 -0
- data/lib/sisimai/mda.rb +152 -0
- data/lib/sisimai/message.rb +510 -0
- data/lib/sisimai/mime.rb +127 -0
- data/lib/sisimai/msp.rb +54 -0
- data/lib/sisimai/msp/de/einsundeins.rb +174 -0
- data/lib/sisimai/msp/de/gmx.rb +197 -0
- data/lib/sisimai/msp/jp/biglobe.rb +179 -0
- data/lib/sisimai/msp/jp/ezweb.rb +292 -0
- data/lib/sisimai/msp/jp/kddi.rb +195 -0
- data/lib/sisimai/msp/ru/mailru.rb +306 -0
- data/lib/sisimai/msp/ru/yandex.rb +241 -0
- data/lib/sisimai/msp/uk/messagelabs.rb +250 -0
- data/lib/sisimai/msp/us/amazonses.rb +248 -0
- data/lib/sisimai/msp/us/aol.rb +234 -0
- data/lib/sisimai/msp/us/bigfoot.rb +243 -0
- data/lib/sisimai/msp/us/facebook.rb +306 -0
- data/lib/sisimai/msp/us/google.rb +357 -0
- data/lib/sisimai/msp/us/outlook.rb +243 -0
- data/lib/sisimai/msp/us/receivingses.rb +247 -0
- data/lib/sisimai/msp/us/sendgrid.rb +257 -0
- data/lib/sisimai/msp/us/verizon.rb +311 -0
- data/lib/sisimai/msp/us/yahoo.rb +178 -0
- data/lib/sisimai/msp/us/zoho.rb +198 -0
- data/lib/sisimai/mta.rb +55 -0
- data/lib/sisimai/mta/activehunter.rb +155 -0
- data/lib/sisimai/mta/apachejames.rb +194 -0
- data/lib/sisimai/mta/courier.rb +307 -0
- data/lib/sisimai/mta/domino.rb +209 -0
- data/lib/sisimai/mta/exchange.rb +314 -0
- data/lib/sisimai/mta/exim.rb +549 -0
- data/lib/sisimai/mta/imailserver.rb +227 -0
- data/lib/sisimai/mta/interscanmss.rb +167 -0
- data/lib/sisimai/mta/mailfoundry.rb +173 -0
- data/lib/sisimai/mta/mailmarshalsmtp.rb +206 -0
- data/lib/sisimai/mta/mcafee.rb +201 -0
- data/lib/sisimai/mta/messagingserver.rb +241 -0
- data/lib/sisimai/mta/mfilter.rb +190 -0
- data/lib/sisimai/mta/mxlogic.rb +283 -0
- data/lib/sisimai/mta/notes.rb +206 -0
- data/lib/sisimai/mta/opensmtpd.rb +225 -0
- data/lib/sisimai/mta/postfix.rb +306 -0
- data/lib/sisimai/mta/qmail.rb +335 -0
- data/lib/sisimai/mta/sendmail.rb +317 -0
- data/lib/sisimai/mta/surfcontrol.rb +193 -0
- data/lib/sisimai/mta/userdefined.rb +148 -0
- data/lib/sisimai/mta/v5sendmail.rb +232 -0
- data/lib/sisimai/mta/x1.rb +156 -0
- data/lib/sisimai/mta/x2.rb +157 -0
- data/lib/sisimai/mta/x3.rb +171 -0
- data/lib/sisimai/mta/x4.rb +365 -0
- data/lib/sisimai/mta/x5.rb +208 -0
- data/lib/sisimai/order.rb +217 -0
- data/lib/sisimai/reason.rb +235 -0
- data/lib/sisimai/reason/blocked.rb +105 -0
- data/lib/sisimai/reason/contenterror.rb +53 -0
- data/lib/sisimai/reason/exceedlimit.rb +60 -0
- data/lib/sisimai/reason/expired.rb +53 -0
- data/lib/sisimai/reason/filtered.rb +98 -0
- data/lib/sisimai/reason/hasmoved.rb +45 -0
- data/lib/sisimai/reason/hostunknown.rb +74 -0
- data/lib/sisimai/reason/mailboxfull.rb +118 -0
- data/lib/sisimai/reason/mailererror.rb +55 -0
- data/lib/sisimai/reason/mesgtoobig.rb +77 -0
- data/lib/sisimai/reason/networkerror.rb +57 -0
- data/lib/sisimai/reason/norelaying.rb +71 -0
- data/lib/sisimai/reason/notaccept.rb +63 -0
- data/lib/sisimai/reason/onhold.rb +45 -0
- data/lib/sisimai/reason/rejected.rb +101 -0
- data/lib/sisimai/reason/securityerror.rb +72 -0
- data/lib/sisimai/reason/spamdetected.rb +172 -0
- data/lib/sisimai/reason/suspend.rb +58 -0
- data/lib/sisimai/reason/systemerror.rb +69 -0
- data/lib/sisimai/reason/systemfull.rb +45 -0
- data/lib/sisimai/reason/toomanyconn.rb +73 -0
- data/lib/sisimai/reason/userunknown.rb +194 -0
- data/lib/sisimai/rfc2606.rb +24 -0
- data/lib/sisimai/rfc3464.rb +497 -0
- data/lib/sisimai/rfc3834.rb +150 -0
- data/lib/sisimai/rfc5322.rb +204 -0
- data/lib/sisimai/rhost.rb +47 -0
- data/lib/sisimai/rhost/googleapps.rb +237 -0
- data/lib/sisimai/smtp.rb +58 -0
- data/lib/sisimai/smtp/reply.rb +81 -0
- data/lib/sisimai/smtp/status.rb +755 -0
- data/lib/sisimai/string.rb +65 -0
- data/lib/sisimai/time.rb +11 -0
- data/lib/sisimai/version.rb +4 -0
- data/set-of-emails/README.md +35 -0
- data/set-of-emails/mailbox/mbox-0 +2467 -0
- data/set-of-emails/mailbox/mbox-1 +71 -0
- data/set-of-emails/maildir/bsd/README.md +261 -0
- data/set-of-emails/maildir/bsd/activehunter-01.eml +54 -0
- data/set-of-emails/maildir/bsd/activehunter-02.eml +53 -0
- data/set-of-emails/maildir/bsd/apachejames-01.eml +46 -0
- data/set-of-emails/maildir/bsd/arf-01.eml +66 -0
- data/set-of-emails/maildir/bsd/arf-02.eml +68 -0
- data/set-of-emails/maildir/bsd/arf-03.eml +56 -0
- data/set-of-emails/maildir/bsd/arf-04.eml +89 -0
- data/set-of-emails/maildir/bsd/arf-05.eml +82 -0
- data/set-of-emails/maildir/bsd/arf-06.eml +166 -0
- data/set-of-emails/maildir/bsd/arf-07.eml +59 -0
- data/set-of-emails/maildir/bsd/arf-08.eml +103 -0
- data/set-of-emails/maildir/bsd/arf-09.eml +104 -0
- data/set-of-emails/maildir/bsd/arf-10.eml +56 -0
- data/set-of-emails/maildir/bsd/arf-11.eml +37 -0
- data/set-of-emails/maildir/bsd/arf-12.eml +40 -0
- data/set-of-emails/maildir/bsd/arf-13.eml +76 -0
- data/set-of-emails/maildir/bsd/arf-14.eml +333 -0
- data/set-of-emails/maildir/bsd/arf-15.eml +66 -0
- data/set-of-emails/maildir/bsd/courier-01.eml +79 -0
- data/set-of-emails/maildir/bsd/courier-02.eml +83 -0
- data/set-of-emails/maildir/bsd/courier-03.eml +85 -0
- data/set-of-emails/maildir/bsd/courier-04.eml +87 -0
- data/set-of-emails/maildir/bsd/de-einsundeins-01.eml +38 -0
- data/set-of-emails/maildir/bsd/de-gmx-01.eml +52 -0
- data/set-of-emails/maildir/bsd/de-gmx-02.eml +51 -0
- data/set-of-emails/maildir/bsd/de-gmx-03.eml +56 -0
- data/set-of-emails/maildir/bsd/de-gmx-04.eml +51 -0
- data/set-of-emails/maildir/bsd/domino-01.eml +33 -0
- data/set-of-emails/maildir/bsd/domino-02.eml +83 -0
- data/set-of-emails/maildir/bsd/exchange-01.eml +31 -0
- data/set-of-emails/maildir/bsd/exchange-02.eml +67 -0
- data/set-of-emails/maildir/bsd/exchange-03.eml +52 -0
- data/set-of-emails/maildir/bsd/exchange-04.eml +28 -0
- data/set-of-emails/maildir/bsd/exchange-05.eml +56 -0
- data/set-of-emails/maildir/bsd/exchange-06.eml +151 -0
- data/set-of-emails/maildir/bsd/exim-01.eml +46 -0
- data/set-of-emails/maildir/bsd/exim-02.eml +41 -0
- data/set-of-emails/maildir/bsd/exim-03.eml +42 -0
- data/set-of-emails/maildir/bsd/exim-04.eml +46 -0
- data/set-of-emails/maildir/bsd/exim-05.eml +49 -0
- data/set-of-emails/maildir/bsd/exim-06.eml +44 -0
- data/set-of-emails/maildir/bsd/exim-07.eml +28 -0
- data/set-of-emails/maildir/bsd/exim-08.eml +42 -0
- data/set-of-emails/maildir/bsd/exim-09.eml +169 -0
- data/set-of-emails/maildir/bsd/exim-10.eml +718 -0
- data/set-of-emails/maildir/bsd/exim-11.eml +718 -0
- data/set-of-emails/maildir/bsd/exim-12.eml +75 -0
- data/set-of-emails/maildir/bsd/exim-13.eml +145 -0
- data/set-of-emails/maildir/bsd/exim-14.eml +32 -0
- data/set-of-emails/maildir/bsd/exim-15.eml +49 -0
- data/set-of-emails/maildir/bsd/exim-16.eml +98 -0
- data/set-of-emails/maildir/bsd/exim-17.eml +50 -0
- data/set-of-emails/maildir/bsd/exim-18.eml +96 -0
- data/set-of-emails/maildir/bsd/exim-19.eml +52 -0
- data/set-of-emails/maildir/bsd/exim-20.eml +159 -0
- data/set-of-emails/maildir/bsd/exim-21.eml +150 -0
- data/set-of-emails/maildir/bsd/exim-22.eml +50 -0
- data/set-of-emails/maildir/bsd/exim-23.eml +57 -0
- data/set-of-emails/maildir/bsd/exim-24.eml +107 -0
- data/set-of-emails/maildir/bsd/exim-25.eml +18 -0
- data/set-of-emails/maildir/bsd/exim-26.eml +111 -0
- data/set-of-emails/maildir/bsd/exim-27.eml +120 -0
- data/set-of-emails/maildir/bsd/exim-28.eml +148 -0
- data/set-of-emails/maildir/bsd/google-apps-01.eml +66 -0
- data/set-of-emails/maildir/bsd/imailserver-01.eml +27 -0
- data/set-of-emails/maildir/bsd/imailserver-02.eml +36 -0
- data/set-of-emails/maildir/bsd/imailserver-03.eml +28 -0
- data/set-of-emails/maildir/bsd/imailserver-04.eml +15 -0
- data/set-of-emails/maildir/bsd/imailserver-05.eml +92 -0
- data/set-of-emails/maildir/bsd/imailserver-06.eml +29 -0
- data/set-of-emails/maildir/bsd/interscanmss-01.eml +49 -0
- data/set-of-emails/maildir/bsd/interscanmss-02.eml +259 -0
- data/set-of-emails/maildir/bsd/jp-biglobe-01.eml +43 -0
- data/set-of-emails/maildir/bsd/jp-ezweb-01.eml +36 -0
- data/set-of-emails/maildir/bsd/jp-ezweb-02.eml +65 -0
- data/set-of-emails/maildir/bsd/jp-ezweb-03.eml +35 -0
- data/set-of-emails/maildir/bsd/jp-ezweb-04.eml +38 -0
- data/set-of-emails/maildir/bsd/jp-ezweb-05.eml +38 -0
- data/set-of-emails/maildir/bsd/jp-ezweb-06.eml +33 -0
- data/set-of-emails/maildir/bsd/jp-kddi-01.eml +49 -0
- data/set-of-emails/maildir/bsd/jp-kddi-02.eml +54 -0
- data/set-of-emails/maildir/bsd/jp-kddi-03.eml +54 -0
- data/set-of-emails/maildir/bsd/mailfoundry-01.eml +50 -0
- data/set-of-emails/maildir/bsd/mailfoundry-02.eml +49 -0
- data/set-of-emails/maildir/bsd/mailmarshalsmtp-01.eml +43 -0
- data/set-of-emails/maildir/bsd/mcafee-01.eml +63 -0
- data/set-of-emails/maildir/bsd/mcafee-02.eml +65 -0
- data/set-of-emails/maildir/bsd/mcafee-03.eml +59 -0
- data/set-of-emails/maildir/bsd/messagingserver-01.eml +102 -0
- data/set-of-emails/maildir/bsd/messagingserver-02.eml +72 -0
- data/set-of-emails/maildir/bsd/messagingserver-03.eml +70 -0
- data/set-of-emails/maildir/bsd/messagingserver-04.eml +102 -0
- data/set-of-emails/maildir/bsd/messagingserver-05.eml +98 -0
- data/set-of-emails/maildir/bsd/messagingserver-06.eml +101 -0
- data/set-of-emails/maildir/bsd/messagingserver-07.eml +129 -0
- data/set-of-emails/maildir/bsd/mfilter-01.eml +49 -0
- data/set-of-emails/maildir/bsd/mfilter-02.eml +48 -0
- data/set-of-emails/maildir/bsd/mfilter-03.eml +43 -0
- data/set-of-emails/maildir/bsd/mxlogic-01.eml +47 -0
- data/set-of-emails/maildir/bsd/mxlogic-02.eml +44 -0
- data/set-of-emails/maildir/bsd/mxlogic-03.eml +46 -0
- data/set-of-emails/maildir/bsd/notes-01.eml +42 -0
- data/set-of-emails/maildir/bsd/notes-02.eml +42 -0
- data/set-of-emails/maildir/bsd/notes-03.eml +38 -0
- data/set-of-emails/maildir/bsd/notes-04.eml +181 -0
- data/set-of-emails/maildir/bsd/opensmtpd-01.eml +33 -0
- data/set-of-emails/maildir/bsd/opensmtpd-02.eml +33 -0
- data/set-of-emails/maildir/bsd/opensmtpd-03.eml +36 -0
- data/set-of-emails/maildir/bsd/opensmtpd-04.eml +40 -0
- data/set-of-emails/maildir/bsd/opensmtpd-05.eml +36 -0
- data/set-of-emails/maildir/bsd/postfix-01.eml +60 -0
- data/set-of-emails/maildir/bsd/postfix-02.eml +78 -0
- data/set-of-emails/maildir/bsd/postfix-03.eml +71 -0
- data/set-of-emails/maildir/bsd/postfix-04.eml +89 -0
- data/set-of-emails/maildir/bsd/postfix-05.eml +78 -0
- data/set-of-emails/maildir/bsd/postfix-06.eml +72 -0
- data/set-of-emails/maildir/bsd/postfix-07.eml +74 -0
- data/set-of-emails/maildir/bsd/postfix-08.eml +78 -0
- data/set-of-emails/maildir/bsd/postfix-09.eml +76 -0
- data/set-of-emails/maildir/bsd/postfix-10.eml +73 -0
- data/set-of-emails/maildir/bsd/postfix-11.eml +86 -0
- data/set-of-emails/maildir/bsd/postfix-12.eml +71 -0
- data/set-of-emails/maildir/bsd/postfix-13.eml +81 -0
- data/set-of-emails/maildir/bsd/postfix-14.eml +68 -0
- data/set-of-emails/maildir/bsd/postfix-15.eml +69 -0
- data/set-of-emails/maildir/bsd/postfix-16.eml +73 -0
- data/set-of-emails/maildir/bsd/postfix-17.eml +68 -0
- data/set-of-emails/maildir/bsd/postfix-18.eml +121 -0
- data/set-of-emails/maildir/bsd/postfix-19.eml +105 -0
- data/set-of-emails/maildir/bsd/postfix-20.eml +231 -0
- data/set-of-emails/maildir/bsd/postfix-21.eml +60 -0
- data/set-of-emails/maildir/bsd/qmail-01.eml +40 -0
- data/set-of-emails/maildir/bsd/qmail-02.eml +35 -0
- data/set-of-emails/maildir/bsd/qmail-03.eml +22 -0
- data/set-of-emails/maildir/bsd/qmail-04.eml +31 -0
- data/set-of-emails/maildir/bsd/qmail-05.eml +31 -0
- data/set-of-emails/maildir/bsd/qmail-06.eml +39 -0
- data/set-of-emails/maildir/bsd/qmail-07.eml +22 -0
- data/set-of-emails/maildir/bsd/qmail-08.eml +23 -0
- data/set-of-emails/maildir/bsd/qmail-09.eml +103 -0
- data/set-of-emails/maildir/bsd/rfc3464-01.eml +60 -0
- data/set-of-emails/maildir/bsd/rfc3464-02.eml +43 -0
- data/set-of-emails/maildir/bsd/rfc3464-03.eml +40 -0
- data/set-of-emails/maildir/bsd/rfc3464-04.eml +50 -0
- data/set-of-emails/maildir/bsd/rfc3464-05.eml +63 -0
- data/set-of-emails/maildir/bsd/rfc3464-06.eml +48 -0
- data/set-of-emails/maildir/bsd/rfc3464-07.eml +88 -0
- data/set-of-emails/maildir/bsd/rfc3464-08.eml +70 -0
- data/set-of-emails/maildir/bsd/rfc3464-09.eml +93 -0
- data/set-of-emails/maildir/bsd/rfc3464-10.eml +467 -0
- data/set-of-emails/maildir/bsd/rfc3464-11.eml +1171 -0
- data/set-of-emails/maildir/bsd/rfc3464-12.eml +101 -0
- data/set-of-emails/maildir/bsd/rfc3464-13.eml +131 -0
- data/set-of-emails/maildir/bsd/rfc3464-14.eml +121 -0
- data/set-of-emails/maildir/bsd/rfc3464-15.eml +144 -0
- data/set-of-emails/maildir/bsd/rfc3464-16.eml +36 -0
- data/set-of-emails/maildir/bsd/rfc3464-17.eml +109 -0
- data/set-of-emails/maildir/bsd/rfc3464-18.eml +149 -0
- data/set-of-emails/maildir/bsd/rfc3464-19.eml +65 -0
- data/set-of-emails/maildir/bsd/rfc3464-20.eml +145 -0
- data/set-of-emails/maildir/bsd/rfc3464-21.eml +146 -0
- data/set-of-emails/maildir/bsd/rfc3464-22.eml +105 -0
- data/set-of-emails/maildir/bsd/rfc3464-23.eml +21 -0
- data/set-of-emails/maildir/bsd/rfc3464-24.eml +27 -0
- data/set-of-emails/maildir/bsd/rfc3464-25.eml +33 -0
- data/set-of-emails/maildir/bsd/rfc3464-26.eml +98 -0
- data/set-of-emails/maildir/bsd/rfc3464-27.eml +180 -0
- data/set-of-emails/maildir/bsd/rfc3834-01.eml +37 -0
- data/set-of-emails/maildir/bsd/rfc3834-02.eml +51 -0
- data/set-of-emails/maildir/bsd/rfc3834-03.eml +33 -0
- data/set-of-emails/maildir/bsd/ru-mailru-01.eml +54 -0
- data/set-of-emails/maildir/bsd/ru-mailru-02.eml +54 -0
- data/set-of-emails/maildir/bsd/ru-mailru-03.eml +62 -0
- data/set-of-emails/maildir/bsd/ru-mailru-04.eml +54 -0
- data/set-of-emails/maildir/bsd/ru-yandex-01.eml +102 -0
- data/set-of-emails/maildir/bsd/ru-yandex-02.eml +113 -0
- data/set-of-emails/maildir/bsd/ru-yandex-03.eml +101 -0
- data/set-of-emails/maildir/bsd/sendmail-01.eml +70 -0
- data/set-of-emails/maildir/bsd/sendmail-02.eml +82 -0
- data/set-of-emails/maildir/bsd/sendmail-03.eml +76 -0
- data/set-of-emails/maildir/bsd/sendmail-04.eml +63 -0
- data/set-of-emails/maildir/bsd/sendmail-05.eml +64 -0
- data/set-of-emails/maildir/bsd/sendmail-06.eml +67 -0
- data/set-of-emails/maildir/bsd/sendmail-07.eml +65 -0
- data/set-of-emails/maildir/bsd/sendmail-08.eml +62 -0
- data/set-of-emails/maildir/bsd/sendmail-09.eml +60 -0
- data/set-of-emails/maildir/bsd/sendmail-10.eml +82 -0
- data/set-of-emails/maildir/bsd/sendmail-11.eml +60 -0
- data/set-of-emails/maildir/bsd/sendmail-12.eml +62 -0
- data/set-of-emails/maildir/bsd/sendmail-13.eml +66 -0
- data/set-of-emails/maildir/bsd/sendmail-14.eml +64 -0
- data/set-of-emails/maildir/bsd/sendmail-15.eml +60 -0
- data/set-of-emails/maildir/bsd/sendmail-16.eml +69 -0
- data/set-of-emails/maildir/bsd/sendmail-17.eml +68 -0
- data/set-of-emails/maildir/bsd/sendmail-18.eml +64 -0
- data/set-of-emails/maildir/bsd/sendmail-19.eml +71 -0
- data/set-of-emails/maildir/bsd/sendmail-20.eml +120 -0
- data/set-of-emails/maildir/bsd/sendmail-21.eml +69 -0
- data/set-of-emails/maildir/bsd/sendmail-22.eml +73 -0
- data/set-of-emails/maildir/bsd/sendmail-23.eml +137 -0
- data/set-of-emails/maildir/bsd/sendmail-24.eml +66 -0
- data/set-of-emails/maildir/bsd/sendmail-25.eml +70 -0
- data/set-of-emails/maildir/bsd/sendmail-26.eml +71 -0
- data/set-of-emails/maildir/bsd/sendmail-27.eml +69 -0
- data/set-of-emails/maildir/bsd/sendmail-28.eml +69 -0
- data/set-of-emails/maildir/bsd/sendmail-29.eml +70 -0
- data/set-of-emails/maildir/bsd/sendmail-30.eml +68 -0
- data/set-of-emails/maildir/bsd/sendmail-31.eml +80 -0
- data/set-of-emails/maildir/bsd/sendmail-32.eml +71 -0
- data/set-of-emails/maildir/bsd/sendmail-33.eml +71 -0
- data/set-of-emails/maildir/bsd/sendmail-34.eml +75 -0
- data/set-of-emails/maildir/bsd/sendmail-35.eml +70 -0
- data/set-of-emails/maildir/bsd/sendmail-36.eml +71 -0
- data/set-of-emails/maildir/bsd/sendmail-37.eml +71 -0
- data/set-of-emails/maildir/bsd/surfcontrol-01.eml +79 -0
- data/set-of-emails/maildir/bsd/surfcontrol-02.eml +70 -0
- data/set-of-emails/maildir/bsd/surfcontrol-03.eml +70 -0
- data/set-of-emails/maildir/bsd/uk-messagelabs-01.eml +76 -0
- data/set-of-emails/maildir/bsd/us-amazonses-01.eml +59 -0
- data/set-of-emails/maildir/bsd/us-amazonses-02.eml +177 -0
- data/set-of-emails/maildir/bsd/us-amazonses-03.eml +55 -0
- data/set-of-emails/maildir/bsd/us-amazonses-04.eml +55 -0
- data/set-of-emails/maildir/bsd/us-aol-01.eml +1258 -0
- data/set-of-emails/maildir/bsd/us-aol-02.eml +1257 -0
- data/set-of-emails/maildir/bsd/us-aol-03.eml +1264 -0
- data/set-of-emails/maildir/bsd/us-aol-04.eml +1260 -0
- data/set-of-emails/maildir/bsd/us-bigfoot-01.eml +64 -0
- data/set-of-emails/maildir/bsd/us-facebook-01.eml +40 -0
- data/set-of-emails/maildir/bsd/us-facebook-02.eml +42 -0
- data/set-of-emails/maildir/bsd/us-google-01.eml +70 -0
- data/set-of-emails/maildir/bsd/us-google-02.eml +50 -0
- data/set-of-emails/maildir/bsd/us-google-03.eml +51 -0
- data/set-of-emails/maildir/bsd/us-google-04.eml +82 -0
- data/set-of-emails/maildir/bsd/us-google-05.eml +50 -0
- data/set-of-emails/maildir/bsd/us-google-06.eml +56 -0
- data/set-of-emails/maildir/bsd/us-google-07.eml +42 -0
- data/set-of-emails/maildir/bsd/us-google-08.eml +59 -0
- data/set-of-emails/maildir/bsd/us-google-09.eml +76 -0
- data/set-of-emails/maildir/bsd/us-google-10.eml +69 -0
- data/set-of-emails/maildir/bsd/us-google-11.eml +68 -0
- data/set-of-emails/maildir/bsd/us-google-12.eml +76 -0
- data/set-of-emails/maildir/bsd/us-google-13.eml +79 -0
- data/set-of-emails/maildir/bsd/us-google-14.eml +304 -0
- data/set-of-emails/maildir/bsd/us-outlook-01.eml +72 -0
- data/set-of-emails/maildir/bsd/us-outlook-02.eml +72 -0
- data/set-of-emails/maildir/bsd/us-outlook-03.eml +72 -0
- data/set-of-emails/maildir/bsd/us-outlook-04.eml +79 -0
- data/set-of-emails/maildir/bsd/us-outlook-05.eml +85 -0
- data/set-of-emails/maildir/bsd/us-outlook-06.eml +75 -0
- data/set-of-emails/maildir/bsd/us-outlook-07.eml +70 -0
- data/set-of-emails/maildir/bsd/us-receivingses-01.eml +74 -0
- data/set-of-emails/maildir/bsd/us-receivingses-02.eml +74 -0
- data/set-of-emails/maildir/bsd/us-receivingses-03.eml +74 -0
- data/set-of-emails/maildir/bsd/us-receivingses-04.eml +74 -0
- data/set-of-emails/maildir/bsd/us-receivingses-05.eml +74 -0
- data/set-of-emails/maildir/bsd/us-receivingses-06.eml +74 -0
- data/set-of-emails/maildir/bsd/us-receivingses-07.eml +74 -0
- data/set-of-emails/maildir/bsd/us-sendgrid-01.eml +95 -0
- data/set-of-emails/maildir/bsd/us-sendgrid-02.eml +98 -0
- data/set-of-emails/maildir/bsd/us-sendgrid-03.eml +100 -0
- data/set-of-emails/maildir/bsd/us-verizon-01.eml +31 -0
- data/set-of-emails/maildir/bsd/us-yahoo-01.eml +78 -0
- data/set-of-emails/maildir/bsd/us-yahoo-02.eml +79 -0
- data/set-of-emails/maildir/bsd/us-yahoo-03.eml +93 -0
- data/set-of-emails/maildir/bsd/us-yahoo-04.eml +94 -0
- data/set-of-emails/maildir/bsd/us-yahoo-05.eml +94 -0
- data/set-of-emails/maildir/bsd/us-zoho-01.eml +40 -0
- data/set-of-emails/maildir/bsd/us-zoho-02.eml +38 -0
- data/set-of-emails/maildir/bsd/us-zoho-03.eml +37 -0
- data/set-of-emails/maildir/bsd/us-zoho-04.eml +47 -0
- data/set-of-emails/maildir/bsd/us-zoho-05.eml +37 -0
- data/set-of-emails/maildir/bsd/v5sendmail-01.eml +24 -0
- data/set-of-emails/maildir/bsd/v5sendmail-02.eml +26 -0
- data/set-of-emails/maildir/bsd/v5sendmail-03.eml +29 -0
- data/set-of-emails/maildir/bsd/v5sendmail-04.eml +29 -0
- data/set-of-emails/maildir/bsd/v5sendmail-05.eml +42 -0
- data/set-of-emails/maildir/bsd/v5sendmail-06.eml +28 -0
- data/set-of-emails/maildir/bsd/v5sendmail-07.eml +35 -0
- data/set-of-emails/maildir/bsd/x1-01.eml +61 -0
- data/set-of-emails/maildir/bsd/x1-02.eml +62 -0
- data/set-of-emails/maildir/bsd/x2-01.eml +41 -0
- data/set-of-emails/maildir/bsd/x2-02.eml +46 -0
- data/set-of-emails/maildir/bsd/x2-03.eml +34 -0
- data/set-of-emails/maildir/bsd/x2-04.eml +0 -0
- data/set-of-emails/maildir/bsd/x2-05.eml +98 -0
- data/set-of-emails/maildir/bsd/x3-01.eml +61 -0
- data/set-of-emails/maildir/bsd/x3-02.eml +64 -0
- data/set-of-emails/maildir/bsd/x3-03.eml +59 -0
- data/set-of-emails/maildir/bsd/x3-04.eml +106 -0
- data/set-of-emails/maildir/bsd/x4-01.eml +92 -0
- data/set-of-emails/maildir/bsd/x4-02.eml +112 -0
- data/set-of-emails/maildir/bsd/x4-03.eml +245 -0
- data/set-of-emails/maildir/bsd/x4-04.eml +81 -0
- data/set-of-emails/maildir/bsd/x4-05.eml +121 -0
- data/set-of-emails/maildir/bsd/x4-06.eml +32 -0
- data/set-of-emails/maildir/bsd/x4-07.eml +153 -0
- data/set-of-emails/maildir/bsd/x5-01.eml +155 -0
- data/set-of-emails/maildir/dos/activehunter-01.eml +54 -0
- data/set-of-emails/maildir/dos/apachejames-01.eml +46 -0
- data/set-of-emails/maildir/dos/arf-01.eml +66 -0
- data/set-of-emails/maildir/dos/courier-01.eml +79 -0
- data/set-of-emails/maildir/dos/de-einsundeins-01.eml +38 -0
- data/set-of-emails/maildir/dos/de-gmx-01.eml +52 -0
- data/set-of-emails/maildir/dos/domino-01.eml +33 -0
- data/set-of-emails/maildir/dos/exchange-01.eml +31 -0
- data/set-of-emails/maildir/dos/exim-01.eml +46 -0
- data/set-of-emails/maildir/dos/google-apps-01.eml +66 -0
- data/set-of-emails/maildir/dos/imailserver-01.eml +27 -0
- data/set-of-emails/maildir/dos/interscanmss-01.eml +49 -0
- data/set-of-emails/maildir/dos/jp-biglobe-01.eml +43 -0
- data/set-of-emails/maildir/dos/jp-ezweb-01.eml +36 -0
- data/set-of-emails/maildir/dos/jp-kddi-01.eml +49 -0
- data/set-of-emails/maildir/dos/mailfoundry-01.eml +50 -0
- data/set-of-emails/maildir/dos/mailmarshalsmtp-01.eml +43 -0
- data/set-of-emails/maildir/dos/mcafee-01.eml +63 -0
- data/set-of-emails/maildir/dos/messagingserver-01.eml +102 -0
- data/set-of-emails/maildir/dos/mfilter-01.eml +49 -0
- data/set-of-emails/maildir/dos/mxlogic-01.eml +47 -0
- data/set-of-emails/maildir/dos/notes-01.eml +42 -0
- data/set-of-emails/maildir/dos/opensmtpd-01.eml +33 -0
- data/set-of-emails/maildir/dos/postfix-01.eml +60 -0
- data/set-of-emails/maildir/dos/qmail-01.eml +40 -0
- data/set-of-emails/maildir/dos/rfc3464-01.eml +59 -0
- data/set-of-emails/maildir/dos/rfc3834-01.eml +37 -0
- data/set-of-emails/maildir/dos/ru-mailru-01.eml +54 -0
- data/set-of-emails/maildir/dos/ru-yandex-01.eml +102 -0
- data/set-of-emails/maildir/dos/sendmail-01.eml +69 -0
- data/set-of-emails/maildir/dos/surfcontrol-01.eml +79 -0
- data/set-of-emails/maildir/dos/uk-messagelabs-01.eml +76 -0
- data/set-of-emails/maildir/dos/us-amazonses-01.eml +59 -0
- data/set-of-emails/maildir/dos/us-aol-01.eml +1258 -0
- data/set-of-emails/maildir/dos/us-bigfoot-01.eml +64 -0
- data/set-of-emails/maildir/dos/us-facebook-01.eml +40 -0
- data/set-of-emails/maildir/dos/us-google-01.eml +70 -0
- data/set-of-emails/maildir/dos/us-outlook-01.eml +72 -0
- data/set-of-emails/maildir/dos/us-receivingses-01.eml +74 -0
- data/set-of-emails/maildir/dos/us-sendgrid-01.eml +95 -0
- data/set-of-emails/maildir/dos/us-verizon-01.eml +31 -0
- data/set-of-emails/maildir/dos/us-yahoo-01.eml +78 -0
- data/set-of-emails/maildir/dos/us-zoho-01.eml +40 -0
- data/set-of-emails/maildir/dos/v5sendmail-01.eml +24 -0
- data/set-of-emails/maildir/dos/x1-01.eml +61 -0
- data/set-of-emails/maildir/dos/x2-01.eml +41 -0
- data/set-of-emails/maildir/dos/x3-01.eml +61 -0
- data/set-of-emails/maildir/dos/x4-01.eml +90 -0
- data/set-of-emails/maildir/dos/x5-01.eml +155 -0
- data/set-of-emails/maildir/err/make-test-01.eml +70 -0
- data/set-of-emails/maildir/err/make-test-02.eml +70 -0
- data/set-of-emails/maildir/err/make-test-03.eml +64 -0
- data/set-of-emails/maildir/err/make-test-04.eml +64 -0
- data/set-of-emails/maildir/err/make-test-05.eml +66 -0
- data/set-of-emails/maildir/err/make-test-06.eml +118 -0
- data/set-of-emails/maildir/err/make-test-07.eml +26 -0
- data/set-of-emails/maildir/err/make-test-08.eml +67 -0
- data/set-of-emails/maildir/err/make-test-09.eml +55 -0
- data/set-of-emails/maildir/err/make-test-10.eml +69 -0
- data/set-of-emails/maildir/err/make-test-11.eml +64 -0
- data/set-of-emails/maildir/err/make-test-12.eml +66 -0
- data/set-of-emails/maildir/err/make-test-13.eml +67 -0
- data/set-of-emails/maildir/err/make-test-14.eml +66 -0
- data/set-of-emails/maildir/err/make-test-15.eml +70 -0
- data/set-of-emails/maildir/err/make-test-16.eml +68 -0
- data/set-of-emails/maildir/err/make-test-17.eml +68 -0
- data/set-of-emails/maildir/err/make-test-18.eml +68 -0
- data/set-of-emails/maildir/err/make-test-19.eml +69 -0
- data/set-of-emails/maildir/err/make-test-20.eml +67 -0
- data/set-of-emails/maildir/err/make-test-21.eml +69 -0
- data/set-of-emails/maildir/err/make-test-22.eml +66 -0
- data/set-of-emails/maildir/err/make-test-23.eml +70 -0
- data/set-of-emails/maildir/err/make-test-24.eml +69 -0
- data/set-of-emails/maildir/err/make-test-25.eml +67 -0
- data/set-of-emails/maildir/err/make-test-26.eml +69 -0
- data/set-of-emails/maildir/err/make-test-27.eml +69 -0
- data/set-of-emails/maildir/err/make-test-28.eml +66 -0
- data/set-of-emails/maildir/err/make-test-29.eml +68 -0
- data/set-of-emails/maildir/err/make-test-30.eml +68 -0
- data/set-of-emails/maildir/err/make-test-31.eml +80 -0
- data/set-of-emails/maildir/err/make-test-32.eml +66 -0
- data/set-of-emails/maildir/err/make-test-33.eml +68 -0
- data/set-of-emails/maildir/err/make-test-34.eml +56 -0
- data/set-of-emails/maildir/err/make-test-35.eml +59 -0
- data/set-of-emails/maildir/err/make-test-36.eml +53 -0
- data/set-of-emails/maildir/err/make-test-37.eml +62 -0
- data/set-of-emails/maildir/mac/activehunter-01.eml +1 -2
- data/set-of-emails/maildir/mac/apachejames-01.eml +1 -4
- data/set-of-emails/maildir/mac/arf-01.eml +1 -3
- data/set-of-emails/maildir/mac/courier-01.eml +1 -6
- data/set-of-emails/maildir/mac/de-einsundeins-01.eml +1 -1
- data/set-of-emails/maildir/mac/de-gmx-01.eml +1 -1
- data/set-of-emails/maildir/mac/domino-01.eml +1 -0
- data/set-of-emails/maildir/mac/exchange-01.eml +1 -0
- data/set-of-emails/maildir/mac/exim-01.eml +1 -1
- data/set-of-emails/maildir/mac/google-apps-01.eml +1 -4
- data/set-of-emails/maildir/mac/imailserver-01.eml +1 -0
- data/set-of-emails/maildir/mac/interscanmss-01.eml +1 -2
- data/set-of-emails/maildir/mac/jp-biglobe-01.eml +1 -2
- data/set-of-emails/maildir/mac/jp-ezweb-01.eml +1 -1
- data/set-of-emails/maildir/mac/jp-kddi-01.eml +1 -2
- data/set-of-emails/maildir/mac/mailfoundry-01.eml +1 -2
- data/set-of-emails/maildir/mac/mailmarshalsmtp-01.eml +1 -2
- data/set-of-emails/maildir/mac/mcafee-01.eml +1 -4
- data/set-of-emails/maildir/mac/messagingserver-01.eml +1 -4
- data/set-of-emails/maildir/mac/mfilter-01.eml +1 -3
- data/set-of-emails/maildir/mac/mxlogic-01.eml +1 -1
- data/set-of-emails/maildir/mac/notes-01.eml +1 -2
- data/set-of-emails/maildir/mac/opensmtpd-01.eml +1 -0
- data/set-of-emails/maildir/mac/postfix-01.eml +1 -3
- data/set-of-emails/maildir/mac/qmail-01.eml +1 -1
- data/set-of-emails/maildir/mac/rfc3464-01.eml +1 -4
- data/set-of-emails/maildir/mac/rfc3834-01.eml +1 -0
- data/set-of-emails/maildir/mac/ru-mailru-01.eml +1 -1
- data/set-of-emails/maildir/mac/ru-yandex-01.eml +1 -4
- data/set-of-emails/maildir/mac/sendmail-01.eml +1 -4
- data/set-of-emails/maildir/mac/surfcontrol-01.eml +1 -5
- data/set-of-emails/maildir/mac/uk-messagelabs-01.eml +1 -4
- data/set-of-emails/maildir/mac/us-amazonses-01.eml +1 -4
- data/set-of-emails/maildir/mac/us-aol-01.eml +1 -15
- data/set-of-emails/maildir/mac/us-bigfoot-01.eml +1 -4
- data/set-of-emails/maildir/mac/us-facebook-01.eml +1 -4
- data/set-of-emails/maildir/mac/us-google-01.eml +1 -1
- data/set-of-emails/maildir/mac/us-outlook-01.eml +1 -4
- data/set-of-emails/maildir/mac/us-receivingses-01.eml +1 -4
- data/set-of-emails/maildir/mac/us-sendgrid-01.eml +1 -3
- data/set-of-emails/maildir/mac/us-verizon-01.eml +1 -2
- data/set-of-emails/maildir/mac/us-yahoo-01.eml +1 -1
- data/set-of-emails/maildir/mac/us-zoho-01.eml +1 -2
- data/set-of-emails/maildir/mac/v5sendmail-01.eml +1 -0
- data/set-of-emails/maildir/mac/x1-01.eml +1 -4
- data/set-of-emails/maildir/mac/x2-01.eml +1 -1
- data/set-of-emails/maildir/mac/x3-01.eml +1 -3
- data/set-of-emails/maildir/mac/x4-01.eml +1 -2
- data/set-of-emails/maildir/mac/x5-01.eml +1 -8
- data/set-of-emails/maildir/not/is-not-bounce-01.eml +25 -0
- data/set-of-emails/to-be-debugged-because/reason-is-onhold/onhold-0001.eml +85 -0
- data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0002.eml +27 -0
- data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0003.eml +78 -0
- data/set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet/cannot-parse-this-email-0002.eml +25 -0
- data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-01.eml +79 -0
- data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-02.eml +72 -0
- data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-03.eml +68 -0
- data/set-of-emails/to-be-debugged-because/something-is-wrong/no-message-id-from-pr-150.eml +75 -0
- data/set-of-emails/to-be-parsed-for-test/README.md +20 -0
- data/sisimai.gemspec +25 -0
- metadata +647 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module Reason
|
3
|
+
# Sisimai::Reason::SystemError checks the bounce reason is "systemerror" or
|
4
|
+
# not. This class is called only Sisimai::Reason class.
|
5
|
+
#
|
6
|
+
# This is the error that an email has bounced due to system error on the
|
7
|
+
# remote host such as LDAP connection failure or other internal system error.
|
8
|
+
#
|
9
|
+
# <kijitora@example.net>:
|
10
|
+
# Unable to contact LDAP server. (#4.4.3)I'm not going to try again; this
|
11
|
+
# message has been in the queue too long.
|
12
|
+
module SystemError
|
13
|
+
# Imported from p5-Sisimail/lib/Sisimai/Reason/SystemError.pm
|
14
|
+
class << self
|
15
|
+
def text; return 'systemerror'; end
|
16
|
+
|
17
|
+
# Try to match that the given text and regular expressions
|
18
|
+
# @param [String] argv1 String to be matched with regular expressions
|
19
|
+
# @return [True,False] false: Did not match
|
20
|
+
# true: Matched
|
21
|
+
def match(argv1)
|
22
|
+
return nil unless argv1
|
23
|
+
regex = %r{(?>
|
24
|
+
can[']t[ ]create[ ]user[ ]output[ ]file
|
25
|
+
|Internal[ ](?:
|
26
|
+
error[ ]reading[ ]data # Microsoft
|
27
|
+
|server[ ]error:[ ]Operation[ ]now[ ]in[ ]progress # Microsoft
|
28
|
+
)
|
29
|
+
|interrupted[ ]system[ ]call
|
30
|
+
|it[ ](?:
|
31
|
+
encountered[ ]an[ ]error[ ]while[ ]being[ ]processed
|
32
|
+
|would[ ]create[ ]a[ ]mail[ ]loop
|
33
|
+
)
|
34
|
+
|local[ ](?:
|
35
|
+
configuration[ ]error
|
36
|
+
|error[ ]in[ ]processing
|
37
|
+
)
|
38
|
+
|loop[ ]was[ ]found[ ]in[ ]the[ ]Mail[ ]eXchanger
|
39
|
+
|mail[ ](?:
|
40
|
+
for[ ].+[ ]loops[ ]back[ ]to[ ]myself
|
41
|
+
|system[ ]configuration[ ]error
|
42
|
+
)
|
43
|
+
|server[ ]configuration[ ]error
|
44
|
+
|service[ ]currently[ ]unavailable
|
45
|
+
|system[ ]config[ ]error
|
46
|
+
|timeout[ ]waiting[ ]for[ ]input
|
47
|
+
)
|
48
|
+
}ix
|
49
|
+
|
50
|
+
return true if argv1 =~ regex
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
|
54
|
+
# The bounce reason is system error or not
|
55
|
+
# @param [Sisimai::Data] argvs Object to be detected the reason
|
56
|
+
# @return [True,False] true: is system error
|
57
|
+
# false: is not system error
|
58
|
+
# @see http://www.ietf.org/rfc/rfc2822.txt
|
59
|
+
def true(_argvs)
|
60
|
+
return nil
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module Reason
|
3
|
+
# Sisimai::Reason::SystemFull checks the bounce reason is "systemfull" or
|
4
|
+
# not. This class is called only Sisimai::Reason class.
|
5
|
+
#
|
6
|
+
# This is the error that a destination mail server's disk (or spool) is full.
|
7
|
+
# Sisimai will set C<systemfull> to the reason of email bounce if the value
|
8
|
+
# of Status: field in a bounce email is "4.3.1" or "5.3.1".
|
9
|
+
module SystemFull
|
10
|
+
# Imported from p5-Sisimail/lib/Sisimai/Reason/SystemFull.pm
|
11
|
+
class << self
|
12
|
+
def text; return 'systemfull'; end
|
13
|
+
|
14
|
+
# Try to match that the given text and regular expressions
|
15
|
+
# @param [String] argv1 String to be matched with regular expressions
|
16
|
+
# @return [True,False] false: Did not match
|
17
|
+
# true: Matched
|
18
|
+
def match(argv1)
|
19
|
+
return nil unless argv1
|
20
|
+
regex = %r{(?:
|
21
|
+
mail[ ]system[ ]full
|
22
|
+
|requested[ ]mail[ ]action[ ]aborted:[ ]exceeded[ ]storage[ ]allocation # MS Exchange
|
23
|
+
)
|
24
|
+
}ix
|
25
|
+
|
26
|
+
return true if argv1 =~ regex
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
# The bounce reason is system full or not
|
31
|
+
# @param [Sisimai::Data] argvs Object to be detected the reason
|
32
|
+
# @return [True,False] true: is system full
|
33
|
+
# false: is not system full
|
34
|
+
# @see http://www.ietf.org/rfc/rfc2822.txt
|
35
|
+
def true(_argvs)
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module Reason
|
3
|
+
# Sisimai::Reason::TooManyConn checks the bounce reason is "toomanyconn" or
|
4
|
+
# not. This class is called only Sisimai::Reason class.
|
5
|
+
#
|
6
|
+
# This is the error that SMTP connection was rejected temporarily due to too
|
7
|
+
# many concurrency connections to the remote server. This reason has added
|
8
|
+
# in Sisimai 4.1.26 and does not exist in any version of bounceHammer.
|
9
|
+
#
|
10
|
+
# <kijitora@example.ne.jp>: host mx02.example.ne.jp[192.0.1.20] said:
|
11
|
+
# 452 4.3.2 Connection rate limit exceeded. (in reply to MAIL FROM command)
|
12
|
+
module TooManyConn
|
13
|
+
# Imported from p5-Sisimail/lib/Sisimai/Reason/TooManyConn.pm
|
14
|
+
class << self
|
15
|
+
def text; return 'toomanyconn'; end
|
16
|
+
|
17
|
+
# Try to match that the given text and regular expressions
|
18
|
+
# @param [String] argv1 String to be matched with regular expressions
|
19
|
+
# @return [True,False] false: Did not match
|
20
|
+
# true: Matched
|
21
|
+
def match(argv1)
|
22
|
+
return nil unless argv1
|
23
|
+
regex = %r{(?>
|
24
|
+
All[ ]available[ ]IPs[ ]are[ ]at[ ]maximum[ ]connection[ ]limit # SendGrid
|
25
|
+
|connection[ ]rate[ ]limit[ ]exceeded
|
26
|
+
|no[ ]IPs[ ]available[ ][-][ ].+[ ]exceeds[ ]per[-]domain[ ]connection[ ]limit[ ]for
|
27
|
+
|Too[ ]many[ ](?:
|
28
|
+
connections
|
29
|
+
|connections[ ]from[ ]your[ ]host[.] # Microsoft
|
30
|
+
|concurrent[ ]SMTP[ ]connections # Microsoft
|
31
|
+
|SMTP[ ]sessions[ ]for[ ]this[ ]host # Sendmail(daemon.c)
|
32
|
+
)
|
33
|
+
)
|
34
|
+
}ix
|
35
|
+
|
36
|
+
return true if argv1 =~ regex
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
|
40
|
+
# Rejected by domain or address filter ?
|
41
|
+
# @param [Sisimai::Data] argvs Object to be detected the reason
|
42
|
+
# @return [True,False] true: is filtered
|
43
|
+
# false: is not filtered
|
44
|
+
# @see http://www.ietf.org/rfc/rfc2822.txt
|
45
|
+
def true(argvs)
|
46
|
+
return nil unless argvs
|
47
|
+
return nil unless argvs.is_a? Sisimai::Data
|
48
|
+
return true if argvs.reason == Sisimai::Reason::TooManyConn.text
|
49
|
+
|
50
|
+
require 'sisimai/smtp/status'
|
51
|
+
statuscode = argvs.deliverystatus || ''
|
52
|
+
diagnostic = argvs.diagnosticcode || ''
|
53
|
+
reasontext = Sisimai::Reason::TooManyConn.text
|
54
|
+
tempreason = Sisimai::SMTP::Status.name(statuscode)
|
55
|
+
v = false
|
56
|
+
|
57
|
+
if tempreason == reasontext
|
58
|
+
# Delivery status code points "toomanyconn".
|
59
|
+
v = true
|
60
|
+
else
|
61
|
+
# Matched with a pattern in this class
|
62
|
+
v = true if Sisimai::Reason::TooManyConn.match(diagnostic)
|
63
|
+
end
|
64
|
+
return v
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|
@@ -0,0 +1,194 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module Reason
|
3
|
+
# Sisimai::Reason::UserUnknown checks the bounce reason is "userunknown" or
|
4
|
+
# not. This class is called only Sisimai::Reason class.
|
5
|
+
#
|
6
|
+
# This is the error that a local part (Left hand side of @ sign) of a recipient's
|
7
|
+
# email address does not exist. In many case, a user has changed internet service
|
8
|
+
# provider, or has quit company, or the local part is misspelled. Sisimai will
|
9
|
+
# set "userunknown" to the reason of email bounce if the value of Status: field
|
10
|
+
# in a bounce email is "5.1.1", or connection was refused at SMTP RCPT command,
|
11
|
+
# or the contents of Diagnostic-Code: field represents that it is unknown user.
|
12
|
+
#
|
13
|
+
# <kijitora@example.co.jp>: host mx01.example.co.jp[192.0.2.8] said:
|
14
|
+
# 550 5.1.1 Address rejected kijitora@example.co.jp (in reply to
|
15
|
+
# RCPT TO command)
|
16
|
+
module UserUnknown
|
17
|
+
# Imported from p5-Sisimail/lib/Sisimai/Reason/UserUnknown.pm
|
18
|
+
class << self
|
19
|
+
def text; return 'userunknown'; end
|
20
|
+
|
21
|
+
# Try to match that the given text and regular expressions
|
22
|
+
# @param [String] argv1 String to be matched with regular expressions
|
23
|
+
# @return [True,False] false: Did not match
|
24
|
+
# true: Matched
|
25
|
+
def match(argv1)
|
26
|
+
return nil unless argv1
|
27
|
+
regex = %r{(?>
|
28
|
+
.+[ ]user[ ]unknown
|
29
|
+
|[#]5[.]1[.]1[ ]bad[ ]address
|
30
|
+
|[<].+[>][ ]not[ ]found
|
31
|
+
|address[ ]does[ ]not[ ]exist
|
32
|
+
|address[ ]unknown
|
33
|
+
|archived[ ]recipient
|
34
|
+
|BAD[-_ ]RECIPIENT
|
35
|
+
|destination[ ]addresses[ ]were[ ]unknown
|
36
|
+
|destination[ ]server[ ]rejected[ ]recipients
|
37
|
+
|email[ ]address[ ]does[ ]not[ ]exist
|
38
|
+
|invalid[ ](?:
|
39
|
+
mailbox[ ]path
|
40
|
+
|recipient # Linkedin
|
41
|
+
)
|
42
|
+
|is[ ]not[ ](?:
|
43
|
+
a[ ]known[ ]user
|
44
|
+
|an[ ]active[ ]address[ ]at[ ]this[ ]host
|
45
|
+
)
|
46
|
+
|mailbox[ ](?:
|
47
|
+
not[ ]present
|
48
|
+
|not[ ]found
|
49
|
+
|unavailable
|
50
|
+
)
|
51
|
+
|no[ ](?:
|
52
|
+
account[ ]by[ ]that[ ]name[ ]here
|
53
|
+
|mail[ ]box[ ]available[ ]for[ ]this[ ]user
|
54
|
+
|mailbox[ ]found
|
55
|
+
|matches[ ]to[ ]nameserver[ ]query
|
56
|
+
|such[ ](?:
|
57
|
+
mailbox
|
58
|
+
|person[ ]at[ ]this[ ]address
|
59
|
+
|recipient
|
60
|
+
|user(?:[ ]here)?
|
61
|
+
)
|
62
|
+
|[ ].+[ ]in[ ]name[ ]directory
|
63
|
+
|valid[ ]recipients[,][ ]bye # Microsoft
|
64
|
+
)
|
65
|
+
|non[- ]?existent[ ]user
|
66
|
+
|not[ ](?:
|
67
|
+
a[ ]valid[ ]user[ ]here
|
68
|
+
|a[ ]local[ ]address
|
69
|
+
)
|
70
|
+
|rcpt[ ][<].+[>][ ]does[ ]not[ ]exist
|
71
|
+
|recipient[ ](?:
|
72
|
+
.+[ ]was[ ]not[ ]found[ ]in
|
73
|
+
|address[ ]rejected:[ ](?:
|
74
|
+
access[ ]denied
|
75
|
+
|invalid[ ]user
|
76
|
+
|user[ ].+[ ]does[ ]not[ ]exist
|
77
|
+
|user[ ]unknown[ ]in[ ].+[ ]table
|
78
|
+
|unknown[ ]user
|
79
|
+
)
|
80
|
+
|does[ ]not[ ]exist(?:[ ]on[ ]this[ ]system)?
|
81
|
+
|is[ ]not[ ]local
|
82
|
+
|not[ ]found
|
83
|
+
|not[ ]OK
|
84
|
+
|unknown
|
85
|
+
)
|
86
|
+
|requested[ ]action[ ]not[ ]taken:[ ]mailbox[ ]unavailable
|
87
|
+
|RESOLVER[.]ADR[.]RecipNotFound # Microsoft
|
88
|
+
|said:[ ]550[-[ ]]5[.]1[.]1[ ].+[ ]user[ ]unknown[ ]
|
89
|
+
|sorry,[ ](?:
|
90
|
+
user[ ]unknown
|
91
|
+
|badrcptto
|
92
|
+
|no[ ]mailbox[ ]here[ ]by[ ]that[ ]name
|
93
|
+
)
|
94
|
+
|the[ ](?:
|
95
|
+
following[ ]recipients[ ]was[ ]undeliverable
|
96
|
+
|user[']s[ ]email[ ]name[ ]is[ ]not[ ]found
|
97
|
+
)
|
98
|
+
|this[ ](?:
|
99
|
+
address[ ]no[ ]longer[ ]accepts[ ]mail
|
100
|
+
|email[ ]address[ ]is[ ]wrong[ ]or[ ]no[ ]longer[ ]valid
|
101
|
+
|user[ ]doesn[']?t[ ]have[ ]a[ ].+[ ]account
|
102
|
+
)
|
103
|
+
|unknown[ ](?:
|
104
|
+
address
|
105
|
+
|e[-]?mail[ ]address
|
106
|
+
|local[- ]part
|
107
|
+
|mailbox
|
108
|
+
|recipient
|
109
|
+
|user
|
110
|
+
)
|
111
|
+
|user[ ](?:
|
112
|
+
.+[ ]was[ ]not[ ]found
|
113
|
+
|.+[ ]does[ ]not[ ]exist
|
114
|
+
|does[ ]not[ ]exist
|
115
|
+
|missing[ ]home[ ]directory
|
116
|
+
|not[ ]found # 550 User not found. See http://mail.bigmir.net/err/2/
|
117
|
+
|not[ ]known
|
118
|
+
|unknown
|
119
|
+
)
|
120
|
+
|vdeliver:[ ]invalid[ ]or[ ]unknown[ ]virtual[ ]user
|
121
|
+
)
|
122
|
+
}ix
|
123
|
+
|
124
|
+
return true if argv1 =~ regex
|
125
|
+
return false
|
126
|
+
end
|
127
|
+
|
128
|
+
# Whether the address is "userunknown" or not
|
129
|
+
# @param [Sisimai::Data] argvs Object to be detected the reason
|
130
|
+
# @return [True,False] true: is unknown user
|
131
|
+
# false: is not unknown user.
|
132
|
+
# @see http://www.ietf.org/rfc/rfc2822.txt
|
133
|
+
def true(argvs)
|
134
|
+
return nil unless argvs
|
135
|
+
return nil unless argvs.is_a? Sisimai::Data
|
136
|
+
return true if argvs.reason == Sisimai::Reason::UserUnknown.text
|
137
|
+
|
138
|
+
require 'sisimai/smtp/status'
|
139
|
+
prematches = ['NoRelaying', 'Blocked', 'MailboxFull', 'HasMoved']
|
140
|
+
matchother = false
|
141
|
+
statuscode = argvs.deliverystatus || ''
|
142
|
+
diagnostic = argvs.diagnosticcode || ''
|
143
|
+
reasontext = Sisimai::Reason::UserUnknown.text
|
144
|
+
tempreason = Sisimai::SMTP::Status.name(statuscode)
|
145
|
+
v = false
|
146
|
+
|
147
|
+
return false if tempreason == 'suspend'
|
148
|
+
|
149
|
+
if tempreason == reasontext
|
150
|
+
# *.1.1 = 'Bad destination mailbox address'
|
151
|
+
# Status: 5.1.1
|
152
|
+
# Diagnostic-Code: SMTP; 550 5.1.1 <***@example.jp>:
|
153
|
+
# Recipient address rejected: User unknown in local recipient table
|
154
|
+
prematches.each do |e|
|
155
|
+
# Check the value of "Diagnostic-Code" with other error patterns.
|
156
|
+
p = 'Sisimai::Reason::' + e
|
157
|
+
r = nil
|
158
|
+
begin
|
159
|
+
require p.downcase.gsub('::', '/')
|
160
|
+
r = Module.const_get(p)
|
161
|
+
rescue
|
162
|
+
warn '***warning: Failed to load ' + p
|
163
|
+
next
|
164
|
+
end
|
165
|
+
|
166
|
+
if r.match(diagnostic)
|
167
|
+
# Match with reason defined in Sisimai::Reason::* except UserUnknown.
|
168
|
+
matchother = true
|
169
|
+
break
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# Did not match with other message patterns
|
174
|
+
v = true unless matchother
|
175
|
+
|
176
|
+
else
|
177
|
+
# Check the last SMTP command of the session.
|
178
|
+
if argvs.smtpcommand == 'RCPT'
|
179
|
+
# When the SMTP command is not "RCPT", the session rejected by other
|
180
|
+
# reason, maybe.
|
181
|
+
v = true if Sisimai::Reason::UserUnknown.match(diagnostic)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
return v
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
|
194
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::RFC2606 checks that the domain part of the email address in the
|
3
|
+
# argument is reserved or not.
|
4
|
+
module RFC2606
|
5
|
+
# Imported from p5-Sisimail/lib/Sisimai/RFC2606.pm
|
6
|
+
class << self
|
7
|
+
# Whether domain part is Reserved or not
|
8
|
+
# @param [String] dpart Domain part
|
9
|
+
# @return [True,False] true: is Reserved top level domain
|
10
|
+
# false: is NOT reserved top level domain
|
11
|
+
# @see http://www.ietf.org/rfc/rfc2606.txt
|
12
|
+
def is_reserved(argv = '')
|
13
|
+
return false unless argv
|
14
|
+
return false unless argv.is_a?(::String)
|
15
|
+
|
16
|
+
return true if argv =~ /[.](?:test|example|invalid|localhost)\z/
|
17
|
+
return true if argv =~ /example[.](?:com|net|org)\z/
|
18
|
+
return true if argv =~ /example[.]jp\z/
|
19
|
+
return true if argv =~ /example[.](?:ac|ad|co|ed|go|gr|lg|ne|or)[.]jp\z/
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,497 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::RFC3464 - bounce mail parser class for Fallback.
|
3
|
+
module RFC3464
|
4
|
+
# Imported from p5-Sisimail/lib/Sisimai/RFC3464.pm
|
5
|
+
class << self
|
6
|
+
require 'sisimai/mta'
|
7
|
+
require 'sisimai/rfc5322'
|
8
|
+
|
9
|
+
# http://tools.ietf.org/html/rfc3464
|
10
|
+
Re0 = {
|
11
|
+
:'from' => %r/\b(?:postmaster|mailer-daemon|root)[@]/i,
|
12
|
+
:'return-path' => %r/(?:[<][>]|mailer-daemon)/i,
|
13
|
+
:'subject' => %r{(?>
|
14
|
+
delivery[ ](?:failed|failure|report)
|
15
|
+
|failure[ ]notice
|
16
|
+
|mail[ ](?:delivery|error)
|
17
|
+
|non[-]delivery
|
18
|
+
|returned[ ]mail
|
19
|
+
|undeliverable[ ]mail
|
20
|
+
|Warning:[ ]
|
21
|
+
)
|
22
|
+
}xi,
|
23
|
+
}
|
24
|
+
Re1 = {
|
25
|
+
:begin => %r{\A(?>
|
26
|
+
Content-Type:[ ]*(?:
|
27
|
+
message/delivery-status
|
28
|
+
|message/disposition-notification
|
29
|
+
|text/plain;[ ]charset=
|
30
|
+
)
|
31
|
+
|The[ ]original[ ]message[ ]was[ ]received[ ]at[ ]
|
32
|
+
|This[ ]report[ ]relates[ ]to[ ]your[ ]message
|
33
|
+
|Your[ ]message[ ]was[ ]not[ ]delivered[ ]to[ ]the[ ]following[ ]recipients
|
34
|
+
)
|
35
|
+
}xi,
|
36
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
37
|
+
:rfc822 => %r{\A(?>
|
38
|
+
Content-Type:[ ]*(?:message/rfc822|text/rfc822-headers)
|
39
|
+
|Return-Path:[ ]*[<].+[>]\z
|
40
|
+
)\z
|
41
|
+
}xi,
|
42
|
+
:error => %r/\A(?:[45]\d\d[ \t]+|[<][^@]+[@][^@]+[>]:?[ \t]+)/i,
|
43
|
+
:command => %r/[ ](RCPT|MAIL|DATA)[ ]+command\b/,
|
44
|
+
}
|
45
|
+
|
46
|
+
Indicators = Sisimai::MTA.INDICATORS
|
47
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
48
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
49
|
+
|
50
|
+
def description; 'Fallback Module for MTAs'; end
|
51
|
+
def smtpagent; 'RFC3464'; end
|
52
|
+
def pattern; return Re0; end
|
53
|
+
def headerlist; return []; end
|
54
|
+
|
55
|
+
# Detect an error for RFC3464
|
56
|
+
# @param [Hash] mhead Message header of a bounce email
|
57
|
+
# @options mhead [String] from From header
|
58
|
+
# @options mhead [String] date Date header
|
59
|
+
# @options mhead [String] subject Subject header
|
60
|
+
# @options mhead [Array] received Received headers
|
61
|
+
# @options mhead [String] others Other required headers
|
62
|
+
# @param [String] mbody Message body of a bounce email
|
63
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822 part
|
64
|
+
# or Undef if it failed to parse or the
|
65
|
+
def scan(mhead, mbody)
|
66
|
+
return nil unless mhead
|
67
|
+
return nil unless mbody
|
68
|
+
return nil if mhead.keys.size == 0
|
69
|
+
return nil if mbody.empty?
|
70
|
+
|
71
|
+
require 'sisimai/mda'
|
72
|
+
require 'sisimai/address'
|
73
|
+
|
74
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
75
|
+
hasdivided = mbody.split("\n")
|
76
|
+
havepassed = ['']
|
77
|
+
scannedset = Sisimai::MDA.scan(mhead, mbody)
|
78
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
79
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
80
|
+
previousfn = '' # (String) Previous field name
|
81
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
82
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
83
|
+
connheader = {
|
84
|
+
'date' => nil, # The value of Arrival-Date header
|
85
|
+
'rhost' => nil, # The value of Reporting-MTA header
|
86
|
+
'lhost' => nil, # The value of Received-From-MTA header
|
87
|
+
}
|
88
|
+
v = nil
|
89
|
+
|
90
|
+
hasdivided.each do |e|
|
91
|
+
# Save the current line for the next loop
|
92
|
+
havepassed << e; p = havepassed[-2]
|
93
|
+
|
94
|
+
if readcursor == 0
|
95
|
+
# Beginning of the bounce message or delivery status part
|
96
|
+
if e =~ Re1[:begin]
|
97
|
+
readcursor |= Indicators[:'deliverystatus']
|
98
|
+
next
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
103
|
+
# Beginning of the original message part
|
104
|
+
if e =~ Re1[:rfc822]
|
105
|
+
readcursor |= Indicators[:'message-rfc822']
|
106
|
+
next
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
111
|
+
# After "message/rfc822"
|
112
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
113
|
+
# Get required headers only
|
114
|
+
lhs = cv[1].downcase
|
115
|
+
previousfn = ''
|
116
|
+
next unless RFC822Head.key?(lhs)
|
117
|
+
|
118
|
+
previousfn = lhs
|
119
|
+
rfc822part += e + "\n"
|
120
|
+
|
121
|
+
elsif e =~ /\A[ \t]+/
|
122
|
+
# Continued line from the previous line
|
123
|
+
next if rfc822next[previousfn]
|
124
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
125
|
+
|
126
|
+
else
|
127
|
+
# Check the end of headers in rfc822 part
|
128
|
+
next unless LongFields.key?(previousfn)
|
129
|
+
next if e.size > 0
|
130
|
+
rfc822next[previousfn] = true
|
131
|
+
end
|
132
|
+
|
133
|
+
else
|
134
|
+
# Before "message/rfc822"
|
135
|
+
next unless readcursor & Indicators[:'deliverystatus'] > 0
|
136
|
+
next unless e.size > 0
|
137
|
+
|
138
|
+
v = dscontents[-1]
|
139
|
+
if cv = e.match(/\A(?:[Ff]inal|[Oo]riginal)-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/) ||
|
140
|
+
cv = e.match(/\A(?:[Ff]inal|[Oo]riginal)-[Rr]ecipient:[ ]*([^ ]+)\z/)
|
141
|
+
# 2.3.2 Final-Recipient field
|
142
|
+
# The Final-Recipient field indicates the recipient for which this set
|
143
|
+
# of per-recipient fields applies. This field MUST be present in each
|
144
|
+
# set of per-recipient data.
|
145
|
+
# The syntax of the field is as follows:
|
146
|
+
#
|
147
|
+
# final-recipient-field =
|
148
|
+
# "Final-Recipient" ":" address-type ";" generic-address
|
149
|
+
#
|
150
|
+
# 2.3.1 Original-Recipient field
|
151
|
+
# The Original-Recipient field indicates the original recipient address
|
152
|
+
# as specified by the sender of the message for which the DSN is being
|
153
|
+
# issued.
|
154
|
+
#
|
155
|
+
# original-recipient-field =
|
156
|
+
# "Original-Recipient" ":" address-type ";" generic-address
|
157
|
+
#
|
158
|
+
# generic-address = *text
|
159
|
+
x = v['recipienet'] || ''
|
160
|
+
y = Sisimai::Address.s3s4(cv[1])
|
161
|
+
|
162
|
+
if x.size > 0 && x != y
|
163
|
+
# There are multiple recipient addresses in the message body.
|
164
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
165
|
+
v = dscontents[-1]
|
166
|
+
end
|
167
|
+
v['recipient'] = y
|
168
|
+
recipients += 1
|
169
|
+
|
170
|
+
elsif cv = e.match(/\A[Xx]-[Aa]ctual-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
|
171
|
+
# X-Actual-Recipient:
|
172
|
+
if cv[1] =~ /[ \t]+/
|
173
|
+
# X-Actual-Recipient: RFC822; |IFS=' ' && exec procmail -f- || exit 75 ...
|
174
|
+
|
175
|
+
else
|
176
|
+
# X-Actual-Recipient: rfc822; kijitora@neko.example.jp
|
177
|
+
v['alias'] = cv[1]
|
178
|
+
end
|
179
|
+
|
180
|
+
elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
|
181
|
+
# 2.3.3 Action field
|
182
|
+
# The Action field indicates the action performed by the Reporting-MTA
|
183
|
+
# as a result of its attempt to deliver the message to this recipient
|
184
|
+
# address. This field MUST be present for each recipient named in the
|
185
|
+
# DSN.
|
186
|
+
# The syntax for the action-field is:
|
187
|
+
#
|
188
|
+
# action-field = "Action" ":" action-value
|
189
|
+
# action-value =
|
190
|
+
# "failed" / "delayed" / "delivered" / "relayed" / "expanded"
|
191
|
+
#
|
192
|
+
# The action-value may be spelled in any combination of upper and lower
|
193
|
+
# case characters.
|
194
|
+
v['action'] = cv[1].downcase
|
195
|
+
|
196
|
+
if cv = v['action'].match(/\A([^ ]+)[ ]/)
|
197
|
+
# failed (bad destination mailbox address)
|
198
|
+
v['action'] = cv[1]
|
199
|
+
end
|
200
|
+
|
201
|
+
elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
|
202
|
+
# 2.3.4 Status field
|
203
|
+
# The per-recipient Status field contains a transport-independent
|
204
|
+
# status code that indicates the delivery status of the message to that
|
205
|
+
# recipient. This field MUST be present for each delivery attempt
|
206
|
+
# which is described by a DSN.
|
207
|
+
#
|
208
|
+
# The syntax of the status field is:
|
209
|
+
#
|
210
|
+
# status-field = "Status" ":" status-code
|
211
|
+
# status-code = DIGIT "." 1*3DIGIT "." 1*3DIGIT
|
212
|
+
v['status'] = cv[1]
|
213
|
+
|
214
|
+
elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d+[ ]+.+)\z/)
|
215
|
+
# Status: 553 Exceeded maximum inbound message size
|
216
|
+
v['alterrors'] = cv[1]
|
217
|
+
|
218
|
+
elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
219
|
+
# 2.3.5 Remote-MTA field
|
220
|
+
# The value associated with the Remote-MTA DSN field is a printable
|
221
|
+
# ASCII representation of the name of the "remote" MTA that reported
|
222
|
+
# delivery status to the "reporting" MTA.
|
223
|
+
#
|
224
|
+
# remote-mta-field = "Remote-MTA" ":" mta-name-type ";" mta-name
|
225
|
+
#
|
226
|
+
# NOTE: The Remote-MTA field preserves the "while talking to"
|
227
|
+
# information that was provided in some pre-existing nondelivery
|
228
|
+
# reports.
|
229
|
+
#
|
230
|
+
# This field is optional. It MUST NOT be included if no remote MTA was
|
231
|
+
# involved in the attempted delivery of the message to that recipient.
|
232
|
+
v['rhost'] = cv[1].downcase
|
233
|
+
|
234
|
+
elsif cv = e.match(/\A[Ll]ast-[Aa]ttempt-[Dd]ate:[ ]*(.+)\z/)
|
235
|
+
# 2.3.7 Last-Attempt-Date field
|
236
|
+
# The Last-Attempt-Date field gives the date and time of the last
|
237
|
+
# attempt to relay, gateway, or deliver the message (whether successful
|
238
|
+
# or unsuccessful) by the Reporting MTA. This is not necessarily the
|
239
|
+
# same as the value of the Date field from the header of the message
|
240
|
+
# used to transmit this delivery status notification: In cases where
|
241
|
+
# the DSN was generated by a gateway, the Date field in the message
|
242
|
+
# header contains the time the DSN was sent by the gateway and the DSN
|
243
|
+
# Last-Attempt-Date field contains the time the last delivery attempt
|
244
|
+
# occurred.
|
245
|
+
#
|
246
|
+
# last-attempt-date-field = "Last-Attempt-Date" ":" date-time
|
247
|
+
v['date'] = cv[1]
|
248
|
+
|
249
|
+
else
|
250
|
+
if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
|
251
|
+
# 2.3.6 Diagnostic-Code field
|
252
|
+
# For a "failed" or "delayed" recipient, the Diagnostic-Code DSN field
|
253
|
+
# contains the actual diagnostic code issued by the mail transport.
|
254
|
+
# Since such codes vary from one mail transport to another, the
|
255
|
+
# diagnostic-type sub-field is needed to specify which type of
|
256
|
+
# diagnostic code is represented.
|
257
|
+
#
|
258
|
+
# diagnostic-code-field =
|
259
|
+
# "Diagnostic-Code" ":" diagnostic-type ";" *text
|
260
|
+
v['spec'] = cv[1].upcase
|
261
|
+
v['diagnosis'] = cv[2]
|
262
|
+
|
263
|
+
elsif cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+)\z/)
|
264
|
+
# No value of "diagnostic-type"
|
265
|
+
# Diagnostic-Code: 554 ...
|
266
|
+
v['diagnosis'] = cv[1]
|
267
|
+
|
268
|
+
elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
|
269
|
+
# Continued line of the value of Diagnostic-Code header
|
270
|
+
v['diagnosis'] += ' ' + cv[1]
|
271
|
+
e = 'Diagnostic-Code: ' + e
|
272
|
+
|
273
|
+
else
|
274
|
+
if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
275
|
+
# 2.2.2 The Reporting-MTA DSN field
|
276
|
+
#
|
277
|
+
# reporting-mta-field =
|
278
|
+
# "Reporting-MTA" ":" mta-name-type ";" mta-name
|
279
|
+
# mta-name = *text
|
280
|
+
#
|
281
|
+
# The Reporting-MTA field is defined as follows:
|
282
|
+
#
|
283
|
+
# A DSN describes the results of attempts to deliver, relay, or gateway
|
284
|
+
# a message to one or more recipients. In all cases, the Reporting-MTA
|
285
|
+
# is the MTA that attempted to perform the delivery, relay, or gateway
|
286
|
+
# operation described in the DSN. This field is required.
|
287
|
+
connheader['rhost'] ||= cv[1].downcase
|
288
|
+
|
289
|
+
elsif cv = e.match(/\A[Rr]eceived-[Ff]rom-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
290
|
+
# 2.2.4 The Received-From-MTA DSN field
|
291
|
+
# The optional Received-From-MTA field indicates the name of the MTA
|
292
|
+
# from which the message was received.
|
293
|
+
#
|
294
|
+
# received-from-mta-field =
|
295
|
+
# "Received-From-MTA" ":" mta-name-type ";" mta-name
|
296
|
+
#
|
297
|
+
# If the message was received from an Internet host via SMTP, the
|
298
|
+
# contents of the mta-name sub-field SHOULD be the Internet domain name
|
299
|
+
# supplied in the HELO or EHLO command, and the network address used by
|
300
|
+
# the SMTP client SHOULD be included as a comment enclosed in
|
301
|
+
# parentheses. (In this case, the MTA-name-type will be "dns".)
|
302
|
+
connheader['lhost'] = cv[1].downcase
|
303
|
+
|
304
|
+
elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
|
305
|
+
# 2.2.5 The Arrival-Date DSN field
|
306
|
+
# The optional Arrival-Date field indicates the date and time at which
|
307
|
+
# the message arrived at the Reporting MTA. If the Last-Attempt-Date
|
308
|
+
# field is also provided in a per-recipient field, this can be used to
|
309
|
+
# determine the interval between when the message arrived at the
|
310
|
+
# Reporting MTA and when the report was issued for that recipient.
|
311
|
+
#
|
312
|
+
# arrival-date-field = "Arrival-Date" ":" date-time
|
313
|
+
connheader['date'] = cv[1]
|
314
|
+
|
315
|
+
else
|
316
|
+
# Get error message
|
317
|
+
next if e =~ /\A[ -]+/
|
318
|
+
next unless e =~ Re1[:error]
|
319
|
+
|
320
|
+
# 500 User Unknown
|
321
|
+
# <kijitora@example.jp> Unknown
|
322
|
+
v['alterrors'] ||= ' '
|
323
|
+
v['alterrors'] += ' ' + e
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end # End of if: rfc822
|
328
|
+
|
329
|
+
end
|
330
|
+
|
331
|
+
loop do
|
332
|
+
# Fallback, parse entire message body
|
333
|
+
break if recipients > 0
|
334
|
+
match = 0
|
335
|
+
|
336
|
+
# Failed to get a recipient address at code above
|
337
|
+
match += 1 if mhead['from'] =~ Re0[:'from']
|
338
|
+
match += 1 if mhead['subject'] =~ Re0[:'subject']
|
339
|
+
|
340
|
+
if mhead['return-path']
|
341
|
+
# Check the value of Return-Path of the message
|
342
|
+
match += 1 if mhead['return-path'] =~ Re0[:'return-path']
|
343
|
+
end
|
344
|
+
break unless match > 0
|
345
|
+
|
346
|
+
re_skip = %r{(?>
|
347
|
+
\A[-]+=
|
348
|
+
|\A\s+\z
|
349
|
+
|\A\s*--
|
350
|
+
|\A\s+[=]\d+
|
351
|
+
|\AHi[ ][!]
|
352
|
+
|Content-(?:Description|Disposition|Transfer-Encoding|Type):[ ]
|
353
|
+
|(?:name|charset)=
|
354
|
+
|--\z
|
355
|
+
|:[ ]--------
|
356
|
+
)
|
357
|
+
}xi
|
358
|
+
re_stop = %r{(?:
|
359
|
+
\AContent-Type:[ ]message/delivery-status
|
360
|
+
|\AHere[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]first[ ]part[ ]of[ ]the[ ]message
|
361
|
+
|\AThe[ ]non-delivered[ ]message[ ]is[ ]attached[ ]to[ ]this[ ]message.
|
362
|
+
|\AReceived:[ \t]*
|
363
|
+
|\AReceived-From-MTA:[ \t]*
|
364
|
+
|\AReporting-MTA:[ \t]*
|
365
|
+
|\AReturn-Path:[ \t]*
|
366
|
+
|\AA[ ]copy[ ]of[ ]the[ ]original[ ]message[ ]below[ ]this[ ]line:
|
367
|
+
|Attachment[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]message
|
368
|
+
|Below[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]original[ ]message:
|
369
|
+
|Below[ ]this[ ]line[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]message
|
370
|
+
|Message[ ]contains[ ].+[ ]file[ ]attachments
|
371
|
+
|Message[ ]text[ ]follows:[ ]
|
372
|
+
|Original[ ]message[ ]follows
|
373
|
+
|The[ ]attachment[ ]contains[ ]the[ ]original[ ]mail[ ]headers
|
374
|
+
|The[ ]first[ ]\d+[ ]lines[ ]
|
375
|
+
|Unsent[ ]Message[ ]below
|
376
|
+
|Your[ ]message[ ]reads[ ][(]in[ ]part[)]:
|
377
|
+
)
|
378
|
+
}xi
|
379
|
+
re_addr = %r{(?:
|
380
|
+
\A\s*
|
381
|
+
|\A["].+["]\s*
|
382
|
+
|\A[ \t]*Recipient:[ \t]*
|
383
|
+
|\A[ ]*Address:[ ]
|
384
|
+
|addressed[ ]to[ ]
|
385
|
+
|Could[ ]not[ ]be[ ]delivered[ ]to:[ ]
|
386
|
+
|delivered[ ]to[ ]+
|
387
|
+
|delivery[ ]failed:[ ]
|
388
|
+
|Did[ ]not[ ]reach[ ]the[ ]following[ ]recipient:[ ]
|
389
|
+
|Error-for:[ ]+
|
390
|
+
|Failed[ ]Recipient:[ ]
|
391
|
+
|Failed[ ]to[ ]deliver[ ]to[ ]
|
392
|
+
|generated[ ]from[ ]
|
393
|
+
|Intended[ ]recipient:[ ]
|
394
|
+
|Mailbox[ ]is[ ]full:[ ]
|
395
|
+
|RCPT[ ]To:
|
396
|
+
|SMTP[ ]Server[ ][<].+[>][ ]rejected[ ]recipient[ ]
|
397
|
+
|The[ ]following[ ]recipients[ ]returned[ ]permanent[ ]errors:[ ]
|
398
|
+
|The[ ]following[ ]message[ ]to[ ]
|
399
|
+
|Unknown[ ]User:[ ]
|
400
|
+
|undeliverable[ ]to[ ]
|
401
|
+
|Undeliverable[ ]Address:[ ]*
|
402
|
+
|You[ ]sent[ ]mail[ ]to[ ]
|
403
|
+
|Your[ ]message[ ]to[ ]
|
404
|
+
)
|
405
|
+
['"]?[<]?([^\s\n\r@=]+[@][-.0-9A-Za-z]+[.][0-9A-Za-z]+)[>]?['"]?
|
406
|
+
}xi
|
407
|
+
|
408
|
+
b = dscontents[-1]
|
409
|
+
mbody.split("\n").each do |e|
|
410
|
+
# Get the recipient's email address and error messages.
|
411
|
+
break if e =~ Re1[:endof]
|
412
|
+
break if e =~ Re1[:rfc822]
|
413
|
+
break if e =~ re_stop
|
414
|
+
|
415
|
+
next if e.size == 0
|
416
|
+
next if e =~ re_skip
|
417
|
+
next if e =~ /\A[*]/
|
418
|
+
|
419
|
+
if cv = e.match(re_addr)
|
420
|
+
# May be an email address
|
421
|
+
x = b['recipient'] || ''
|
422
|
+
y = Sisimai::Address.s3s4(cv[1])
|
423
|
+
|
424
|
+
if x.size > 0 && x != y
|
425
|
+
# There are multiple recipient addresses in the message body.
|
426
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
427
|
+
b = dscontents[-1]
|
428
|
+
end
|
429
|
+
b['recipient'] = y
|
430
|
+
b['agent'] = self.smtpagent + '::Fallback'
|
431
|
+
recipients += 1
|
432
|
+
|
433
|
+
elsif cv = e.match(/[(]expanded[ ]from:[ ]([^@]+[@][^@]+)[)]/)
|
434
|
+
# (expanded from: neko@example.jp)
|
435
|
+
b['alias'] = Sisimai::Address.s3s4(cv[1])
|
436
|
+
end
|
437
|
+
b['diagnosis'] ||= ''
|
438
|
+
b['diagnosis'] += ' ' + e
|
439
|
+
end
|
440
|
+
|
441
|
+
break
|
442
|
+
end
|
443
|
+
|
444
|
+
return nil unless recipients > 0
|
445
|
+
require 'sisimai/string'
|
446
|
+
require 'sisimai/smtp/status'
|
447
|
+
|
448
|
+
dscontents.map do |e|
|
449
|
+
# Set default values if each value is empty.
|
450
|
+
connheader.each_key { |a| e[a] ||= connheader[a] || '' }
|
451
|
+
|
452
|
+
if e.key?('alterrors') && e['alterrors'].size > 0
|
453
|
+
# Copy alternative error message
|
454
|
+
e['diagnosis'] ||= e['alterrors']
|
455
|
+
if e['diagnosis'] =~ /\A[-]+/ || e['diagnosis'] =~ /__\z/
|
456
|
+
# Override the value of diagnostic code message
|
457
|
+
e['diagnosis'] = e['alterrors'] if e['alterrors'].size > 0
|
458
|
+
end
|
459
|
+
e.delete('alterrors')
|
460
|
+
end
|
461
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis']) || ''
|
462
|
+
|
463
|
+
if scannedset
|
464
|
+
# Make bounce data by the values returned from Sisimai::MDA->scan()
|
465
|
+
e['agent'] = scannedset['mda'] || self.smtpagent
|
466
|
+
e['reason'] = scannedset['reason'] || 'undefined'
|
467
|
+
e['diagnosis'] = scannedset['message'] if scannedset['message'].size > 0
|
468
|
+
e['command'] = ''
|
469
|
+
|
470
|
+
else
|
471
|
+
# Set the value of smtpagent
|
472
|
+
e['agent'] = self.smtpagent
|
473
|
+
end
|
474
|
+
|
475
|
+
e['status'] ||= Sisimai::SMTP::Status.find(e['diagnosis'])
|
476
|
+
if cv = e['diagnosis'].match(Re1[:command])
|
477
|
+
e['command'] = cv[1]
|
478
|
+
end
|
479
|
+
|
480
|
+
if mhead['received'].size > 0
|
481
|
+
# Get localhost and remote host name from Received header.
|
482
|
+
r0 = mhead['received']
|
483
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
484
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
485
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
486
|
+
end
|
487
|
+
|
488
|
+
e['date'] ||= mhead['date']
|
489
|
+
e['spec'] ||= 'SMTP'
|
490
|
+
e.each_key { |a| e[a] ||= '' }
|
491
|
+
end
|
492
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
493
|
+
end
|
494
|
+
|
495
|
+
end
|
496
|
+
end
|
497
|
+
end
|