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
data/lib/sisimai/mime.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::MIME is MIME Utilities for Sisimai.
|
3
|
+
module MIME
|
4
|
+
# Imported from p5-Sisimail/lib/Sisimai/MIME.pm
|
5
|
+
class << self
|
6
|
+
require 'base64'
|
7
|
+
|
8
|
+
# Check that the argument is MIME-Encoded string or not
|
9
|
+
# @param [String] argvs String to be checked
|
10
|
+
# @return [True,False] false: Not MIME encoded string
|
11
|
+
# true: MIME encoded string
|
12
|
+
def is_mimeencoded(argv1)
|
13
|
+
return false unless argv1
|
14
|
+
|
15
|
+
argv1 = argv1.delete('"')
|
16
|
+
return true if argv1 =~ /[ \t]*=[?][-_0-9A-Za-z]+[?][BbQq][?].+[?]=[ \t]*\z/
|
17
|
+
return false
|
18
|
+
end
|
19
|
+
|
20
|
+
# Decode MIME-Encoded string
|
21
|
+
# @param [Array] argvs Reference to an array including MIME-Encoded text
|
22
|
+
# @return [String] MIME-Decoded text
|
23
|
+
def mimedecode(argvs = [])
|
24
|
+
return '' unless argvs
|
25
|
+
return '' unless argvs.is_a? Array
|
26
|
+
|
27
|
+
characterset = nil
|
28
|
+
encodingname = nil
|
29
|
+
mimeencoded0 = nil
|
30
|
+
decodedtext0 = []
|
31
|
+
|
32
|
+
argvs.each do |e|
|
33
|
+
# Check and decode each element
|
34
|
+
e = e.lstrip.rstrip
|
35
|
+
e = e.delete('"')
|
36
|
+
|
37
|
+
if self.is_mimeencoded(e)
|
38
|
+
# MIME Encoded string
|
39
|
+
if cv = e.match(/\A=[?]([-_0-9A-Za-z]+)[?]([BbQq])[?](.+)[?]=\z/)
|
40
|
+
# =?utf-8?B?55m954yr44Gr44KD44KT44GT?=
|
41
|
+
characterset ||= cv[1]
|
42
|
+
encodingname ||= cv[2]
|
43
|
+
mimeencoded0 = cv[3]
|
44
|
+
|
45
|
+
if encodingname == 'Q'
|
46
|
+
# Quoted-Printable
|
47
|
+
decodedtext0 << mimeencoded0.unpack('M').first
|
48
|
+
|
49
|
+
elsif encodingname == 'B'
|
50
|
+
# Base64
|
51
|
+
decodedtext0 << Base64.decode64(mimeencoded0)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
else
|
55
|
+
decodedtext0 << e
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
return '' unless decodedtext0.size > 0
|
60
|
+
decodedtext1 = decodedtext0.join('')
|
61
|
+
|
62
|
+
if characterset && encodingname
|
63
|
+
# utf8 => UTF-8
|
64
|
+
characterset = 'UTF-8' if characterset.upcase == 'UTF8'
|
65
|
+
|
66
|
+
if characterset.upcase != 'UTF-8'
|
67
|
+
# Characterset is not UTF-8
|
68
|
+
begin
|
69
|
+
decodedtext1 = decodedtext1.encode('UTF-8', characterset)
|
70
|
+
rescue
|
71
|
+
decodedtext1 = 'FAILED TO CONVERT THE SUBJECT'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
return decodedtext1.force_encoding('UTF-8')
|
77
|
+
end
|
78
|
+
|
79
|
+
# Decode MIME Quoted-Printable Encoded string
|
80
|
+
# @param [String] argv1 MIME Encoded text
|
81
|
+
# @return [String] MIME Decoded text
|
82
|
+
def qprintd(argv1)
|
83
|
+
return nil unless argv1
|
84
|
+
return argv1.unpack('M').first
|
85
|
+
end
|
86
|
+
|
87
|
+
# Decode MIME BASE64 Encoded string
|
88
|
+
# @param [String] argv1 MIME Encoded text
|
89
|
+
# @return [String] MIME-Decoded text
|
90
|
+
def base64d(argv1)
|
91
|
+
return nil unless argv1
|
92
|
+
|
93
|
+
plain = nil
|
94
|
+
if cv = argv1.match(%r|([+/\=0-9A-Za-z\r\n]+)|)
|
95
|
+
# Decode BASE64
|
96
|
+
plain = Base64.decode64(cv[1])
|
97
|
+
end
|
98
|
+
return plain.force_encoding('UTF-8')
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get boundary string
|
102
|
+
# @param [String] argv1 The value of Content-Type header
|
103
|
+
# @param [Integer] start -1: boundary string itself
|
104
|
+
# 0: Start of boundary
|
105
|
+
# 1: End of boundary
|
106
|
+
# @return [String] Boundary string
|
107
|
+
def boundary(argv1 = nil, start = -1)
|
108
|
+
return nil unless argv1
|
109
|
+
value = nil
|
110
|
+
|
111
|
+
if cv = argv1.match(/\bboundary=([^ ]+)/)
|
112
|
+
# Content-Type: multipart/mixed; boundary=Apple-Mail-5--931376066
|
113
|
+
# Content-Type: multipart/report; report-type=delivery-status;
|
114
|
+
# boundary="n6H9lKZh014511.1247824040/mx.example.jp"
|
115
|
+
value = cv[1]
|
116
|
+
value = value.delete(%q|'"|)
|
117
|
+
end
|
118
|
+
|
119
|
+
value = sprintf( '--%s', value ) if start > -1
|
120
|
+
value = sprintf( '%s--', value ) if start > 0
|
121
|
+
return value
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
data/lib/sisimai/msp.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
module Sisimai
|
2
|
+
# Sisimai::MSP - Base class for Sisimai::MSP::*, Mail Service Provider classes.
|
3
|
+
module MSP
|
4
|
+
class << self
|
5
|
+
# Imported from p5-Sisimail/lib/Sisimai/MSP.pm
|
6
|
+
require 'sisimai/rfc5322'
|
7
|
+
|
8
|
+
# Flags for position variable for
|
9
|
+
# @return [Hash] Position flag data
|
10
|
+
# @private
|
11
|
+
def INDICATORS
|
12
|
+
return {
|
13
|
+
:'deliverystatus' => ( 1 << 1 ),
|
14
|
+
:'message-rfc822' => ( 1 << 2 ),
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Data structure for parsed bounce messages
|
19
|
+
# @return [Hash] Data structure for delivery status
|
20
|
+
# @private
|
21
|
+
def DELIVERYSTATUS
|
22
|
+
return {
|
23
|
+
'spec' => nil, # Protocl specification
|
24
|
+
'date' => nil, # The value of Last-Attempt-Date header
|
25
|
+
'rhost' => nil, # The value of Remote-MTA header
|
26
|
+
'lhost' => nil, # The value of Received-From-MTA header
|
27
|
+
'alias' => nil, # The value of alias entry(RHS)
|
28
|
+
'agent' => nil, # MTA name
|
29
|
+
'action' => nil, # The value of Action header
|
30
|
+
'status' => nil, # The value of Status header
|
31
|
+
'reason' => nil, # Temporary reason of bounce
|
32
|
+
'command' => nil, # SMTP command in the message body
|
33
|
+
'diagnosis' => nil, # The value of Diagnostic-Code header
|
34
|
+
'recipient' => nil, # The value of Final-Recipient header
|
35
|
+
'softbounce' => nil, # Soft bounce or not
|
36
|
+
'feedbacktype' => nil, # FeedBack Type
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
# MSP list
|
41
|
+
# @return [Array] MSP list with order
|
42
|
+
def index
|
43
|
+
return [
|
44
|
+
'US::Google', 'US::Yahoo', 'US::Aol', 'US::Outlook', 'US::AmazonSES',
|
45
|
+
'US::SendGrid', 'US::Verizon', 'RU::MailRu', 'RU::Yandex', 'DE::GMX',
|
46
|
+
'US::Bigfoot', 'US::Facebook', 'US::Zoho', 'DE::EinsUndEins',
|
47
|
+
'UK::MessageLabs', 'JP::EZweb', 'JP::KDDI', 'JP::Biglobe',
|
48
|
+
'US::ReceivingSES',
|
49
|
+
]
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MSP::DE
|
3
|
+
# Sisimai::MSP::DE::EinsUndEins parses a bounce email which created by 1&1.
|
4
|
+
# Methods in the module are called from only Sisimai::Message.
|
5
|
+
module EinsUndEins
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MSP/DE/EinsUndEins.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/msp'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:from => %r/\A["]Mail Delivery System["]/,
|
13
|
+
:subject => %r/\AMail delivery failed: returning message to sender\z/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\AThis message was created automatically by mail delivery software/,
|
17
|
+
:error => %r/\AFor the following reason:/,
|
18
|
+
:rfc822 => %r/\A--- The header of the original message is following/,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
}
|
21
|
+
ReFailure = {
|
22
|
+
'mesgtoobig' => %r/Mail[ ]size[ ]limit[ ]exceeded/x,
|
23
|
+
}
|
24
|
+
Indicators = Sisimai::MSP.INDICATORS
|
25
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
26
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
27
|
+
|
28
|
+
def description; return '1&1: http://www.1and1.de'; end
|
29
|
+
def smtpagent; return 'DE::EinsUndEins'; end
|
30
|
+
# X-UI-Out-Filterresults: unknown:0;
|
31
|
+
def headerlist; return []; end
|
32
|
+
def pattern; return Re0; end
|
33
|
+
|
34
|
+
# Parse bounce messages from 1&1
|
35
|
+
# @param [Hash] mhead Message header of a bounce email
|
36
|
+
# @options mhead [String] from From header
|
37
|
+
# @options mhead [String] date Date header
|
38
|
+
# @options mhead [String] subject Subject header
|
39
|
+
# @options mhead [Array] received Received headers
|
40
|
+
# @options mhead [String] others Other required headers
|
41
|
+
# @param [String] mbody Message body of a bounce email
|
42
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
43
|
+
# part or nil if it failed to parse or
|
44
|
+
# the arguments are missing
|
45
|
+
def scan(mhead, mbody)
|
46
|
+
return nil unless mhead
|
47
|
+
return nil unless mbody
|
48
|
+
return nil unless mhead['from'] =~ Re0[:from]
|
49
|
+
return nil unless mhead['subject'] =~ Re0[:subject]
|
50
|
+
|
51
|
+
dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
|
52
|
+
hasdivided = mbody.split("\n")
|
53
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
54
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
55
|
+
previousfn = '' # (String) Previous field name
|
56
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
57
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
58
|
+
v = nil
|
59
|
+
|
60
|
+
hasdivided.each do |e|
|
61
|
+
if readcursor == 0
|
62
|
+
# Beginning of the bounce message or delivery status part
|
63
|
+
if e =~ Re1[:begin]
|
64
|
+
readcursor |= Indicators[:'deliverystatus']
|
65
|
+
next
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
70
|
+
# Beginning of the original message part
|
71
|
+
if e =~ Re1[:rfc822]
|
72
|
+
readcursor |= Indicators[:'message-rfc822']
|
73
|
+
next
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
78
|
+
# After "message/rfc822"
|
79
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
80
|
+
# Get required headers only
|
81
|
+
lhs = cv[1].downcase
|
82
|
+
previousfn = ''
|
83
|
+
next unless RFC822Head.key?(lhs)
|
84
|
+
|
85
|
+
previousfn = lhs
|
86
|
+
rfc822part += e + "\n"
|
87
|
+
|
88
|
+
elsif e =~ /\A[ \t]+/
|
89
|
+
# Continued line from the previous line
|
90
|
+
next if rfc822next[previousfn]
|
91
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
92
|
+
|
93
|
+
else
|
94
|
+
# Check the end of headers in rfc822 part
|
95
|
+
next unless LongFields.key?(previousfn)
|
96
|
+
next unless e.empty?
|
97
|
+
rfc822next[previousfn] = true
|
98
|
+
end
|
99
|
+
|
100
|
+
else
|
101
|
+
# Before "message/rfc822"
|
102
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
103
|
+
next if e.empty?
|
104
|
+
|
105
|
+
# The following address failed:
|
106
|
+
#
|
107
|
+
# general@example.eu
|
108
|
+
#
|
109
|
+
# For the following reason:
|
110
|
+
#
|
111
|
+
# Mail size limit exceeded. For explanation visit
|
112
|
+
# http://postmaster.1and1.com/en/error-messages?ip=%1s
|
113
|
+
v = dscontents[-1]
|
114
|
+
|
115
|
+
if cv = e.match(/\A([^ ]+[@][^ ]+)\z/)
|
116
|
+
# general@example.eu
|
117
|
+
if v['recipient']
|
118
|
+
# There are multiple recipient addresses in the message body.
|
119
|
+
dscontents << Sisimai::MSP.DELIVERYSTATUS
|
120
|
+
v = dscontents[-1]
|
121
|
+
end
|
122
|
+
v['recipient'] = cv[1]
|
123
|
+
recipients += 1
|
124
|
+
|
125
|
+
elsif e =~ Re1[:error]
|
126
|
+
# For the following reason:
|
127
|
+
v['diagnosis'] = e
|
128
|
+
|
129
|
+
else
|
130
|
+
# Get error message
|
131
|
+
if v['diagnosis']
|
132
|
+
# Append error message strings
|
133
|
+
v['diagnosis'] += ' ' + e
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
return nil if recipients == 0
|
140
|
+
require 'sisimai/string'
|
141
|
+
require 'sisimai/smtp/status'
|
142
|
+
|
143
|
+
dscontents.map do |e|
|
144
|
+
if mhead['received'].size > 0
|
145
|
+
# Get localhost and remote host name from Received header.
|
146
|
+
r0 = mhead['received']
|
147
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
148
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
149
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
150
|
+
end
|
151
|
+
e['diagnosis'] ||= ''
|
152
|
+
e['diagnosis'] = e['diagnosis'].gsub(/\A#{Re1[:error]}/, '')
|
153
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
154
|
+
|
155
|
+
ReFailure.each_key do |r|
|
156
|
+
# Verify each regular expression of session errors
|
157
|
+
next unless e['diagnosis'] =~ ReFailure[r]
|
158
|
+
e['reason'] = r
|
159
|
+
break
|
160
|
+
end
|
161
|
+
|
162
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
163
|
+
e['spec'] = 'SMTP'
|
164
|
+
e['agent'] = Sisimai::MSP::DE::EinsUndEins.smtpagent
|
165
|
+
end
|
166
|
+
|
167
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
@@ -0,0 +1,197 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MSP::DE
|
3
|
+
# Sisimai::MSP::DE::GMX parses a bounce email which created by GMX. Methods
|
4
|
+
# in the module are called from only Sisimai::Message.
|
5
|
+
module GMX
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MSP/DE/GMX.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/msp'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:from => %r/\AMAILER-DAEMON[@]/,
|
13
|
+
:subject => %r/\AMail delivery failed: returning message to sender\z/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\AThis message was created automatically by mail delivery software/,
|
17
|
+
:rfc822 => %r/\A--- The header of the original message is following/,
|
18
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
19
|
+
}
|
20
|
+
ReFailure = {
|
21
|
+
'expired' => %r/delivery[ ]retry[ ]timeout[ ]exceeded/x,
|
22
|
+
}
|
23
|
+
Indicators = Sisimai::MSP.INDICATORS
|
24
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
25
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
26
|
+
|
27
|
+
def description; return 'GMX: http://www.gmx.net'; end
|
28
|
+
def smtpagent; return 'DE::GMX'; end
|
29
|
+
|
30
|
+
# Envelope-To: <kijitora@mail.example.com>
|
31
|
+
# X-GMX-Antispam: 0 (Mail was not recognized as spam); Detail=V3;
|
32
|
+
# X-GMX-Antivirus: 0 (no virus found)
|
33
|
+
# X-UI-Out-Filterresults: unknown:0;
|
34
|
+
def headerlist; return ['X-GMX-Antispam']; end
|
35
|
+
def pattern; return Re0; end
|
36
|
+
|
37
|
+
# Parse bounce messages from GMX
|
38
|
+
# @param [Hash] mhead Message header of a bounce email
|
39
|
+
# @options mhead [String] from From header
|
40
|
+
# @options mhead [String] date Date header
|
41
|
+
# @options mhead [String] subject Subject header
|
42
|
+
# @options mhead [Array] received Received headers
|
43
|
+
# @options mhead [String] others Other required headers
|
44
|
+
# @param [String] mbody Message body of a bounce email
|
45
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
46
|
+
# part or nil if it failed to parse or
|
47
|
+
# the arguments are missing
|
48
|
+
def scan(mhead, mbody)
|
49
|
+
return nil unless mhead
|
50
|
+
return nil unless mbody
|
51
|
+
return nil unless mhead['x-gmx-antispam'];
|
52
|
+
|
53
|
+
dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
|
54
|
+
hasdivided = mbody.split("\n")
|
55
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
56
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
57
|
+
previousfn = '' # (String) Previous field name
|
58
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
59
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
60
|
+
v = nil
|
61
|
+
|
62
|
+
hasdivided.each do |e|
|
63
|
+
if readcursor == 0
|
64
|
+
# Beginning of the bounce message or delivery status part
|
65
|
+
if e =~ Re1[:begin]
|
66
|
+
readcursor |= Indicators[:'deliverystatus']
|
67
|
+
next
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
72
|
+
# Beginning of the original message part
|
73
|
+
if e =~ Re1[:rfc822]
|
74
|
+
readcursor |= Indicators[:'message-rfc822']
|
75
|
+
next
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
80
|
+
# After "message/rfc822"
|
81
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
82
|
+
# Get required headers only
|
83
|
+
lhs = cv[1].downcase
|
84
|
+
previousfn = ''
|
85
|
+
next unless RFC822Head.key?(lhs)
|
86
|
+
|
87
|
+
previousfn = lhs
|
88
|
+
rfc822part += e + "\n"
|
89
|
+
|
90
|
+
elsif e =~ /\A[ \t]+/
|
91
|
+
# Continued line from the previous line
|
92
|
+
next if rfc822next[previousfn]
|
93
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
94
|
+
|
95
|
+
else
|
96
|
+
# Check the end of headers in rfc822 part
|
97
|
+
next unless LongFields.key?(previousfn)
|
98
|
+
next unless e.empty?
|
99
|
+
rfc822next[previousfn] = true
|
100
|
+
end
|
101
|
+
|
102
|
+
else
|
103
|
+
# Before "message/rfc822"
|
104
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
105
|
+
next if e.empty?
|
106
|
+
|
107
|
+
# This message was created automatically by mail delivery software.
|
108
|
+
#
|
109
|
+
# A message that you sent could not be delivered to one or more of
|
110
|
+
# its recipients. This is a permanent error. The following address
|
111
|
+
# failed:
|
112
|
+
#
|
113
|
+
# "shironeko@example.jp":
|
114
|
+
# SMTP error from remote server after RCPT command:
|
115
|
+
# host: mx.example.jp
|
116
|
+
# 5.1.1 <shironeko@example.jp>... User Unknown
|
117
|
+
v = dscontents[-1]
|
118
|
+
|
119
|
+
if cv = e.match(/\A["]([^ ]+[@][^ ]+)["]:\z/) ||
|
120
|
+
cv = e.match(/\A[<]([^ ]+[@][^ ]+)[>]\z/)
|
121
|
+
# "shironeko@example.jp":
|
122
|
+
# ---- OR ----
|
123
|
+
# <kijitora@6jo.example.co.jp>
|
124
|
+
#
|
125
|
+
# Reason:
|
126
|
+
# delivery retry timeout exceeded
|
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'] = cv[1]
|
133
|
+
recipients += 1
|
134
|
+
|
135
|
+
elsif cv = e.match(/\ASMTP error .+ ([A-Z]{4}) command:\z/)
|
136
|
+
# SMTP error from remote server after RCPT command:
|
137
|
+
v['command'] = cv[1]
|
138
|
+
|
139
|
+
elsif cv = e.match(/\Ahost:[ \t]*(.+)\z/)
|
140
|
+
# host: mx.example.jp
|
141
|
+
v['rhost'] = cv[1]
|
142
|
+
|
143
|
+
else
|
144
|
+
# Get error message
|
145
|
+
if e =~ /\b[45][.]\d[.]\d\b/ || e =~ /[<][^ ]+[@][^ ]+[>]/ || e =~ /\b[45]\d{2}\b/
|
146
|
+
v['diagnosis'] ||= e;
|
147
|
+
|
148
|
+
else
|
149
|
+
next if e =~ /\A\z/
|
150
|
+
if e =~ /\AReason:\z/
|
151
|
+
# Reason:
|
152
|
+
# delivery retry timeout exceeded
|
153
|
+
v['diagnosis'] = e
|
154
|
+
|
155
|
+
elsif v['diagnosis'] =~ /\AReason:\z/
|
156
|
+
v['diagnosis'] = e
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
return nil if recipients == 0
|
164
|
+
require 'sisimai/string'
|
165
|
+
require 'sisimai/smtp/status'
|
166
|
+
|
167
|
+
dscontents.map do |e|
|
168
|
+
if mhead['received'].size > 0
|
169
|
+
# Get localhost and remote host name from Received header.
|
170
|
+
r0 = mhead['received']
|
171
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
172
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
173
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
174
|
+
end
|
175
|
+
e['diagnosis'] = e['diagnosis'].gsub(/\\n/, ' ')
|
176
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
177
|
+
|
178
|
+
ReFailure.each_key do |r|
|
179
|
+
# Verify each regular expression of session errors
|
180
|
+
next unless e['diagnosis'] =~ ReFailure[r]
|
181
|
+
e['reason'] = r
|
182
|
+
break
|
183
|
+
end
|
184
|
+
|
185
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
186
|
+
e['spec'] = 'SMTP'
|
187
|
+
e['agent'] = Sisimai::MSP::DE::GMX.smtpagent
|
188
|
+
end
|
189
|
+
|
190
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|