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,150 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::RFC3834 - RFC3834 auto reply message detector
|
3
|
+
module RFC3834
|
4
|
+
# Imported from p5-Sisimail/lib/Sisimai/RFC3834.pm
|
5
|
+
class << self
|
6
|
+
# http://tools.ietf.org/html/rfc3834
|
7
|
+
Re0 = {
|
8
|
+
# http://www.iana.org/assignments/auto-submitted-keywords/auto-submitted-keywords.xhtml
|
9
|
+
:'auto-submitted' => %r/\Aauto-(?:generated|replied|notified)/i,
|
10
|
+
# https://msdn.microsoft.com/en-us/library/ee219609(v=exchg.80).aspx
|
11
|
+
:'x-auto-response-suppress' => %r/(?:OOF|AutoReply)/i,
|
12
|
+
:'precedence' => %r/\Aauto_reply\z/,
|
13
|
+
:'subject' => %r/\A(?:
|
14
|
+
Auto:
|
15
|
+
|Out[ ]of[ ]Office:
|
16
|
+
)
|
17
|
+
/xi,
|
18
|
+
}
|
19
|
+
Re1 = { :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/ }
|
20
|
+
Re2 = {
|
21
|
+
:subject => %r/(?:
|
22
|
+
SECURITY[ ]information[ ]for # sudo
|
23
|
+
|Mail[ ]failure[ ][-] # Exim
|
24
|
+
)
|
25
|
+
/x,
|
26
|
+
:from => %r/(?:root|postmaster|mailer-daemon)[@]/i,
|
27
|
+
:to => %r/root[@]/,
|
28
|
+
}
|
29
|
+
|
30
|
+
def description; 'Detector for auto replied message'; end
|
31
|
+
def smtpagent; 'RFC3834'; end
|
32
|
+
def pattern; return Re0; end
|
33
|
+
def headerlist
|
34
|
+
return [
|
35
|
+
'Auto-Submitted',
|
36
|
+
'Precedence',
|
37
|
+
'X-Auto-Response-Suppress',
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
# Detect auto reply message as RFC3834
|
42
|
+
# @param [Hash] mhead Message header of a bounce email
|
43
|
+
# @options mhead [String] from From header
|
44
|
+
# @options mhead [String] date Date header
|
45
|
+
# @options mhead [String] subject Subject header
|
46
|
+
# @options mhead [Array] received Received headers
|
47
|
+
# @options mhead [String] others Other required headers
|
48
|
+
# @param [String] mbody Message body of a bounce email
|
49
|
+
# @return [Hash, Undef] Bounce data list and message/rfc822 part
|
50
|
+
# or Undef if it failed to parse or the
|
51
|
+
# arguments are missing
|
52
|
+
def scan(mhead, mbody)
|
53
|
+
return nil unless mhead
|
54
|
+
return nil unless mbody
|
55
|
+
return nil if mhead.keys.size == 0
|
56
|
+
return nil if mbody.size == 0
|
57
|
+
|
58
|
+
leave = 0
|
59
|
+
match = 0
|
60
|
+
|
61
|
+
# DETECT_EXCLUSION_MESSAGE
|
62
|
+
Re2.each_key do |e|
|
63
|
+
# Exclude message from root@
|
64
|
+
next unless mhead.key?(e.to_s)
|
65
|
+
next unless mhead[e.to_s]
|
66
|
+
next unless mhead[e.to_s] =~ Re2[e]
|
67
|
+
leave = 1
|
68
|
+
break
|
69
|
+
end
|
70
|
+
return nil if leave > 0
|
71
|
+
|
72
|
+
# DETECT_AUTO_REPLY_MESSAGE
|
73
|
+
Re0.each_key do |e|
|
74
|
+
# RFC3834 Auto-Submitted and other headers
|
75
|
+
next unless mhead.key?(e.to_s)
|
76
|
+
next unless mhead[e.to_s]
|
77
|
+
next unless mhead[e.to_s] =~ Re0[e]
|
78
|
+
match += 1
|
79
|
+
break
|
80
|
+
end
|
81
|
+
return nil if match < 1
|
82
|
+
|
83
|
+
require 'sisimai/mta'
|
84
|
+
require 'sisimai/address'
|
85
|
+
require 'sisimai/rfc5322'
|
86
|
+
|
87
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
88
|
+
hasdivided = mbody.split("\n")
|
89
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
90
|
+
maxmsgline = 5 # (Integer) Max message length(lines)
|
91
|
+
haveloaded = 0 # (Integer) The number of lines loaded from message body
|
92
|
+
blanklines = 0 # (Integer) Counter for countinuous blank lines
|
93
|
+
v = dscontents[-1]
|
94
|
+
|
95
|
+
# RECIPIENT_ADDRESS
|
96
|
+
['from', 'return-path'].each do |e|
|
97
|
+
# Try to get the address of the recipient
|
98
|
+
next unless mhead.key?(e)
|
99
|
+
next unless mhead[e]
|
100
|
+
v['recipient'] = mhead[e]
|
101
|
+
break
|
102
|
+
end
|
103
|
+
|
104
|
+
if v['recipient']
|
105
|
+
# Clean-up the recipient address
|
106
|
+
v['recipient'] = Sisimai::Address.s3s4(v['recipient'])
|
107
|
+
recipients += 1
|
108
|
+
end
|
109
|
+
return nil unless recipients > 0
|
110
|
+
|
111
|
+
# BODY_PARSER: Get vacation message
|
112
|
+
hasdivided.each do |e|
|
113
|
+
# Read the first 5 lines except a blank line
|
114
|
+
unless e.size > 0
|
115
|
+
# Check a blank line
|
116
|
+
blanklines += 1
|
117
|
+
break if blanklines > 1
|
118
|
+
next
|
119
|
+
end
|
120
|
+
next unless e =~ / /
|
121
|
+
|
122
|
+
v['diagnosis'] ||= ''
|
123
|
+
v['diagnosis'] += e + ' '
|
124
|
+
haveloaded += 1
|
125
|
+
break if haveloaded >= maxmsgline
|
126
|
+
end
|
127
|
+
v['diagnosis'] ||= mhead['subject']
|
128
|
+
|
129
|
+
require 'sisimai/string'
|
130
|
+
v['diagnosis'] = Sisimai::String.sweep(v['diagnosis'])
|
131
|
+
v['reason'] = 'vacation'
|
132
|
+
v['agent'] = self.smtpagent
|
133
|
+
v['date'] = mhead['date']
|
134
|
+
v['status'] = ''
|
135
|
+
|
136
|
+
if mhead['received'].size > 0
|
137
|
+
# Get localhost and remote host name from Received header.
|
138
|
+
r = mhead['received']
|
139
|
+
['lhost', 'rhost'].each { |a| v[a] ||= '' }
|
140
|
+
v['lhost'] = Sisimai::RFC5322.received(r[0]).shift if v['lhost'].empty?
|
141
|
+
v['rhost'] = Sisimai::RFC5322.received(r[-1]).pop if v['rhost'].empty?
|
142
|
+
end
|
143
|
+
|
144
|
+
v.each_key { |a| v[a] ||= '' }
|
145
|
+
return { 'ds' => dscontents, 'rfc822' => '' }
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::RFC5322 provide methods for checking email address.
|
3
|
+
module RFC5322
|
4
|
+
# Imported from p5-Sisimail/lib/Sisimai/RFC5322.pm
|
5
|
+
class << self
|
6
|
+
HeaderTable = {
|
7
|
+
'messageid' => ['Message-Id'],
|
8
|
+
'subject' => ['Subject'],
|
9
|
+
'listid' => ['List-Id'],
|
10
|
+
'date' => ['Date', 'Posted-Date', 'Posted', 'Resent-Date'],
|
11
|
+
'addresser' => [
|
12
|
+
'From', 'Return-Path', 'Reply-To', 'Errors-To', 'Reverse-Path',
|
13
|
+
'X-Postfix-Sender', 'Envelope-From', 'X-Envelope-From',
|
14
|
+
],
|
15
|
+
'recipient' => [
|
16
|
+
'To', 'Delivered-To', 'Forward-Path', 'Envelope-To',
|
17
|
+
'X-Envelope-To', 'Resent-To', 'Apparently-To'
|
18
|
+
],
|
19
|
+
}
|
20
|
+
|
21
|
+
build_regular_expressions = lambda do
|
22
|
+
# See http://www.ietf.org/rfc/rfc5322.txt
|
23
|
+
# or http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html ...
|
24
|
+
# addr-spec = local-part "@" domain
|
25
|
+
# local-part = dot-atom / quoted-string / obs-local-part
|
26
|
+
# domain = dot-atom / domain-literal / obs-domain
|
27
|
+
# domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]
|
28
|
+
# dcontent = dtext / quoted-pair
|
29
|
+
# dtext = NO-WS-CTL / ; Non white space controls
|
30
|
+
# %d33-90 / ; The rest of the US-ASCII
|
31
|
+
# %d94-126 ; characters not including "[",
|
32
|
+
# ; "]", or "\"
|
33
|
+
re = { 'rfc5322' => nil, 'ignored' => nil, 'domain' => nil }
|
34
|
+
atom = %r([a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)o
|
35
|
+
quoted_string = %r/"(?:\\[^\r\n]|[^\\"])*"/o
|
36
|
+
domain_literal = %r/\[(?:\\[\x01-\x09\x0B-\x0c\x0e-\x7f]|[\x21-\x5a\x5e-\x7e])*\]/o
|
37
|
+
dot_atom = %r/#{atom}(?:[.]#{atom})*/o
|
38
|
+
local_part = %r/(?:#{dot_atom}|#{quoted_string})/o
|
39
|
+
domain = %r/(?:#{dot_atom}|#{domain_literal})/o
|
40
|
+
|
41
|
+
re['rfc5322'] = %r/#{local_part}[@]#{domain}/o
|
42
|
+
re['ignored'] = %r/#{local_part}[.]*[@]#{domain}/o
|
43
|
+
re['domain'] = %r/#{domain}/o
|
44
|
+
|
45
|
+
return re
|
46
|
+
end
|
47
|
+
|
48
|
+
build_flatten_rfc822header_list = lambda do
|
49
|
+
# Convert HEADER: structured hash table to flatten hash table for being
|
50
|
+
# called from Sisimai::MTA::*
|
51
|
+
fv = {}
|
52
|
+
HeaderTable.each_value do |e|
|
53
|
+
e.each do |ee|
|
54
|
+
fv[ee.downcase] = 1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
return fv
|
58
|
+
end
|
59
|
+
|
60
|
+
Re = build_regular_expressions.call
|
61
|
+
HeaderIndex = build_flatten_rfc822header_list.call
|
62
|
+
|
63
|
+
# Grouped RFC822 headers
|
64
|
+
# @param [String] group RFC822 Header group name
|
65
|
+
# @return [Array,Hash] RFC822 Header list
|
66
|
+
def HEADERFIELDS(group = '')
|
67
|
+
return HeaderIndex unless group.size > 0
|
68
|
+
return HeaderTable[group] if HeaderTable.key?(group)
|
69
|
+
return HeaderTable
|
70
|
+
end
|
71
|
+
|
72
|
+
# Fields that might be long
|
73
|
+
# @return [Hash] Long filed(email header) list
|
74
|
+
def LONGFIELDS
|
75
|
+
return { 'to' => 1, 'from' => 1, 'subject' => 1, 'message-id' => 1 }
|
76
|
+
end
|
77
|
+
|
78
|
+
# Check that the argument is an email address or not
|
79
|
+
# @param [String] email Email address string
|
80
|
+
# @return [True,False] true: is a email address
|
81
|
+
# false: is not an email address
|
82
|
+
def is_emailaddress(email)
|
83
|
+
return false unless email.is_a?(::String)
|
84
|
+
return false if email =~ %r/(?:[\x00-\x1f]|\x1f)/
|
85
|
+
return true if email =~ Re['ignored']
|
86
|
+
return false
|
87
|
+
end
|
88
|
+
|
89
|
+
# Check that the argument is an domain part of email address or not
|
90
|
+
# @param [String] dpart Domain part of the email address
|
91
|
+
# @return [True,False] true: Valid domain part
|
92
|
+
# false: Not a valid domain part
|
93
|
+
def is_domainpart(dpart)
|
94
|
+
return false unless dpart.is_a?(::String)
|
95
|
+
return false if dpart =~ /(?:[\x00-\x1f]|\x1f)/
|
96
|
+
return false if dpart =~ /[@]/
|
97
|
+
return true if dpart =~ Re['domain']
|
98
|
+
return false
|
99
|
+
end
|
100
|
+
|
101
|
+
# Check that the argument is mailer-daemon or not
|
102
|
+
# @param [String] email Email address
|
103
|
+
# @return [True,False] true: mailer-daemon
|
104
|
+
# false: Not mailer-daemon
|
105
|
+
def is_mailerdaemon(email)
|
106
|
+
return false unless email.is_a?(::String)
|
107
|
+
|
108
|
+
re = %r/(?:
|
109
|
+
mailer-daemon[@]
|
110
|
+
|[<(]mailer-daemon[)>]
|
111
|
+
|\Amailer-daemon\z
|
112
|
+
|[ ]?mailer-daemon[ ]
|
113
|
+
)
|
114
|
+
/xi
|
115
|
+
return true if email =~ re
|
116
|
+
return false
|
117
|
+
end
|
118
|
+
|
119
|
+
# Convert Received headers to a structured data
|
120
|
+
# @param [String] argvs Received header
|
121
|
+
# @return [Array] Received header as a structured data
|
122
|
+
def received(argvs)
|
123
|
+
return [] unless argvs.is_a?(::String)
|
124
|
+
|
125
|
+
hosts = []
|
126
|
+
value = { 'from' => '', 'by' => '' }
|
127
|
+
|
128
|
+
# Received: (qmail 10000 invoked by uid 999); 24 Apr 2013 00:00:00 +0900
|
129
|
+
return [] if argvs =~ /qmail[ ]+.+invoked[ ]+/
|
130
|
+
|
131
|
+
if cr = argvs.match(/\Afrom[ ]+(.+)[ ]+by[ ]+([^ ]+)/)
|
132
|
+
# Received: from localhost (localhost)
|
133
|
+
# by nijo.example.jp (V8/cf) id s1QB5ma0018057;
|
134
|
+
# Wed, 26 Feb 2014 06:05:48 -0500
|
135
|
+
value['from'] = cr[1]
|
136
|
+
value['by'] = cr[2]
|
137
|
+
|
138
|
+
elsif cr = argvs.match(/\bby[ ]+([^ ]+)(.+)/)
|
139
|
+
# Received: by 10.70.22.98 with SMTP id c2mr1838265pdf.3; Fri, 18 Jul 2014
|
140
|
+
# 00:31:02 -0700 (PDT)
|
141
|
+
value['from'] = cr[1] + cr[2]
|
142
|
+
value['by'] = cr[1]
|
143
|
+
end
|
144
|
+
|
145
|
+
if value['from'] =~ / /
|
146
|
+
# Received: from [10.22.22.222] (smtp-gateway.kyoto.ocn.ne.jp [192.0.2.222])
|
147
|
+
# (authenticated bits=0)
|
148
|
+
# by nijo.example.jp (V8/cf) with ESMTP id s1QB5ka0018055;
|
149
|
+
# Wed, 26 Feb 2014 06:05:47 -0500
|
150
|
+
received = value['from'].split(' ')
|
151
|
+
namelist = []
|
152
|
+
addrlist = []
|
153
|
+
hostname = ''
|
154
|
+
hostaddr = ''
|
155
|
+
|
156
|
+
received.each do |e|
|
157
|
+
# Received: from [10.22.22.222] (smtp-gateway.kyoto.ocn.ne.jp [192.0.2.222])
|
158
|
+
if e =~ /\A[\[(]\d+[.]\d+[.]\d+[.]\d+[)\]]\z/
|
159
|
+
# [192.0.2.1] or (192.0.2.1)
|
160
|
+
e = e.delete('[]()')
|
161
|
+
addrlist << e
|
162
|
+
|
163
|
+
else
|
164
|
+
# hostname
|
165
|
+
e = e.delete('[]()')
|
166
|
+
namelist << e
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
namelist.each do |e|
|
171
|
+
# 1. Hostname takes priority over all other IP addresses
|
172
|
+
next unless e =~ /[.]/
|
173
|
+
hostname = e
|
174
|
+
break
|
175
|
+
end
|
176
|
+
|
177
|
+
if hostname.length == 0
|
178
|
+
# 2. Use IP address as a remote host name
|
179
|
+
addrlist.each do |e|
|
180
|
+
# Skip if the address is a private address
|
181
|
+
next if e =~ /\A(?:10|127)[.]/
|
182
|
+
next if e =~ /\A172[.](?:1[6-9]|2[0-9]|3[0-1])[.]/
|
183
|
+
next if e =~ /\A192[.]168[.]/
|
184
|
+
hostaddr = e
|
185
|
+
break
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
value['from'] = hostname || hostaddr || addrlist[-1]
|
190
|
+
end
|
191
|
+
|
192
|
+
%w[from by].each do |e|
|
193
|
+
# Copy entries into hosts
|
194
|
+
next unless value[e].length > 0
|
195
|
+
value[e] = value[e].delete('[]();?')
|
196
|
+
hosts << value[e]
|
197
|
+
end
|
198
|
+
return hosts
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::Rhost detects the bounce reason from the content of Sisimai::Data
|
3
|
+
# object as an argument of get() method when the value of rhost of the object
|
4
|
+
# is listed in the results of Sisimai::Rhost->list method.
|
5
|
+
# This class is called only Sisimai::Data class.
|
6
|
+
module Rhost
|
7
|
+
class << self
|
8
|
+
# Imported from p5-Sisimail/lib/Sisimai/Rhost.pm
|
9
|
+
RhostClass = {
|
10
|
+
'aspmx.l.google.com' => 'GoogleApps',
|
11
|
+
}
|
12
|
+
|
13
|
+
# Retrun the list of remote hosts Sisimai support
|
14
|
+
# @return [Array] Remote host list
|
15
|
+
def list
|
16
|
+
return RhostClass.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
# The value of "rhost" is listed in $RhostClass or not
|
20
|
+
# @param [String] argvs Remote host name
|
21
|
+
# @return [True,False] True: matched
|
22
|
+
# False: did not match
|
23
|
+
def match(host)
|
24
|
+
return false unless host.is_a? ::String
|
25
|
+
return true if RhostClass.key?(host.downcase)
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
|
29
|
+
# Detect the bounce reason from certain remote hosts
|
30
|
+
# @param [Sisimai::Data] argvs Parsed email object
|
31
|
+
# @return [String] The value of bounce reason
|
32
|
+
def get(argvs)
|
33
|
+
return nil unless argvs
|
34
|
+
return nil unless argvs.is_a? Sisimai::Data
|
35
|
+
return argvs.reason if argvs.reason.size > 0
|
36
|
+
|
37
|
+
remotehost = argvs.rhost.downcase
|
38
|
+
modulename = 'Sisimai::Rhost::' + RhostClass[remotehost]
|
39
|
+
rhostclass = modulename.gsub('::', '/').downcase
|
40
|
+
require rhostclass
|
41
|
+
|
42
|
+
reasontext = Module.const_get(modulename).get(argvs)
|
43
|
+
return reasontext
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,237 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module Rhost
|
3
|
+
# Sisimai::Rhost detects the bounce reason from the content of Sisimai::Data
|
4
|
+
# object as an argument of get() method when the value of "rhost" of the object
|
5
|
+
# is "aspmx.l.google.com". This class is called only Sisimai::Data class.
|
6
|
+
module GoogleApps
|
7
|
+
class << self
|
8
|
+
# Imported from p5-Sisimail/lib/Sisimai/Rhost/GoogleApps.pm
|
9
|
+
SMTPErrorSet = {
|
10
|
+
'X.1.1' => [
|
11
|
+
{
|
12
|
+
'reason' => 'userunknown',
|
13
|
+
'regexp' => [%r/The email account that you tried to reach does not exist[.]/],
|
14
|
+
}
|
15
|
+
],
|
16
|
+
'X.1.2' => [
|
17
|
+
{
|
18
|
+
'reason' => 'hostunknown',
|
19
|
+
'regexp' => [%r/We weren't able to find the recipient domain[.]/],
|
20
|
+
},
|
21
|
+
],
|
22
|
+
'X.2.1' => [
|
23
|
+
{
|
24
|
+
'reason' => 'undefined',
|
25
|
+
'regexp' => [
|
26
|
+
%r/The user you are trying to contact is receiving mail too quickly[.]/,
|
27
|
+
%r/The user you are trying to contact is receiving mail at a rate/,
|
28
|
+
],
|
29
|
+
},
|
30
|
+
{
|
31
|
+
'reason' => 'suspend',
|
32
|
+
'regexp' => [%r/The email account that you tried to reach is disabled[.]/],
|
33
|
+
},
|
34
|
+
],
|
35
|
+
'X.2.2' => [
|
36
|
+
{
|
37
|
+
'reason' => 'mailboxfull',
|
38
|
+
'regexp' => [%r/The email account that you tried to reach is over quota[.]/],
|
39
|
+
},
|
40
|
+
],
|
41
|
+
'X.2.3' => [
|
42
|
+
{
|
43
|
+
'reason' => 'exceedlimit',
|
44
|
+
'regexp' => [%r/Your message exceeded Google's message size limits[.]/],
|
45
|
+
},
|
46
|
+
],
|
47
|
+
'X.3.0' => [
|
48
|
+
{
|
49
|
+
'reason' => 'undefined',
|
50
|
+
'regexp' => [
|
51
|
+
%r/Mail server temporarily rejected message[.]/,
|
52
|
+
%r/Multiple destination domains per transaction is unsupported[.]/,
|
53
|
+
],
|
54
|
+
},
|
55
|
+
],
|
56
|
+
'X.4.2' => [
|
57
|
+
{
|
58
|
+
'reason' => 'expired',
|
59
|
+
'regexp' => [%r/Timeout [-] closing connection[.]/],
|
60
|
+
},
|
61
|
+
],
|
62
|
+
'X.4.5' => [
|
63
|
+
{
|
64
|
+
'reason' => 'undefined',
|
65
|
+
'regexp' => [%r/Server busy, try again later[.]/],
|
66
|
+
},
|
67
|
+
{
|
68
|
+
'reason' => 'exceedlimit',
|
69
|
+
'regexp' => [%r/Daily sending quota exceeded[.]/],
|
70
|
+
},
|
71
|
+
],
|
72
|
+
'X.5.0' => [
|
73
|
+
{
|
74
|
+
'reason' => 'undefined',
|
75
|
+
'regexp' => [
|
76
|
+
%r/SMTP protocol violation, see RFC 2821[.]/,
|
77
|
+
%r/SMTP protocol violation, no commands allowed to pipeline after STARTTLS/,
|
78
|
+
],
|
79
|
+
},
|
80
|
+
],
|
81
|
+
'X.5.1' => [
|
82
|
+
{
|
83
|
+
'reason' => 'syntaxerror',
|
84
|
+
'regexp' => [
|
85
|
+
%r/STARTTLS may not be repeated[.]/,
|
86
|
+
%r/Too many unrecognized commands, goodbye[.]/,
|
87
|
+
%r/Unimplemented command[.]/,
|
88
|
+
%r/Unrecognized command[.]/,
|
89
|
+
%r|EHLO/HELO first[.]|,
|
90
|
+
%r/MAIL first[.]/,
|
91
|
+
%r/RCPT first[.]/,
|
92
|
+
],
|
93
|
+
},
|
94
|
+
{
|
95
|
+
'reason' => 'securityerror',
|
96
|
+
'regexp' => [%r/Authentication Required[.]/],
|
97
|
+
},
|
98
|
+
],
|
99
|
+
'X.5.2' => [
|
100
|
+
{
|
101
|
+
'reason' => 'undefined',
|
102
|
+
'regexp' => [%r/Cannot Decode response[.]/],
|
103
|
+
},
|
104
|
+
{
|
105
|
+
'reason' => 'syntaxerror',
|
106
|
+
'regexp' => [%r/Syntax error[.]/],
|
107
|
+
},
|
108
|
+
],
|
109
|
+
'X.5.3' => [
|
110
|
+
{
|
111
|
+
'reason' => 'undefined',
|
112
|
+
'regexp' => [
|
113
|
+
%r/Domain policy size per transaction exceeded[,]/,
|
114
|
+
%r/Your message has too many recipients[.]/,
|
115
|
+
],
|
116
|
+
},
|
117
|
+
],
|
118
|
+
'X.5.4' => [
|
119
|
+
{
|
120
|
+
'reason' => 'syntaxerror',
|
121
|
+
'regexp' => [%r/Optional Argument not permitted for that AUTH mode[.]/],
|
122
|
+
},
|
123
|
+
],
|
124
|
+
'X.6.0' => [
|
125
|
+
{
|
126
|
+
'reason' => 'contenterror',
|
127
|
+
'regexp' => [
|
128
|
+
%r/Mail message is malformed[.]/,
|
129
|
+
%r/Message exceeded 50 hops/,
|
130
|
+
],
|
131
|
+
},
|
132
|
+
],
|
133
|
+
'X.7.0' => [
|
134
|
+
{
|
135
|
+
'reason' => 'blocked',
|
136
|
+
'regexp' => [
|
137
|
+
%r/IP not in whitelist for RCPT domain, closing connection[.]/,
|
138
|
+
%r/Our system has detected an unusual rate of unsolicited mail originating from your IP address[.]/,
|
139
|
+
],
|
140
|
+
},
|
141
|
+
{
|
142
|
+
'reason' => 'expired',
|
143
|
+
'regexp' => [
|
144
|
+
%r/Temporary System Problem. Try again later[.]/,
|
145
|
+
%r/Try again later, closing connection[.]/,
|
146
|
+
],
|
147
|
+
},
|
148
|
+
{
|
149
|
+
'reason' => 'securityerror',
|
150
|
+
'regexp' => [
|
151
|
+
%r/TLS required for RCPT domain, closing connection[.]/,
|
152
|
+
%r/No identity changes permitted[.]/,
|
153
|
+
%r/Must issue a STARTTLS command first[.]/,
|
154
|
+
%r/Too Many Unauthenticated commands[.]/,
|
155
|
+
],
|
156
|
+
},
|
157
|
+
{
|
158
|
+
'reason' => 'systemerror',
|
159
|
+
'regexp' => [%r/Cannot authenticate due to temporary system problem[.]/],
|
160
|
+
},
|
161
|
+
{
|
162
|
+
'reason' => 'norelaying',
|
163
|
+
'regexp' => [%r/Mail relay denied[.]/],
|
164
|
+
},
|
165
|
+
{
|
166
|
+
'reason' => 'rejected',
|
167
|
+
'regexp' => [%r/Mail Sending denied[.]/],
|
168
|
+
},
|
169
|
+
],
|
170
|
+
'X.7.1' => [
|
171
|
+
{
|
172
|
+
'reason' => 'securityerror',
|
173
|
+
'regexp' => [
|
174
|
+
%r/Application-specific password required[.]/,
|
175
|
+
%r/Please log in with your web browser and then try again[.]/,
|
176
|
+
%r/Username and Password not accepted[.]/,
|
177
|
+
],
|
178
|
+
},
|
179
|
+
{
|
180
|
+
'reason' => 'mailboxfull',
|
181
|
+
'regexp' => [%r/Email quota exceeded[.]/],
|
182
|
+
},
|
183
|
+
{
|
184
|
+
'reason' => 'blocked',
|
185
|
+
'regexp' => [
|
186
|
+
%r/Our system has detected an unusual rate of unsolicited mail originating from your IP address[.]/,
|
187
|
+
%r/The IP you[']re using to send mail is not authorized to send email directly to our servers[.]/,
|
188
|
+
],
|
189
|
+
},
|
190
|
+
{
|
191
|
+
'reason' => 'contenterror',
|
192
|
+
'regexp' => [%r/Our system has detected that this message is likely unsolicited mail[.]/],
|
193
|
+
},
|
194
|
+
{
|
195
|
+
'reason' => 'filtered',
|
196
|
+
'regexp' => [%r/The user or domain that you are sending to [(]or from[)] has a policy/],
|
197
|
+
},
|
198
|
+
{
|
199
|
+
'reason' => 'rejected',
|
200
|
+
'regexp' => [%r/Unauthenticated email is not accepted from this domain[.]/],
|
201
|
+
},
|
202
|
+
],
|
203
|
+
'X.7.4' => [
|
204
|
+
{
|
205
|
+
'reason' => 'securityerror',
|
206
|
+
'regexp' => [%r/Unrecognized Authentication Type[.]/],
|
207
|
+
},
|
208
|
+
],
|
209
|
+
}
|
210
|
+
|
211
|
+
# Detect bounce reason from Google Apps
|
212
|
+
# @param [Sisimai::Data] argvs Parsed email object
|
213
|
+
# @return [String] The bounce reason for Google Apps
|
214
|
+
# @see https://support.google.com/a/answer/3726730?hl=en
|
215
|
+
def get(argvs)
|
216
|
+
return nil unless argvs
|
217
|
+
return nil unless argvs.is_a? Sisimai::Data
|
218
|
+
return argvs.reason if argvs.reason.size > 0
|
219
|
+
|
220
|
+
statuscode = argvs.deliverystatus.sub(/\A\d[.](\d+[.]\d+)\z/, 'X.\1')
|
221
|
+
statusmesg = argvs.diagnosticcode
|
222
|
+
reasontext = ''
|
223
|
+
errortable = SMTPErrorSet[statuscode] || []
|
224
|
+
|
225
|
+
errortable.each do |e|
|
226
|
+
# Try to match
|
227
|
+
next unless e['regexp'].find { |a| statusmesg =~ a }
|
228
|
+
reasontext = e['reason']
|
229
|
+
break if reasontext.size > 0
|
230
|
+
end
|
231
|
+
return reasontext
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|