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,227 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::IMailServer parses a bounce email which created by Ipswitch
|
4
|
+
# IMail Server. Methods in the module are called from only Sisimai::Message.
|
5
|
+
module IMailServer
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/IMailServer.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:'x-mailer' => %r/\A[<]SMTP32 v[\d.]+[>]\z/,
|
13
|
+
:'subject' => %r/\AUndeliverable Mail\z/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\A\z/, # Blank line
|
17
|
+
:error => %r/Body of message generated response:/,
|
18
|
+
:rfc822 => %r/\AOriginal message follows[.]\z/,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
}
|
21
|
+
ReSMTP = {
|
22
|
+
'conn' => %r{(?:
|
23
|
+
SMTP[ ]connection[ ]failed,
|
24
|
+
|Unexpected[ ]connection[ ]response[ ]from[ ]server:
|
25
|
+
)
|
26
|
+
},
|
27
|
+
'ehlo' => %r|Unexpected response to EHLO/HELO:|,
|
28
|
+
'mail' => %r|Server response to MAIL FROM:|,
|
29
|
+
'rcpt' => %r|Additional RCPT TO generated following response:|,
|
30
|
+
'data' => %r|DATA command generated response:|,
|
31
|
+
}
|
32
|
+
ReFailure = {
|
33
|
+
'hostunknown' => %r{
|
34
|
+
Unknown[ ]host
|
35
|
+
},
|
36
|
+
'userunknown' => %r{\A(?:
|
37
|
+
Unknown[ ]user
|
38
|
+
|Invalid[ ]final[ ]delivery[ ]userid # Filtered ?
|
39
|
+
)
|
40
|
+
}x,
|
41
|
+
'mailboxfull' => %r{
|
42
|
+
\AUser[ ]mailbox[ ]exceeds[ ]allowed[ ]size
|
43
|
+
}x,
|
44
|
+
'securityerr' => %r{
|
45
|
+
\ARequested[ ]action[ ]not[ ]taken:[ ]virus[ ]detected
|
46
|
+
}x,
|
47
|
+
'undefined' => %r{
|
48
|
+
\Aundeliverable[ ]to[ ]
|
49
|
+
}x,
|
50
|
+
'expired' => %r{
|
51
|
+
\ADelivery[ ]failed[ ]\d+[ ]attempts
|
52
|
+
}x,
|
53
|
+
}
|
54
|
+
Indicators = Sisimai::MTA.INDICATORS
|
55
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
56
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
57
|
+
|
58
|
+
def description; return 'IPSWITCH IMail Server'; end
|
59
|
+
def smtpagent; return 'IMailServer'; end
|
60
|
+
def headerlist; return ['X-Mailer']; end
|
61
|
+
def pattern; return Re0; end
|
62
|
+
|
63
|
+
# Parse bounce messages from IMailServer
|
64
|
+
# @param [Hash] mhead Message header of a bounce email
|
65
|
+
# @options mhead [String] from From header
|
66
|
+
# @options mhead [String] date Date header
|
67
|
+
# @options mhead [String] subject Subject header
|
68
|
+
# @options mhead [Array] received Received headers
|
69
|
+
# @options mhead [String] others Other required headers
|
70
|
+
# @param [String] mbody Message body of a bounce email
|
71
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
72
|
+
# part or nil if it failed to parse or
|
73
|
+
# the arguments are missing
|
74
|
+
def scan(mhead, mbody)
|
75
|
+
return nil unless mhead
|
76
|
+
return nil unless mbody
|
77
|
+
|
78
|
+
match = 0
|
79
|
+
match += 1 if mhead['subject'] =~ Re0[:subject]
|
80
|
+
match += 1 if mhead['x-mailer'] && mhead['x-mailer'] =~ Re0[:'x-mailer']
|
81
|
+
return nil if match == 0
|
82
|
+
|
83
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
84
|
+
hasdivided = mbody.split("\n")
|
85
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
86
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
87
|
+
previousfn = '' # (String) Previous field name
|
88
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
89
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
90
|
+
v = nil
|
91
|
+
|
92
|
+
hasdivided.each do |e|
|
93
|
+
if readcursor == 0
|
94
|
+
# Beginning of the bounce message or delivery status part
|
95
|
+
if e =~ Re1[:begin]
|
96
|
+
readcursor |= Indicators[:'deliverystatus']
|
97
|
+
next
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
102
|
+
# Beginning of the original message part
|
103
|
+
if e =~ Re1[:rfc822]
|
104
|
+
readcursor |= Indicators[:'message-rfc822']
|
105
|
+
next
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
110
|
+
# After "message/rfc822"
|
111
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
112
|
+
# Get required headers only
|
113
|
+
lhs = cv[1].downcase
|
114
|
+
previousfn = ''
|
115
|
+
next unless RFC822Head.key?(lhs)
|
116
|
+
|
117
|
+
previousfn = lhs
|
118
|
+
rfc822part += e + "\n"
|
119
|
+
|
120
|
+
elsif e =~ /\A[ \t]+/
|
121
|
+
# Continued line from the previous line
|
122
|
+
next if rfc822next[previousfn]
|
123
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
124
|
+
|
125
|
+
else
|
126
|
+
# Check the end of headers in rfc822 part
|
127
|
+
next unless LongFields.key?(previousfn)
|
128
|
+
next unless e.empty?
|
129
|
+
rfc822next[previousfn] = true
|
130
|
+
end
|
131
|
+
|
132
|
+
else
|
133
|
+
# Before "message/rfc822"
|
134
|
+
break if readcursor & Indicators[:'message-rfc822'] > 0
|
135
|
+
|
136
|
+
# Unknown user: kijitora@example.com
|
137
|
+
#
|
138
|
+
# Original message follows.
|
139
|
+
v = dscontents[-1]
|
140
|
+
|
141
|
+
if cv = e.match(/\A(.+)[ ](.+)[:][ \t]*([^ ]+[@][^ ]+)\z/)
|
142
|
+
# Unknown user: kijitora@example.com
|
143
|
+
if v['recipient']
|
144
|
+
# There are multiple recipient addresses in the message body.
|
145
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
146
|
+
v = dscontents[-1]
|
147
|
+
end
|
148
|
+
v['diagnosis'] = cv[1] + ' ' + cv[2]
|
149
|
+
v['recipient'] = cv[3]
|
150
|
+
recipients += 1
|
151
|
+
|
152
|
+
elsif cv = e.match(/\Aundeliverable[ ]+to[ ]+(.+)\z/)
|
153
|
+
# undeliverable to kijitora@example.com
|
154
|
+
if v['recipient']
|
155
|
+
# There are multiple recipient addresses in the message body.
|
156
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
157
|
+
v = dscontents[-1]
|
158
|
+
end
|
159
|
+
v['recipient'] = cv[1]
|
160
|
+
recipients += 1
|
161
|
+
|
162
|
+
else
|
163
|
+
# Other error message text
|
164
|
+
v['alterrors'] += ' ' + e if v['alterrors']
|
165
|
+
if e =~ Re1[:error]
|
166
|
+
# Body of message generated response:
|
167
|
+
v['alterrors'] = e
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
return nil if recipients == 0
|
174
|
+
require 'sisimai/string'
|
175
|
+
require 'sisimai/smtp/status'
|
176
|
+
|
177
|
+
dscontents.map do |e|
|
178
|
+
# Set default values if each value is empty.
|
179
|
+
e['agent'] = Sisimai::MTA::IMailServer.smtpagent
|
180
|
+
|
181
|
+
if mhead['received'].size > 0
|
182
|
+
# Get localhost and remote host name from Received header.
|
183
|
+
r0 = mhead['received']
|
184
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
185
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
186
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
187
|
+
end
|
188
|
+
|
189
|
+
if e['alterrors'] && e['alterrors'].size > 0
|
190
|
+
# Copy alternative error message
|
191
|
+
if e['diagnosis']
|
192
|
+
e['diagnosis'] = e['alterrors'] + ' ' + e['diagnosis']
|
193
|
+
else
|
194
|
+
e['diagnosis'] = e['alterrors']
|
195
|
+
end
|
196
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
197
|
+
e.delete('alterrors')
|
198
|
+
end
|
199
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
200
|
+
|
201
|
+
ReSMTP.each_key do |r|
|
202
|
+
# Detect SMTP command from the message
|
203
|
+
next unless e['diagnosis'] =~ ReSMTP[r]
|
204
|
+
e['command'] = r.upcase
|
205
|
+
break
|
206
|
+
end
|
207
|
+
|
208
|
+
ReFailure.each_key do |r|
|
209
|
+
# Verify each regular expression of session errors
|
210
|
+
next unless e['diagnosis'] =~ ReFailure[r]
|
211
|
+
e['reason'] = r
|
212
|
+
break
|
213
|
+
end
|
214
|
+
|
215
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
216
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
217
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
218
|
+
e.each_key { |a| e[a] ||= '' }
|
219
|
+
end
|
220
|
+
|
221
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::InterScanMSS parses a bounce email which created by Trend
|
4
|
+
# Micro InterScan Messaging Security Suite. Methods in the module are called
|
5
|
+
# from only Sisimai::Message.
|
6
|
+
module InterScanMSS
|
7
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/InterScanMSS.pm
|
8
|
+
class << self
|
9
|
+
require 'sisimai/mta'
|
10
|
+
require 'sisimai/rfc5322'
|
11
|
+
|
12
|
+
Re0 = {
|
13
|
+
:from => %r/InterScan MSS/,
|
14
|
+
:received => %r/[ ][(]InterScanMSS[)][ ]with[ ]/,
|
15
|
+
:subject => [
|
16
|
+
'Mail could not be delivered',
|
17
|
+
# メッセージを配信できません。
|
18
|
+
'=?iso-2022-jp?B?GyRCJWElQyU7ITwlOCRyR1s/LiRHJC0kXiQ7JHMhIxsoQg==?=',
|
19
|
+
# メール配信に失敗しました
|
20
|
+
'=?iso-2022-jp?B?GyRCJWEhPCVrR1s/LiRLPDpHVCQ3JF4kNyQ/GyhCDQo=?=',
|
21
|
+
],
|
22
|
+
}
|
23
|
+
Re1 = {
|
24
|
+
:begin => %r|\AContent-type: text/plain|,
|
25
|
+
:rfc822 => %r|\AContent-type: message/rfc822|,
|
26
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
27
|
+
}
|
28
|
+
Indicators = Sisimai::MTA.INDICATORS
|
29
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
30
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
31
|
+
|
32
|
+
def description; return 'Trend Micro InterScan Messaging Security Suite'; end
|
33
|
+
def smtpagent; return 'InterScanMSS'; end
|
34
|
+
def headerlist; return []; end
|
35
|
+
def pattern; return Re0; end
|
36
|
+
|
37
|
+
# Parse bounce messages from InterScanMSS
|
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
|
+
|
52
|
+
match = 0
|
53
|
+
match += 1 if mhead['from'] =~ Re0[:from]
|
54
|
+
match += 1 if Re0[:subject].find { |a| mhead['subject'] == a }
|
55
|
+
return nil if match == 0
|
56
|
+
|
57
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
58
|
+
hasdivided = mbody.split("\n")
|
59
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
60
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
61
|
+
previousfn = '' # (String) Previous field name
|
62
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
63
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
64
|
+
v = nil
|
65
|
+
|
66
|
+
hasdivided.each do |e|
|
67
|
+
if readcursor == 0
|
68
|
+
# Beginning of the bounce message or delivery status part
|
69
|
+
if e =~ Re1[:begin]
|
70
|
+
readcursor |= Indicators[:'deliverystatus']
|
71
|
+
next
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
76
|
+
# Beginning of the original message part
|
77
|
+
if e =~ Re1[:rfc822]
|
78
|
+
readcursor |= Indicators[:'message-rfc822']
|
79
|
+
next
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
84
|
+
# After "message/rfc822"
|
85
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
86
|
+
# Get required headers only
|
87
|
+
lhs = cv[1].downcase
|
88
|
+
previousfn = ''
|
89
|
+
next unless RFC822Head.key?(lhs)
|
90
|
+
|
91
|
+
previousfn = lhs
|
92
|
+
rfc822part += e + "\n"
|
93
|
+
|
94
|
+
elsif e =~ /\A[ \t]+/
|
95
|
+
# Continued line from the previous line
|
96
|
+
next if rfc822next[previousfn]
|
97
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
98
|
+
|
99
|
+
else
|
100
|
+
# Check the end of headers in rfc822 part
|
101
|
+
next unless LongFields.key?(previousfn)
|
102
|
+
next unless e.empty?
|
103
|
+
rfc822next[previousfn] = true
|
104
|
+
end
|
105
|
+
|
106
|
+
else
|
107
|
+
# Before "message/rfc822"
|
108
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
109
|
+
next if e.empty?
|
110
|
+
|
111
|
+
# Sent <<< RCPT TO:<kijitora@example.co.jp>
|
112
|
+
# Received >>> 550 5.1.1 <kijitora@example.co.jp>... user unknown
|
113
|
+
v = dscontents[-1]
|
114
|
+
|
115
|
+
if cv = e.match(/\A.+[<>]{3}[ \t]+.+[<]([^ ]+[@][^ ]+)[>]\z/) ||
|
116
|
+
cv = e.match(/\A.+[<>]{3}[ \t]+.+[<]([^ ]+[@][^ ]+)[>]/)
|
117
|
+
# Sent <<< RCPT TO:<kijitora@example.co.jp>
|
118
|
+
# Received >>> 550 5.1.1 <kijitora@example.co.jp>... user unknown
|
119
|
+
cr = cv[1]
|
120
|
+
if v['recipient'] && cr != v['recipient']
|
121
|
+
# There are multiple recipient addresses in the message body.
|
122
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
123
|
+
v = dscontents[-1]
|
124
|
+
end
|
125
|
+
v['recipient'] = cr
|
126
|
+
recipients = dscontents.size
|
127
|
+
end
|
128
|
+
|
129
|
+
if cv = e.match(/\ASent[ ]+[<]{3}[ ]+([A-Z]{4})[ ]/)
|
130
|
+
# Sent <<< RCPT TO:<kijitora@example.co.jp>
|
131
|
+
v['command'] = cv[1]
|
132
|
+
|
133
|
+
elsif cv = e.match(/\AReceived[ ]+[>]{3}[ ]+(\d{3}[ ]+.+)\z/)
|
134
|
+
# Received >>> 550 5.1.1 <kijitora@example.co.jp>... user unknown
|
135
|
+
v['diagnosis'] = cv[1]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
return nil if recipients == 0
|
141
|
+
require 'sisimai/string'
|
142
|
+
require 'sisimai/smtp/status'
|
143
|
+
|
144
|
+
dscontents.map do |e|
|
145
|
+
e['agent'] = Sisimai::MTA::InterScanMSS.smtpagent
|
146
|
+
if mhead['received'].size > 0
|
147
|
+
# Get localhost and remote host name from Received header.
|
148
|
+
r0 = mhead['received']
|
149
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
150
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
151
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
152
|
+
end
|
153
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
154
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
155
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
156
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
157
|
+
e.each_key { |a| e[a] ||= '' }
|
158
|
+
end
|
159
|
+
|
160
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
@@ -0,0 +1,173 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::MailFoundry parses a bounce email which created by MailFoundry.
|
4
|
+
# Methods in the module are called from only Sisimai::Message.
|
5
|
+
module MailFoundry
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/MailFoundry.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:subject => %r/\AMessage delivery has failed\z/,
|
13
|
+
:received => %r/[(]MAILFOUNDRY[)] id /,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\AThis is a MIME encoded message\z/,
|
17
|
+
:error => %r/\ADelivery failed for the following reason:\z/,
|
18
|
+
:rfc822 => %r|\AContent-Type: message/rfc822\z|,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
}
|
21
|
+
Indicators = Sisimai::MTA.INDICATORS
|
22
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
23
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
24
|
+
|
25
|
+
def description; return 'MailFoundry'; end
|
26
|
+
def smtpagent; return 'MailFoundry'; end
|
27
|
+
def headerlist; return []; end
|
28
|
+
def pattern; return Re0; end
|
29
|
+
|
30
|
+
# Parse bounce messages from MailFoundry
|
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
|
+
return nil unless mhead['subject'] =~ Re0[:subject]
|
45
|
+
return nil unless mhead['received'].find { |a| a =~ Re0[:received] }
|
46
|
+
|
47
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
48
|
+
hasdivided = mbody.split("\n")
|
49
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
50
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
51
|
+
previousfn = '' # (String) Previous field name
|
52
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
53
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
54
|
+
v = nil
|
55
|
+
|
56
|
+
hasdivided.each do |e|
|
57
|
+
if readcursor == 0
|
58
|
+
# Beginning of the bounce message or delivery status part
|
59
|
+
if e =~ Re1[:begin]
|
60
|
+
readcursor |= Indicators[:'deliverystatus']
|
61
|
+
next
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
66
|
+
# Beginning of the original message part
|
67
|
+
if e =~ Re1[:rfc822]
|
68
|
+
readcursor |= Indicators[:'message-rfc822']
|
69
|
+
next
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
74
|
+
# After "message/rfc822"
|
75
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
76
|
+
# Get required headers only
|
77
|
+
lhs = cv[1].downcase
|
78
|
+
previousfn = ''
|
79
|
+
next unless RFC822Head.key?(lhs)
|
80
|
+
|
81
|
+
previousfn = lhs
|
82
|
+
rfc822part += e + "\n"
|
83
|
+
|
84
|
+
elsif e =~ /\A[ \t]+/
|
85
|
+
# Continued line from the previous line
|
86
|
+
next if rfc822next[previousfn]
|
87
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
88
|
+
|
89
|
+
else
|
90
|
+
# Check the end of headers in rfc822 part
|
91
|
+
next unless LongFields.key?(previousfn)
|
92
|
+
next unless e.empty?
|
93
|
+
rfc822next[previousfn] = true
|
94
|
+
end
|
95
|
+
|
96
|
+
else
|
97
|
+
# Before "message/rfc822"
|
98
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
99
|
+
next if e.empty?
|
100
|
+
|
101
|
+
# Unable to deliver message to: <kijitora@example.org>
|
102
|
+
# Delivery failed for the following reason:
|
103
|
+
# Server mx22.example.org[192.0.2.222] failed with: 550 <kijitora@example.org> No such user here
|
104
|
+
#
|
105
|
+
# This has been a permanent failure. No further delivery attempts will be made.
|
106
|
+
v = dscontents[-1]
|
107
|
+
|
108
|
+
if cv = e.match(/\AUnable to deliver message to: [<]([^ ]+[@][^ ]+)[>]\z/)
|
109
|
+
# Unable to deliver message to: <kijitora@example.org>
|
110
|
+
if v['recipient']
|
111
|
+
# There are multiple recipient addresses in the message body.
|
112
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
113
|
+
v = dscontents[-1]
|
114
|
+
end
|
115
|
+
v['recipient'] = cv[1]
|
116
|
+
recipients += 1
|
117
|
+
|
118
|
+
else
|
119
|
+
# Error message
|
120
|
+
if e =~ Re1[:error]
|
121
|
+
# Delivery failed for the following reason:
|
122
|
+
v['diagnosis'] = e
|
123
|
+
|
124
|
+
else
|
125
|
+
# Detect error message
|
126
|
+
next if e.empty?
|
127
|
+
next if v['diagnosis'].nil? || v['diagnosis'].empty?
|
128
|
+
next if e =~ /\A[-]+/
|
129
|
+
|
130
|
+
if e =~ /\AThis has been a permanent failure/
|
131
|
+
# This has been a permanent failure. No further delivery attempts will be made.
|
132
|
+
v['softbounce'] = 0
|
133
|
+
|
134
|
+
else
|
135
|
+
# Server mx22.example.org[192.0.2.222] failed with: 550 <kijitora@example.org> No such user here
|
136
|
+
v['diagnosis'] ||= ''
|
137
|
+
v['diagnosis'] += ' ' + e
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
return nil if recipients == 0
|
145
|
+
require 'sisimai/string'
|
146
|
+
require 'sisimai/smtp/status'
|
147
|
+
|
148
|
+
dscontents.map do |e|
|
149
|
+
e['agent'] = Sisimai::MTA::MailFoundry.smtpagent
|
150
|
+
|
151
|
+
if mhead['received'].size > 0
|
152
|
+
# Get localhost and remote host name from Received header.
|
153
|
+
r0 = mhead['received']
|
154
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
155
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
156
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
157
|
+
end
|
158
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
159
|
+
|
160
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
161
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
162
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
163
|
+
e.each_key { |a| e[a] ||= '' }
|
164
|
+
end
|
165
|
+
|
166
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|