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,206 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::MailMarshalSMTP parses a bounce email which created by
|
4
|
+
# Trustwave Secure Email Gateway: formerly MailMarshal SMTP. Methods in the
|
5
|
+
# module are called from only Sisimai::Message.
|
6
|
+
module MailMarshalSMTP
|
7
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/MailMarshalSMTP.pm
|
8
|
+
class << self
|
9
|
+
require 'sisimai/mta'
|
10
|
+
require 'sisimai/rfc5322'
|
11
|
+
|
12
|
+
Re0 = {
|
13
|
+
:subject => %r/\AUndeliverable Mail: ["]/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\AYour message:\z/,
|
17
|
+
:rfc822 => nil,
|
18
|
+
:error => %r/\ACould not be delivered because of\z/,
|
19
|
+
:rcpts => %r/\AThe following recipients were affected:/,
|
20
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
21
|
+
}
|
22
|
+
Indicators = Sisimai::MTA.INDICATORS
|
23
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
24
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
25
|
+
|
26
|
+
def description; return 'Trustwave Secure Email Gateway'; end
|
27
|
+
def smtpagent; return 'MailMarshalSMTP'; end
|
28
|
+
def headerlist; return ['X-Mailer']; end
|
29
|
+
def pattern; return Re0; end
|
30
|
+
|
31
|
+
# Parse bounce messages from MailMarshalSMTP
|
32
|
+
# @param [Hash] mhead Message header of a bounce email
|
33
|
+
# @options mhead [String] from From header
|
34
|
+
# @options mhead [String] date Date header
|
35
|
+
# @options mhead [String] subject Subject header
|
36
|
+
# @options mhead [Array] received Received headers
|
37
|
+
# @options mhead [String] others Other required headers
|
38
|
+
# @param [String] mbody Message body of a bounce email
|
39
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
40
|
+
# part or nil if it failed to parse or
|
41
|
+
# the arguments are missing
|
42
|
+
def scan(mhead, mbody)
|
43
|
+
return nil unless mhead
|
44
|
+
return nil unless mbody
|
45
|
+
return nil unless mhead['subject'] =~ Re0[:subject]
|
46
|
+
|
47
|
+
require 'sisimai/mime'
|
48
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
49
|
+
hasdivided = mbody.split("\n")
|
50
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
51
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
52
|
+
previousfn = '' # (String) Previous field name
|
53
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
54
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
55
|
+
endoferror = false # (Boolean) Flag for the end of error message
|
56
|
+
regularexp = nil
|
57
|
+
v = nil
|
58
|
+
|
59
|
+
boundary00 = Sisimai::MIME.boundary(mhead['content-type']) || ''
|
60
|
+
if boundary00.size > 0
|
61
|
+
# Convert to regular expression
|
62
|
+
regularexp = Regexp.new('\A' + Regexp.escape('--' + boundary00 + '--') + '\z')
|
63
|
+
else
|
64
|
+
regularexp = %r/\A[ \t]*[+]+[ \t]*\z/
|
65
|
+
end
|
66
|
+
|
67
|
+
hasdivided.each do |e|
|
68
|
+
if readcursor == 0
|
69
|
+
# Beginning of the bounce message or delivery status part
|
70
|
+
if e =~ Re1[:begin]
|
71
|
+
readcursor |= Indicators[:'deliverystatus']
|
72
|
+
next
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
77
|
+
# Beginning of the original message part
|
78
|
+
if e =~ regularexp
|
79
|
+
readcursor |= Indicators[:'message-rfc822']
|
80
|
+
next
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
85
|
+
# After "message/rfc822"
|
86
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
87
|
+
# Get required headers only
|
88
|
+
lhs = cv[1].downcase
|
89
|
+
previousfn = ''
|
90
|
+
next unless RFC822Head.key?(lhs)
|
91
|
+
|
92
|
+
previousfn = lhs
|
93
|
+
rfc822part += e + "\n"
|
94
|
+
|
95
|
+
elsif e =~ /\A[ \t]+/
|
96
|
+
# Continued line from the previous line
|
97
|
+
next if rfc822next[previousfn]
|
98
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
99
|
+
|
100
|
+
else
|
101
|
+
# Check the end of headers in rfc822 part
|
102
|
+
next unless LongFields.key?(previousfn)
|
103
|
+
next unless e.empty?
|
104
|
+
rfc822next[previousfn] = true
|
105
|
+
end
|
106
|
+
|
107
|
+
else
|
108
|
+
# Before "message/rfc822"
|
109
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
110
|
+
break if e =~ regularexp
|
111
|
+
|
112
|
+
# Your message:
|
113
|
+
# From: originalsender@example.com
|
114
|
+
# Subject: IIdentifica蟾ス驕俳
|
115
|
+
#
|
116
|
+
# Could not be delivered because of
|
117
|
+
#
|
118
|
+
# 550 5.1.1 User unknown
|
119
|
+
#
|
120
|
+
# The following recipients were affected:
|
121
|
+
# dummyuser@blabla.xxxxxxxxxxxx.com
|
122
|
+
v = dscontents[-1]
|
123
|
+
|
124
|
+
if cv = e.match(/\A[ ]{4}([^ ]+[@][^ ]+)\z/)
|
125
|
+
# The following recipients were affected:
|
126
|
+
# dummyuser@blabla.xxxxxxxxxxxx.com
|
127
|
+
if v['recipient']
|
128
|
+
# There are multiple recipient addresses in the message body.
|
129
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
130
|
+
v = dscontents[-1]
|
131
|
+
end
|
132
|
+
v['recipient'] = cv[1]
|
133
|
+
recipients += 1
|
134
|
+
|
135
|
+
else
|
136
|
+
# Get error message lines
|
137
|
+
if e =~ Re1[:error]
|
138
|
+
# Could not be delivered because of
|
139
|
+
#
|
140
|
+
# 550 5.1.1 User unknown
|
141
|
+
v['diagnosis'] = e
|
142
|
+
|
143
|
+
elsif v['diagnosis'] && v['diagnosis'].size > 0 && endoferror == false
|
144
|
+
# Append error messages
|
145
|
+
endoferror = true if e =~ Re1[:rcpts]
|
146
|
+
next if endoferror
|
147
|
+
v['diagnosis'] += ' ' + e
|
148
|
+
|
149
|
+
else
|
150
|
+
# Additional Information
|
151
|
+
# ======================
|
152
|
+
# Original Sender: <originalsender@example.com>
|
153
|
+
# Sender-MTA: <10.11.12.13>
|
154
|
+
# Remote-MTA: <10.0.0.1>
|
155
|
+
# Reporting-MTA: <relay.xxxxxxxxxxxx.com>
|
156
|
+
# MessageName: <B549996730000.000000000001.0003.mml>
|
157
|
+
# Last-Attempt-Date: <16:21:07 seg, 22 Dezembro 2014>
|
158
|
+
if cv = e.match(/\AOriginal Sender:[ \t]+[<](.+)[>]\z/)
|
159
|
+
# Original Sender: <originalsender@example.com>
|
160
|
+
# Use this line instead of "From" header of the original
|
161
|
+
# message.
|
162
|
+
rfc822part += sprintf("From: %s\n", cv[1])
|
163
|
+
|
164
|
+
elsif cv = e.match(/\ASender-MTA:[ \t]+[<](.+)[>]\z/)
|
165
|
+
# Sender-MTA: <10.11.12.13>
|
166
|
+
v['lhost'] = cv[1]
|
167
|
+
|
168
|
+
elsif cv = e.match(/\AReporting-MTA:[ \t]+[<](.+)[>]\z/)
|
169
|
+
# Reporting-MTA: <relay.xxxxxxxxxxxx.com>
|
170
|
+
v['rhost'] = cv[1]
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
return nil if recipients == 0
|
178
|
+
require 'sisimai/string'
|
179
|
+
require 'sisimai/smtp/status'
|
180
|
+
|
181
|
+
dscontents.map do |e|
|
182
|
+
e['agent'] = Sisimai::MTA::MailMarshalSMTP.smtpagent
|
183
|
+
|
184
|
+
if mhead['received'].size > 0
|
185
|
+
# Get localhost and remote host name from Received header.
|
186
|
+
r0 = mhead['received']
|
187
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
188
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
189
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
190
|
+
end
|
191
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
192
|
+
|
193
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
194
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
195
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
196
|
+
e.each_key { |a| e[a] ||= '' }
|
197
|
+
end
|
198
|
+
|
199
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
@@ -0,0 +1,201 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::McAfee parses a bounce email which created by McAfee Email
|
4
|
+
# Appliance. Methods in the module are called from only Sisimai::Message.
|
5
|
+
module McAfee
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/McAfee.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:'x-nai' => %r/Modified by McAfee /,
|
13
|
+
:'subject' => %r/\ADelivery Status\z/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/[-]+ The following addresses had delivery problems [-]+\z/,
|
17
|
+
:error => %r|\AContent-Type: [^ ]+/[^ ]+; name="deliveryproblems[.]txt"|,
|
18
|
+
:rfc822 => %r|\AContent-Type: message/rfc822\z|,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
}
|
21
|
+
ReFailure = {
|
22
|
+
'userunknown' => %r{(?:
|
23
|
+
User[ ][(].+[@].+[)][ ]unknown[.]
|
24
|
+
|550[ ]Unknown[ ]user[ ][^ ]+[@][^ ]+
|
25
|
+
)
|
26
|
+
}x,
|
27
|
+
}
|
28
|
+
Indicators = Sisimai::MTA.INDICATORS
|
29
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
30
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
31
|
+
|
32
|
+
def description; return 'McAfee Email Appliance'; end
|
33
|
+
def smtpagent; return 'McAfee'; end
|
34
|
+
def headerlist; return ['X-NAI-Header']; end
|
35
|
+
def pattern; return Re0; end
|
36
|
+
|
37
|
+
# Parse bounce messages from McAfee Email Appliance
|
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-nai-header']
|
52
|
+
return nil unless mhead['x-nai-header'] =~ Re0[:'x-nai']
|
53
|
+
return nil unless mhead['subject'] =~ Re0[:'subject']
|
54
|
+
|
55
|
+
require 'sisimai/address'
|
56
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
57
|
+
hasdivided = mbody.split("\n")
|
58
|
+
havepassed = [''];
|
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
|
+
diagnostic = '' # (String) Alternative diagnostic message
|
65
|
+
v = nil
|
66
|
+
|
67
|
+
hasdivided.each do |e|
|
68
|
+
# Save the current line for the next loop
|
69
|
+
havepassed << e; p = havepassed[-2]
|
70
|
+
|
71
|
+
if readcursor == 0
|
72
|
+
# Beginning of the bounce message or delivery status part
|
73
|
+
if e =~ Re1[:begin]
|
74
|
+
readcursor |= Indicators[:'deliverystatus']
|
75
|
+
next
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
80
|
+
# Beginning of the original message part
|
81
|
+
if e =~ Re1[:rfc822]
|
82
|
+
readcursor |= Indicators[:'message-rfc822']
|
83
|
+
next
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
88
|
+
# After "message/rfc822"
|
89
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
90
|
+
# Get required headers only
|
91
|
+
lhs = cv[1].downcase
|
92
|
+
previousfn = ''
|
93
|
+
next unless RFC822Head.key?(lhs)
|
94
|
+
|
95
|
+
previousfn = lhs
|
96
|
+
rfc822part += e + "\n"
|
97
|
+
|
98
|
+
elsif e =~ /\A[ \t]+/
|
99
|
+
# Continued line from the previous line
|
100
|
+
next if rfc822next[previousfn]
|
101
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
102
|
+
|
103
|
+
else
|
104
|
+
# Check the end of headers in rfc822 part
|
105
|
+
next unless LongFields.key?(previousfn)
|
106
|
+
next unless e.empty?
|
107
|
+
rfc822next[previousfn] = true
|
108
|
+
end
|
109
|
+
|
110
|
+
else
|
111
|
+
# Before "message/rfc822"
|
112
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
113
|
+
next if e.empty?
|
114
|
+
|
115
|
+
# Content-Type: text/plain; name="deliveryproblems.txt"
|
116
|
+
#
|
117
|
+
# --- The following addresses had delivery problems ---
|
118
|
+
#
|
119
|
+
# <user@example.com> (User unknown user@example.com)
|
120
|
+
#
|
121
|
+
# --------------Boundary-00=_00000000000000000000
|
122
|
+
# Content-Type: message/delivery-status; name="deliverystatus.txt"
|
123
|
+
#
|
124
|
+
v = dscontents[-1]
|
125
|
+
|
126
|
+
if cv = e.match(/\A[<]([^ ]+[@][^ ]+)[>][ \t]+[(](.+)[)]\z/)
|
127
|
+
# <kijitora@example.co.jp> (Unknown user kijitora@example.co.jp)
|
128
|
+
if v['recipient']
|
129
|
+
# There are multiple recipient addresses in the message body.
|
130
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
131
|
+
v = dscontents[-1]
|
132
|
+
end
|
133
|
+
v['recipient'] = cv[1]
|
134
|
+
diagnostic = cv[2]
|
135
|
+
recipients += 1
|
136
|
+
|
137
|
+
elsif cv = e.match(/\A[Oo]riginal-[Rr]ecipient:[ ]*([^ ]+)\z/)
|
138
|
+
# Original-Recipient: <kijitora@example.co.jp>
|
139
|
+
v['alias'] = Sisimai::Address.s3s4(cv[1])
|
140
|
+
|
141
|
+
elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
|
142
|
+
# Action: failed
|
143
|
+
v['action'] = cv[1].downcase
|
144
|
+
|
145
|
+
elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(.+)\z/)
|
146
|
+
# Remote-MTA: 192.0.2.192
|
147
|
+
v['rhost'] = cv[1].downcase
|
148
|
+
|
149
|
+
else
|
150
|
+
if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
|
151
|
+
# Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
|
152
|
+
v['spec'] = cv[1].upcase
|
153
|
+
v['diagnosis'] = cv[2]
|
154
|
+
|
155
|
+
elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
|
156
|
+
# Continued line of the value of Diagnostic-Code header
|
157
|
+
v['diagnosis'] ||= ' '
|
158
|
+
v['diagnosis'] += ' ' + cv[1]
|
159
|
+
havepassed[-1] = 'Diagnostic-Code: ' + e
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
return nil if recipients == 0
|
166
|
+
require 'sisimai/string'
|
167
|
+
require 'sisimai/smtp/status'
|
168
|
+
|
169
|
+
dscontents.map do |e|
|
170
|
+
# Set default values if each value is empty.
|
171
|
+
e['agent'] = Sisimai::MTA::McAfee.smtpagent
|
172
|
+
|
173
|
+
if mhead['received'].size > 0
|
174
|
+
# Get localhost and remote host name from Received header.
|
175
|
+
r0 = mhead['received']
|
176
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
177
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
178
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
179
|
+
end
|
180
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'] || diagnostic)
|
181
|
+
|
182
|
+
ReFailure.each_key do |r|
|
183
|
+
# Verify each regular expression of session errors
|
184
|
+
next unless e['diagnosis'] =~ ReFailure[r]
|
185
|
+
e['reason'] = r
|
186
|
+
break
|
187
|
+
end
|
188
|
+
|
189
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
190
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
191
|
+
e.each_key { |a| e[a] ||= '' }
|
192
|
+
end
|
193
|
+
|
194
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
@@ -0,0 +1,241 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::MessagingServer parses a bounce email which created by Oracle
|
4
|
+
# Communications Messaging Server and Sun Java System Messaging Server.
|
5
|
+
# Methods in the module are called from only Sisimai::Message.
|
6
|
+
module MessagingServer
|
7
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/MessagingServer.pm
|
8
|
+
class << self
|
9
|
+
require 'sisimai/mta'
|
10
|
+
require 'sisimai/rfc5322'
|
11
|
+
|
12
|
+
Re0 = {
|
13
|
+
:subject => %r/\ADelivery Notification: /,
|
14
|
+
:received => %r/[ ][(]MessagingServer[)][ ]with[ ]/,
|
15
|
+
:boundary => %r/Boundary_[(]ID_.+[)]/,
|
16
|
+
}
|
17
|
+
Re1 = {
|
18
|
+
:begin => %r/\AThis report relates to a message you sent with the following header fields:/,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
:rfc822 => %r!\A(?:Content-type:[ ]*message/rfc822|Return-path:[ ]*)!x,
|
21
|
+
}
|
22
|
+
ReFailure = {
|
23
|
+
'hostunknown' => %r{Illegal[ ]host/domain[ ]name[ ]found}x,
|
24
|
+
}
|
25
|
+
Indicators = Sisimai::MTA.INDICATORS
|
26
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
27
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
28
|
+
|
29
|
+
def description; return 'Oracle Communications Messaging Server'; end
|
30
|
+
def smtpagent; return 'MessagingServer'; end
|
31
|
+
def headerlist; return []; end
|
32
|
+
def pattern; return Re0; end
|
33
|
+
|
34
|
+
# Parse bounce messages from MessagingServer
|
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
|
+
|
49
|
+
match = 0
|
50
|
+
match += 1 if mhead['content-type'] =~ Re0[:boundary]
|
51
|
+
match += 1 if mhead['subject'] =~ Re0[:subject]
|
52
|
+
return nil if match == 0
|
53
|
+
|
54
|
+
require 'sisimai/address'
|
55
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
56
|
+
hasdivided = mbody.split("\n")
|
57
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
58
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
59
|
+
previousfn = '' # (String) Previous field name
|
60
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
61
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
62
|
+
v = nil
|
63
|
+
|
64
|
+
hasdivided.each do |e|
|
65
|
+
if readcursor == 0
|
66
|
+
# Beginning of the bounce message or delivery status part
|
67
|
+
if e =~ Re1[:begin]
|
68
|
+
readcursor |= Indicators[:'deliverystatus']
|
69
|
+
next
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
74
|
+
# Beginning of the original message part
|
75
|
+
if e =~ Re1[:rfc822]
|
76
|
+
readcursor |= Indicators[:'message-rfc822']
|
77
|
+
next
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
82
|
+
# After "message/rfc822"
|
83
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
84
|
+
# Get required headers only
|
85
|
+
lhs = cv[1].downcase
|
86
|
+
previousfn = ''
|
87
|
+
next unless RFC822Head.key?(lhs)
|
88
|
+
|
89
|
+
previousfn = lhs
|
90
|
+
rfc822part += e + "\n"
|
91
|
+
|
92
|
+
elsif e =~ /\A[ \t]+/
|
93
|
+
# Continued line from the previous line
|
94
|
+
next if rfc822next[previousfn]
|
95
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
96
|
+
|
97
|
+
else
|
98
|
+
# Check the end of headers in rfc822 part
|
99
|
+
next unless LongFields.key?(previousfn)
|
100
|
+
next unless e.empty?
|
101
|
+
rfc822next[previousfn] = true
|
102
|
+
end
|
103
|
+
|
104
|
+
else
|
105
|
+
# Before "message/rfc822"
|
106
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
107
|
+
next if e.empty?
|
108
|
+
|
109
|
+
# --Boundary_(ID_0000000000000000000000)
|
110
|
+
# Content-type: text/plain; charset=us-ascii
|
111
|
+
# Content-language: en-US
|
112
|
+
#
|
113
|
+
# This report relates to a message you sent with the following header fields:
|
114
|
+
#
|
115
|
+
# Message-id: <CD8C6134-C312-41D5-B083-366F7FA1D752@me.example.com>
|
116
|
+
# Date: Fri, 21 Nov 2014 23:34:45 +0900
|
117
|
+
# From: Shironeko <shironeko@me.example.com>
|
118
|
+
# To: kijitora@example.jp
|
119
|
+
# Subject: Nyaaaaaaaaaaaaaaaaaaaaaan
|
120
|
+
#
|
121
|
+
# Your message cannot be delivered to the following recipients:
|
122
|
+
#
|
123
|
+
# Recipient address: kijitora@example.jp
|
124
|
+
# Reason: Remote SMTP server has rejected address
|
125
|
+
# Diagnostic code: smtp;550 5.1.1 <kijitora@example.jp>... User Unknown
|
126
|
+
# Remote system: dns;mx.example.jp (TCP|17.111.174.67|47323|192.0.2.225|25) (6jo.example.jp ESMTP SENDMAIL-VM)
|
127
|
+
v = dscontents[-1]
|
128
|
+
|
129
|
+
if cv = e.match(/\A[ \t]+Recipient address:[ \t]*([^ ]+[@][^ ]+)\z/)
|
130
|
+
# Recipient address: kijitora@example.jp
|
131
|
+
if v['recipient']
|
132
|
+
# There are multiple recipient addresses in the message body.
|
133
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
134
|
+
v = dscontents[-1]
|
135
|
+
end
|
136
|
+
v['recipient'] = Sisimai::Address.s3s4(cv[1])
|
137
|
+
recipients += 1
|
138
|
+
|
139
|
+
elsif cv = e.match(/\A[ \t]+Original address:[ \t]*([^ ]+[@][^ ]+)\z/)
|
140
|
+
# Original address: kijitora@example.jp
|
141
|
+
v['recipient'] = Sisimai::Address.s3s4(cv[1])
|
142
|
+
|
143
|
+
elsif cv = e.match(/\A[ \t]+Date:[ \t]*(.+)\z/)
|
144
|
+
# Date: Fri, 21 Nov 2014 23:34:45 +0900
|
145
|
+
v['date'] = cv[1]
|
146
|
+
|
147
|
+
elsif cv = e.match(/\A[ \t]+Reason:[ \t]*(.+)\z/)
|
148
|
+
# Reason: Remote SMTP server has rejected address
|
149
|
+
v['diagnosis'] = cv[1]
|
150
|
+
|
151
|
+
elsif cv = e.match(/\A[ \t]+Diagnostic code:[ \t]*([^ ]+);(.+)\z/)
|
152
|
+
# Diagnostic code: smtp;550 5.1.1 <kijitora@example.jp>... User Unknown
|
153
|
+
v['spec'] = cv[1].upcase
|
154
|
+
v['diagnosis'] = cv[2]
|
155
|
+
|
156
|
+
elsif cv = e.match(/\A[ \t]+Remote system:[ ]*dns;([^ ]+)[ ]*([^ ]+)[ ]*.+\z/)
|
157
|
+
# Remote system: dns;mx.example.jp (TCP|17.111.174.67|47323|192.0.2.225|25)
|
158
|
+
# (6jo.example.jp ESMTP SENDMAIL-VM)
|
159
|
+
remotehost = cv[1] # remote host
|
160
|
+
sessionlog = cv[2] # smtp session
|
161
|
+
v['rhost'] = remotehost
|
162
|
+
|
163
|
+
if cv = sessionlog.match(/\A[(]TCP|(.+)|\d+|(.+)|\d+[)]/)
|
164
|
+
# The value does not include ".", use IP address instead.
|
165
|
+
# (TCP|17.111.174.67|47323|192.0.2.225|25)
|
166
|
+
v['lhost'] = cv[1]
|
167
|
+
v['rhost'] = cv[2] unless remotehost =~ /[^.]+[.][^.]+/
|
168
|
+
end
|
169
|
+
|
170
|
+
else
|
171
|
+
# Original-envelope-id: 0NFC009FLKOUVMA0@mr21p30im-asmtp004.me.com
|
172
|
+
# Reporting-MTA: dns;mr21p30im-asmtp004.me.com (tcp-daemon)
|
173
|
+
# Arrival-date: Thu, 29 Apr 2014 23:34:45 +0000 (GMT)
|
174
|
+
#
|
175
|
+
# Original-recipient: rfc822;kijitora@example.jp
|
176
|
+
# Final-recipient: rfc822;kijitora@example.jp
|
177
|
+
# Action: failed
|
178
|
+
# Status: 5.1.1 (Remote SMTP server has rejected address)
|
179
|
+
# Remote-MTA: dns;mx.example.jp (TCP|17.111.174.67|47323|192.0.2.225|25)
|
180
|
+
# (6jo.example.jp ESMTP SENDMAIL-VM)
|
181
|
+
# Diagnostic-code: smtp;550 5.1.1 <kijitora@example.jp>... User Unknown
|
182
|
+
#
|
183
|
+
if cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d[.]\d)[ ]*[(](.+)[)]\z/)
|
184
|
+
# Status: 5.1.1 (Remote SMTP server has rejected address)
|
185
|
+
v['status'] = cv[1]
|
186
|
+
v['diagnosis'] ||= cv[2]
|
187
|
+
|
188
|
+
elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
|
189
|
+
# Arrival-date: Thu, 29 Apr 2014 23:34:45 +0000 (GMT)
|
190
|
+
v['date'] ||= cv[1]
|
191
|
+
|
192
|
+
elsif cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
193
|
+
# Reporting-MTA: dns;mr21p30im-asmtp004.me.com (tcp-daemon)
|
194
|
+
localhost = cv[1]
|
195
|
+
v['lhost'] ||= localhost
|
196
|
+
v['lhost'] = localhost unless v['lhost'] =~ /[^.]+[.][^ ]+/
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
return nil if recipients == 0
|
203
|
+
require 'sisimai/string'
|
204
|
+
require 'sisimai/smtp/status'
|
205
|
+
|
206
|
+
dscontents.map do |e|
|
207
|
+
e['agent'] = Sisimai::MTA::MessagingServer.smtpagent
|
208
|
+
|
209
|
+
if mhead['received'].size > 0
|
210
|
+
# Get localhost and remote host name from Received header.
|
211
|
+
r0 = mhead['received']
|
212
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
213
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
214
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
215
|
+
end
|
216
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
217
|
+
|
218
|
+
ReFailure.each_key do |r|
|
219
|
+
# Verify each regular expression of session errors
|
220
|
+
next unless e['diagnosis'] =~ ReFailure[r]
|
221
|
+
e['reason'] = r
|
222
|
+
break
|
223
|
+
end
|
224
|
+
|
225
|
+
if e['status'].nil? || e['status'].empty? || e['status'] =~ /\A\d[.]0[.]0\z/
|
226
|
+
# There is no value of Status header or the value is 5.0.0, 4.0.0
|
227
|
+
pseudostatus = Sisimai::SMTP::Status.find(e['diagnosis'])
|
228
|
+
e['status'] = pseudostatus if pseudostatus.size > 0
|
229
|
+
end
|
230
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
231
|
+
e.each_key { |a| e[a] ||= '' }
|
232
|
+
end
|
233
|
+
|
234
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|