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,243 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MSP::US
|
3
|
+
# Sisimai::MSP::US::Bigfoot parses a bounce email which created by Bigfoot.
|
4
|
+
# Methods in the module are called from only Sisimai::Message.
|
5
|
+
module Bigfoot
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MSP/US/Bigfoot.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/msp'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:from => %r/[@]bigfoot[.]com[>]/,
|
13
|
+
:subject => %r/\AReturned mail: /,
|
14
|
+
:received => %r/\w+[.]bigfoot[.]com\b/,
|
15
|
+
}
|
16
|
+
Re1 = {
|
17
|
+
:begin => %r/\A[ \t]+[-]+[ \t]*Transcript of session follows/,
|
18
|
+
:rfc822 => %r|\AContent-Type: message/partial|,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
}
|
21
|
+
Indicators = Sisimai::MSP.INDICATORS
|
22
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
23
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
24
|
+
|
25
|
+
def description; return 'Bigfoot: http://www.bigfoot.com'; end
|
26
|
+
def smtpagent; return 'US::Bigfoot'; end
|
27
|
+
def headerlist; return []; end
|
28
|
+
def pattern; return Re0; end
|
29
|
+
|
30
|
+
# Parse bounce messages from Bigfoot
|
31
|
+
# @param [Hash] mhead Message header of a bounce email
|
32
|
+
# @options mhead [String] from From header
|
33
|
+
# @options mhead [String] date Date header
|
34
|
+
# @options mhead [String] subject Subject header
|
35
|
+
# @options mhead [Array] received Received headers
|
36
|
+
# @options mhead [String] others Other required headers
|
37
|
+
# @param [String] mbody Message body of a bounce email
|
38
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
39
|
+
# part or nil if it failed to parse or
|
40
|
+
# the arguments are missing
|
41
|
+
def scan(mhead, mbody)
|
42
|
+
return nil unless mhead
|
43
|
+
return nil unless mbody
|
44
|
+
|
45
|
+
match = 0
|
46
|
+
match += 1 if mhead['from'] =~ Re0[:from]
|
47
|
+
match += 1 if mhead['received'].find { |a| a =~ Re0[:received] }
|
48
|
+
return nil if match == 0
|
49
|
+
|
50
|
+
require 'sisimai/address'
|
51
|
+
dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
|
52
|
+
hasdivided = mbody.split("\n")
|
53
|
+
havepassed = [''];
|
54
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
55
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
56
|
+
previousfn = '' # (String) Previous field name
|
57
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
58
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
59
|
+
commandtxt = '' # (String) SMTP Command name begin with the string '>>>'
|
60
|
+
esmtpreply = '' # (String) Reply from remote server on SMTP session
|
61
|
+
connvalues = 0 # (Integer) Flag, 1 if all the value of $connheader have been set
|
62
|
+
connheader = {
|
63
|
+
'date' => '', # The value of Arrival-Date header
|
64
|
+
'lhost' => '', # The value of Reporting-MTA header
|
65
|
+
}
|
66
|
+
v = nil
|
67
|
+
|
68
|
+
hasdivided.each do |e|
|
69
|
+
# Save the current line for the next loop
|
70
|
+
havepassed << e; p = havepassed[-2]
|
71
|
+
|
72
|
+
if readcursor == 0
|
73
|
+
# Beginning of the bounce message or delivery status part
|
74
|
+
if e =~ Re1[:begin]
|
75
|
+
readcursor |= Indicators[:'deliverystatus']
|
76
|
+
next
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
81
|
+
# Beginning of the original message part
|
82
|
+
if e =~ Re1[:rfc822]
|
83
|
+
readcursor |= Indicators[:'message-rfc822']
|
84
|
+
next
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
89
|
+
# After "message/rfc822"
|
90
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
91
|
+
# Get required headers only
|
92
|
+
lhs = cv[1].downcase
|
93
|
+
previousfn = ''
|
94
|
+
next unless RFC822Head.key?(lhs)
|
95
|
+
|
96
|
+
previousfn = lhs
|
97
|
+
rfc822part += e + "\n"
|
98
|
+
|
99
|
+
elsif e =~ /\A[ \t]+/
|
100
|
+
# Continued line from the previous line
|
101
|
+
next if rfc822next[previousfn]
|
102
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
103
|
+
|
104
|
+
else
|
105
|
+
# Check the end of headers in rfc822 part
|
106
|
+
next unless LongFields.key?(previousfn)
|
107
|
+
next unless e.empty?
|
108
|
+
rfc822next[previousfn] = true
|
109
|
+
end
|
110
|
+
|
111
|
+
else
|
112
|
+
# Before "message/rfc822"
|
113
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
114
|
+
next if e.empty?
|
115
|
+
|
116
|
+
if connvalues == connheader.keys.size
|
117
|
+
# Final-Recipient: RFC822; <destinaion@example.net>
|
118
|
+
# Action: failed
|
119
|
+
# Status: 5.7.1
|
120
|
+
# Remote-MTA: DNS; p01c11m075.mx.example.net
|
121
|
+
# Diagnostic-Code: SMTP; 553 Invalid recipient destinaion@example.net (Mode: normal)
|
122
|
+
# Last-Attempt-Date: Sun, 28 Dec 2014 18:17:16 -0800
|
123
|
+
v = dscontents[-1]
|
124
|
+
|
125
|
+
if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
|
126
|
+
# Final-Recipient: RFC822; <destinaion@example.net>
|
127
|
+
if v['recipient']
|
128
|
+
# There are multiple recipient addresses in the message body.
|
129
|
+
dscontents << Sisimai::MSP.DELIVERYSTATUS
|
130
|
+
v = dscontents[-1]
|
131
|
+
end
|
132
|
+
v['recipient'] = Sisimai::Address.s3s4(cv[1])
|
133
|
+
recipients += 1
|
134
|
+
|
135
|
+
elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
|
136
|
+
# Action: failed
|
137
|
+
v['action'] = cv[1].downcase
|
138
|
+
|
139
|
+
elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
|
140
|
+
# Status: 5.7.1
|
141
|
+
v['status'] = cv[1]
|
142
|
+
|
143
|
+
elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
144
|
+
# Remote-MTA: DNS; p01c11m075.mx.example.net
|
145
|
+
v['rhost'] = cv[1].downcase
|
146
|
+
|
147
|
+
else
|
148
|
+
# Get error message
|
149
|
+
if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
|
150
|
+
# Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
|
151
|
+
v['spec'] = cv[1].upcase
|
152
|
+
v['diagnosis'] = cv[2]
|
153
|
+
|
154
|
+
elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
|
155
|
+
# Continued line of the value of Diagnostic-Code header
|
156
|
+
v['diagnosis'] ||= ''
|
157
|
+
v['diagnosis'] += ' ' + cv[1]
|
158
|
+
havepassed[-1] = 'Diagnostic-Code: ' + e
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
else
|
163
|
+
# ----- Transcript of session follows -----
|
164
|
+
# >>> RCPT TO:<destinaion@example.net>
|
165
|
+
# <<< 553 Invalid recipient destinaion@example.net (Mode: normal)
|
166
|
+
#
|
167
|
+
# --201412281816847
|
168
|
+
# Content-Type: message/delivery-status
|
169
|
+
#
|
170
|
+
# Reporting-MTA: dns; litemail57.bigfoot.com
|
171
|
+
# Arrival-Date: Sun, 28 Dec 2014 18:17:16 -0800
|
172
|
+
#
|
173
|
+
if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
174
|
+
# Reporting-MTA: dns; mx.example.jp
|
175
|
+
next if connheader['lhost'].size > 0
|
176
|
+
connheader['lhost'] = cv[1].downcase
|
177
|
+
connvalues += 1
|
178
|
+
|
179
|
+
elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
|
180
|
+
# Arrival-Date: Wed, 29 Apr 2009 16:03:18 +0900
|
181
|
+
next if connheader['date'].size > 0
|
182
|
+
connheader['date'] = cv[1]
|
183
|
+
connvalues += 1
|
184
|
+
|
185
|
+
else
|
186
|
+
# ----- Transcript of session follows -----
|
187
|
+
# >>> RCPT TO:<destinaion@example.net>
|
188
|
+
# <<< 553 Invalid recipient destinaion@example.net (Mode: normal)
|
189
|
+
if cv = e.match(/\A[>]{3}[ ]+([A-Z]{4})[ ]?/)
|
190
|
+
# >>> DATA
|
191
|
+
commandtxt = cv[1]
|
192
|
+
|
193
|
+
elsif cv = e.match(/\A[<]{3}[ ]+(.+)\z/)
|
194
|
+
# <<< Response
|
195
|
+
esmtpreply = cv[1]
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
return nil if recipients == 0
|
205
|
+
require 'sisimai/string'
|
206
|
+
require 'sisimai/smtp/status'
|
207
|
+
|
208
|
+
dscontents.map do |e|
|
209
|
+
# Set default values if each value is empty.
|
210
|
+
connheader.each_key { |a| e[a] ||= connheader[a] || '' }
|
211
|
+
|
212
|
+
if mhead['received'].size > 0
|
213
|
+
# Get localhost and remote host name from Received header.
|
214
|
+
r0 = mhead['received']
|
215
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
216
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
217
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
218
|
+
end
|
219
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
220
|
+
|
221
|
+
e['command'] = commandtxt
|
222
|
+
if e['command'].empty?
|
223
|
+
e['command'] = 'EHLO' if esmtpreply.size > 0
|
224
|
+
end
|
225
|
+
|
226
|
+
if e['status'].empty? || e['status'] =~ /\A\d[.]0[.]0\z/
|
227
|
+
# There is no value of Status header or the value is 5.0.0, 4.0.0
|
228
|
+
pseudostatus = Sisimai::SMTP::Status.find(e['diagnosis'])
|
229
|
+
e['status'] = pseudostatus if pseudostatus.size > 0
|
230
|
+
end
|
231
|
+
|
232
|
+
e['spec'] ||= 'SMTP'
|
233
|
+
e['agent'] = Sisimai::MSP::US::Bigfoot.smtpagent
|
234
|
+
end
|
235
|
+
|
236
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
237
|
+
end
|
238
|
+
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
@@ -0,0 +1,306 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MSP::US
|
3
|
+
# Sisimai::MSP::US::Facebook parses a bounce email which created by Facebook.
|
4
|
+
# Methods in the module are called from only Sisimai::Message.
|
5
|
+
module Facebook
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MSP/US/Facebook.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/msp'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:from => %r/\AFacebook [<]mailer-daemon[@]mx[.]facebook[.]com[>]\z/,
|
13
|
+
:subject => %r/\ASorry, your message could not be delivered\z/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\AThis message was created automatically by Facebook[.]\z/,
|
17
|
+
:rfc822 => %r/\AContent-Disposition: inline\z/,
|
18
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
19
|
+
}
|
20
|
+
|
21
|
+
# http://postmaster.facebook.com/response_codes
|
22
|
+
# NOT TESTD EXCEPT RCP-P2
|
23
|
+
ReFailure = {
|
24
|
+
'userunknown' => [
|
25
|
+
'RCP-P1', # The attempted recipient address does not exist.
|
26
|
+
'INT-P1', # The attempted recipient address does not exist.
|
27
|
+
'INT-P3', # The attempted recpient group address does not exist.
|
28
|
+
'INT-P4', # The attempted recipient address does not exist.
|
29
|
+
],
|
30
|
+
'filtered' => [
|
31
|
+
'RCP-P2', # The attempted recipient's preferences prevent messages from being delivered.
|
32
|
+
'RCP-P3', # The attempted recipient's privacy settings blocked the delivery.
|
33
|
+
],
|
34
|
+
'mesgtoobig' => [
|
35
|
+
'MSG-P1', # The message exceeds Facebook's maximum allowed size.
|
36
|
+
'INT-P2', # The message exceeds Facebook's maximum allowed size.
|
37
|
+
],
|
38
|
+
'contenterror' => [
|
39
|
+
'MSG-P2', # The message contains an attachment type that Facebook does not accept.
|
40
|
+
'MSG-P3', # The message contains multiple instances of a header field that can only be present once. Please see RFC 5322, section 3.6 for more information
|
41
|
+
'POL-P6', # The message contains a url that has been blocked by Facebook.
|
42
|
+
'POL-P7', # The message does not comply with Facebook's abuse policies and will not be accepted.
|
43
|
+
],
|
44
|
+
'securityerror' => [
|
45
|
+
'POL-P1', # Your mail server's IP Address is listed on the Spamhaus PBL.
|
46
|
+
'POL-P2', # Facebook will no longer accept mail from your mail server's IP Address.
|
47
|
+
'POL-P5', # The message contains a virus.
|
48
|
+
'POL-P7', # The message does not comply with Facebook's Domain Authentication requirements.
|
49
|
+
],
|
50
|
+
'notaccept' => [
|
51
|
+
'POL-P3', # Facebook is not accepting messages from your mail server. This will persist for 4 to 8 hours.
|
52
|
+
'POL-P4', # Facebook is not accepting messages from your mail server. This will persist for 24 to 48 hours.
|
53
|
+
'POL-T1', # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 1 to 2 hours.
|
54
|
+
'POL-T2', # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 4 to 8 hours.
|
55
|
+
'POL-T3', # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 24 to 48 hours.
|
56
|
+
],
|
57
|
+
'rejected' => [
|
58
|
+
'DNS-P1', # Your SMTP MAIL FROM domain does not exist.
|
59
|
+
'DNS-P2', # Your SMTP MAIL FROM domain does not have an MX record.
|
60
|
+
'DNS-T1', # Your SMTP MAIL FROM domain exists but does not currently resolve.
|
61
|
+
'DNS-P3', # Your mail server does not have a reverse DNS record.
|
62
|
+
'DNS-T2', # You mail server's reverse DNS record does not currently resolve.
|
63
|
+
],
|
64
|
+
'systemerror' => [
|
65
|
+
'CON-T1', # Facebook's mail server currently has too many connections open to allow another one.
|
66
|
+
],
|
67
|
+
'undefined' => [
|
68
|
+
'RCP-T1', # The attempted recipient address is not currently available due to an internal system issue. This is a temporary condition.
|
69
|
+
'MSG-T1', # The number of recipients on the message exceeds Facebook's allowed maximum.
|
70
|
+
'CON-T2', # Your mail server currently has too many connections open to Facebook's mail servers.
|
71
|
+
'CON-T3', # Your mail server has opened too many new connections to Facebook's mail servers in a short period of time.
|
72
|
+
'CON-T4', # Your mail server has exceeded the maximum number of recipients for its current connection.
|
73
|
+
],
|
74
|
+
'suspend' => [
|
75
|
+
'RCP-T4', # The attempted recipient address is currently deactivated. The user may or may not reactivate it.
|
76
|
+
],
|
77
|
+
}
|
78
|
+
Indicators = Sisimai::MSP.INDICATORS
|
79
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
80
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
81
|
+
|
82
|
+
def description; return 'Facebook: https://www.facebook.com'; end
|
83
|
+
def smtpagent; return 'US::Facebook'; end
|
84
|
+
def headerlist; return []; end
|
85
|
+
def pattern; return Re0; end
|
86
|
+
|
87
|
+
# Parse bounce messages from Facebook
|
88
|
+
# @param [Hash] mhead Message header of a bounce email
|
89
|
+
# @options mhead [String] from From header
|
90
|
+
# @options mhead [String] date Date header
|
91
|
+
# @options mhead [String] subject Subject header
|
92
|
+
# @options mhead [Array] received Received headers
|
93
|
+
# @options mhead [String] others Other required headers
|
94
|
+
# @param [String] mbody Message body of a bounce email
|
95
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
96
|
+
# part or nil if it failed to parse or
|
97
|
+
# the arguments are missing
|
98
|
+
def scan(mhead, mbody)
|
99
|
+
return nil unless mhead
|
100
|
+
return nil unless mbody
|
101
|
+
return nil unless mhead['from'] =~ Re0[:from]
|
102
|
+
return nil unless mhead['subject'] =~ Re0[:subject]
|
103
|
+
|
104
|
+
dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
|
105
|
+
hasdivided = mbody.split("\n")
|
106
|
+
havepassed = [''];
|
107
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
108
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
109
|
+
previousfn = '' # (String) Previous field name
|
110
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
111
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
112
|
+
fbresponse = '' # (String) Response code from Facebook
|
113
|
+
connvalues = 0 # (Integer) Flag, 1 if all the value of $connheader have been set
|
114
|
+
connheader = {
|
115
|
+
'date' => '', # The value of Arrival-Date header
|
116
|
+
'lhost' => '', # The value of Reporting-MTA header
|
117
|
+
}
|
118
|
+
v = nil
|
119
|
+
|
120
|
+
hasdivided.each do |e|
|
121
|
+
# Save the current line for the next loop
|
122
|
+
havepassed << e; p = havepassed[-2]
|
123
|
+
|
124
|
+
if readcursor == 0
|
125
|
+
# Beginning of the bounce message or delivery status part
|
126
|
+
if e =~ Re1[:begin]
|
127
|
+
readcursor |= Indicators[:'deliverystatus']
|
128
|
+
next
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
133
|
+
# Beginning of the original message part
|
134
|
+
if e =~ Re1[:rfc822]
|
135
|
+
readcursor |= Indicators[:'message-rfc822']
|
136
|
+
next
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
141
|
+
# After "message/rfc822"
|
142
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
143
|
+
# Get required headers only
|
144
|
+
lhs = cv[1].downcase
|
145
|
+
previousfn = ''
|
146
|
+
next unless RFC822Head.key?(lhs)
|
147
|
+
|
148
|
+
previousfn = lhs
|
149
|
+
rfc822part += e + "\n"
|
150
|
+
|
151
|
+
elsif e =~ /\A[ \t]+/
|
152
|
+
# Continued line from the previous line
|
153
|
+
next if rfc822next[previousfn]
|
154
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
155
|
+
|
156
|
+
else
|
157
|
+
# Check the end of headers in rfc822 part
|
158
|
+
next unless LongFields.key?(previousfn)
|
159
|
+
next unless e.empty?
|
160
|
+
rfc822next[previousfn] = true
|
161
|
+
end
|
162
|
+
|
163
|
+
else
|
164
|
+
# Before "message/rfc822"
|
165
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
166
|
+
next if e.empty?
|
167
|
+
|
168
|
+
if connvalues == connheader.keys.size
|
169
|
+
# Reporting-MTA: dns; 10.138.205.200
|
170
|
+
# Arrival-Date: Thu, 23 Jun 2011 02:29:43 -0700
|
171
|
+
v = dscontents[-1]
|
172
|
+
|
173
|
+
if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
|
174
|
+
# Final-Recipient: RFC822; userunknown@example.jp
|
175
|
+
if v['recipient']
|
176
|
+
# There are multiple recipient addresses in the message body.
|
177
|
+
dscontents << Sisimai::MSP.DELIVERYSTATUS
|
178
|
+
v = dscontents[-1]
|
179
|
+
end
|
180
|
+
v['recipient'] = cv[1]
|
181
|
+
recipients += 1
|
182
|
+
|
183
|
+
elsif cv = e.match(/\A[Xx]-[Aa]ctual-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*(.+)\z/)
|
184
|
+
# X-Actual-Recipient: RFC822; kijitora@example.co.jp
|
185
|
+
v['alias'] = cv[1]
|
186
|
+
|
187
|
+
elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
|
188
|
+
# Action: failed
|
189
|
+
v['action'] = cv[1].downcase
|
190
|
+
|
191
|
+
elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
|
192
|
+
# Status: 5.1.1
|
193
|
+
# Status:5.2.0
|
194
|
+
# Status: 5.1.0 (permanent failure)
|
195
|
+
v['status'] = cv[1]
|
196
|
+
|
197
|
+
elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
198
|
+
# Remote-MTA: DNS; mx.example.jp
|
199
|
+
v['rhost'] = cv[1].downcase
|
200
|
+
|
201
|
+
elsif cv = e.match(/\A[Ll]ast-[Aa]ttempt-[Dd]ate:[ ]*(.+)\z/)
|
202
|
+
# Last-Attempt-Date: Fri, 14 Feb 2014 12:30:08 -0500
|
203
|
+
v['date'] = cv[1]
|
204
|
+
|
205
|
+
else
|
206
|
+
if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
|
207
|
+
# Diagnostic-Code: smtp; 550 5.1.1 RCP-P2
|
208
|
+
# http://postmaster.facebook.com/response_codes?ip=192.0.2.135#rcp Refused due to recipient preferences
|
209
|
+
v['spec'] = cv[1].upcase
|
210
|
+
v['diagnosis'] = cv[2]
|
211
|
+
|
212
|
+
elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
|
213
|
+
# Continued line of the value of Diagnostic-Code header
|
214
|
+
v['diagnosis'] ||= ''
|
215
|
+
v['diagnosis'] += ' ' + cv[1]
|
216
|
+
havepassed[-1] = 'Diagnostic-Code: ' + e
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
else
|
221
|
+
if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
222
|
+
# Reporting-MTA: dns; mx.example.jp
|
223
|
+
next if connheader['lhost'].size > 0
|
224
|
+
connheader['lhost'] = cv[1].downcase
|
225
|
+
connvalues += 1
|
226
|
+
|
227
|
+
elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
|
228
|
+
# Arrival-Date: Wed, 29 Apr 2009 16:03:18 +0900
|
229
|
+
next if connheader['date'].size > 0
|
230
|
+
connheader['date'] = cv[1]
|
231
|
+
connvalues += 1
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
return nil if recipients == 0
|
239
|
+
require 'sisimai/string'
|
240
|
+
require 'sisimai/smtp/status'
|
241
|
+
|
242
|
+
dscontents.map do |e|
|
243
|
+
e['lhost'] ||= connheader['lhost']
|
244
|
+
|
245
|
+
if mhead['received'].size > 0
|
246
|
+
# Get localhost and remote host name from Received header.
|
247
|
+
r0 = mhead['received']
|
248
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
249
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
250
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
251
|
+
end
|
252
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
253
|
+
|
254
|
+
if cv = e['diagnosis'].match(/\b([A-Z]{3})[-]([A-Z])(\d)\b/)
|
255
|
+
# Diagnostic-Code: smtp; 550 5.1.1 RCP-P2
|
256
|
+
lhs = cv[1]
|
257
|
+
rhs = cv[2]
|
258
|
+
num = cv[3]
|
259
|
+
|
260
|
+
fbresponse = sprintf("%s-%s%d", lhs, rhs, num)
|
261
|
+
e['softbounce'] = rhs == 'P' ? 0 : 1
|
262
|
+
end
|
263
|
+
|
264
|
+
catch :SESSION do
|
265
|
+
ReFailure.each_key do |r|
|
266
|
+
# Verify each regular expression of session errors
|
267
|
+
ReFailure[r].each do |rr|
|
268
|
+
# Check each regular expression
|
269
|
+
next unless fbresponse == rr
|
270
|
+
e['reason'] = r
|
271
|
+
throw :SESSION
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
unless e['reason']
|
277
|
+
# http://postmaster.facebook.com/response_codes
|
278
|
+
# Facebook System Resource Issues
|
279
|
+
# These codes indicate a temporary issue internal to Facebook's
|
280
|
+
# system. Administrators observing these issues are not required to
|
281
|
+
# take any action to correct them.
|
282
|
+
if fbresponse =~ /\AINT-T\d+\z/
|
283
|
+
# * INT-Tx
|
284
|
+
#
|
285
|
+
# https://groups.google.com/forum/#!topic/cdmix/eXfi4ddgYLQ
|
286
|
+
# This block has not been tested because we have no email sample
|
287
|
+
# including "INT-T?" error code.
|
288
|
+
e['reason'] = 'systemerror'
|
289
|
+
e['softbounce'] = 1
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
294
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
295
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
296
|
+
e['agent'] = Sisimai::MSP::US::Facebook.smtpagent
|
297
|
+
end
|
298
|
+
|
299
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
300
|
+
end
|
301
|
+
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|