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,335 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::Qmail parses a bounce email which created by qmail. Methods
|
4
|
+
# in the module are called from only Sisimai::Message.
|
5
|
+
module Qmail
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/qmail.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:subject => %r/\Afailure notice/i,
|
13
|
+
:received => %r/\A[(]qmail[ ]+\d+[ ]+invoked[ ]+(?:for[ ]+bounce|from[ ]+network)[)]/,
|
14
|
+
}
|
15
|
+
# qmail-remote.c:248| if (code >= 500) {
|
16
|
+
# qmail-remote.c:249| out("h"); outhost(); out(" does not like recipient.\n");
|
17
|
+
# qmail-remote.c:265| if (code >= 500) quit("D"," failed on DATA command");
|
18
|
+
# qmail-remote.c:271| if (code >= 500) quit("D"," failed after I sent the message");
|
19
|
+
#
|
20
|
+
# Characters: K,Z,D in qmail-qmqpc.c, qmail-send.c, qmail-rspawn.c
|
21
|
+
# K = success, Z = temporary error, D = permanent error
|
22
|
+
Re1 = {
|
23
|
+
:begin => %r/\AHi[.] This is the qmail/,
|
24
|
+
:rfc822 => %r/\A--- Below this line is a copy of the message[.]\z/,
|
25
|
+
:error => %r/\ARemote host said:/,
|
26
|
+
:sorry => %r/\A[Ss]orry[,.][ ]/,
|
27
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
28
|
+
}
|
29
|
+
ReSMTP = {
|
30
|
+
# Error text regular expressions which defined in qmail-remote.c
|
31
|
+
# qmail-remote.c:225| if (smtpcode() != 220) quit("ZConnected to "," but greeting failed");
|
32
|
+
'conn' => %r/(?:Error:)?Connected[ ]to[ ].+[ ]but[ ]greeting[ ]failed[.]/x,
|
33
|
+
# qmail-remote.c:231| if (smtpcode() != 250) quit("ZConnected to "," but my name was rejected");
|
34
|
+
'ehlo' => %r/(?:Error:)?Connected[ ]to[ ].+[ ]but[ ]my[ ]name[ ]was[ ]rejected[.]/x,
|
35
|
+
# qmail-remote.c:238| if (code >= 500) quit("DConnected to "," but sender was rejected");
|
36
|
+
# reason = rejected
|
37
|
+
'mail' => %r/(?:Error:)?Connected[ ]to[ ].+[ ]but[ ]sender[ ]was[ ]rejected[.]/x,
|
38
|
+
# qmail-remote.c:249| out("h"); outhost(); out(" does not like recipient.\n");
|
39
|
+
# qmail-remote.c:253| out("s"); outhost(); out(" does not like recipient.\n");
|
40
|
+
# reason = userunknown
|
41
|
+
'rcpt' => %r/(?:Error:)?.+[ ]does[ ]not[ ]like[ ]recipient[.]/x,
|
42
|
+
# qmail-remote.c:265| if (code >= 500) quit("D"," failed on DATA command");
|
43
|
+
# qmail-remote.c:266| if (code >= 400) quit("Z"," failed on DATA command");
|
44
|
+
# qmail-remote.c:271| if (code >= 500) quit("D"," failed after I sent the message");
|
45
|
+
# qmail-remote.c:272| if (code >= 400) quit("Z"," failed after I sent the message");
|
46
|
+
'data' => %r{(?:
|
47
|
+
(?:Error:)?.+[ ]failed[ ]on[ ]DATA[ ]command[.]
|
48
|
+
|(?:Error:)?.+[ ]failed[ ]after[ ]I[ ]sent[ ]the[ ]message[.]
|
49
|
+
)
|
50
|
+
}x,
|
51
|
+
}
|
52
|
+
# qmail-remote.c:261| if (!flagbother) quit("DGiving up on ","");
|
53
|
+
ReHost = %r{(?:
|
54
|
+
Giving[ ]up[ ]on[ ](.+[0-9a-zA-Z])[.]?\z
|
55
|
+
|Connected[ ]to[ ]([-0-9a-zA-Z.]+[0-9a-zA-Z])[ ]
|
56
|
+
|remote[ ]host[ ]([-0-9a-zA-Z.]+[0-9a-zA-Z])[ ]said:
|
57
|
+
)
|
58
|
+
}x
|
59
|
+
ReLDAP = {
|
60
|
+
# qmail-ldap-1.03-20040101.patch:19817 - 19866
|
61
|
+
'suspend' => %r/Mailaddress is administrative?le?y disabled/, # 5.2.1
|
62
|
+
'userunknown' => %r/[Ss]orry, no mailbox here by that name/, # 5.1.1
|
63
|
+
'exceedlimit' => %r/The message exeeded the maximum size the user accepts/, # 5.2.3
|
64
|
+
'systemerror' => %r{(?>
|
65
|
+
Automatic[ ]homedir[ ]creator[ ]crashed # 4.3.0
|
66
|
+
|Illegal[ ]value[ ]in[ ]LDAP[ ]attribute # 5.3.5
|
67
|
+
|LDAP[ ]attribute[ ]is[ ]not[ ]given[ ]but[ ]mandatory # 5.3.5
|
68
|
+
|Timeout[ ]while[ ]performing[ ]search[ ]on[ ]LDAP[ ]server # 4.4.3
|
69
|
+
|Too[ ]many[ ]results[ ]returned[ ]but[ ]needs[ ]to[ ]be[ ]unique # 5.3.5
|
70
|
+
|Permanent[ ]error[ ]while[ ]executing[ ]qmail[-]forward # 5.4.4
|
71
|
+
|Temporary[ ](?:
|
72
|
+
error[ ](?:
|
73
|
+
in[ ]automatic[ ]homedir[ ]creation # 4.3.0 or 5.3.0
|
74
|
+
|while[ ]executing[ ]qmail[-]forward # 4.4.4
|
75
|
+
)
|
76
|
+
|failure[ ]in[ ]LDAP[ ]lookup # 4.4.3
|
77
|
+
)
|
78
|
+
|Unable[ ]to[ ](?:
|
79
|
+
contact[ ]LDAP[ ]server # 4.4.3
|
80
|
+
|login[ ]into[ ]LDAP[ ]server,[ ]bad[ ]credentials # 4.4.3
|
81
|
+
)
|
82
|
+
)
|
83
|
+
}x,
|
84
|
+
}
|
85
|
+
# userunknown + expired
|
86
|
+
ReOnHold = %r/\A[^ ]+ does not like recipient[.][ ]+.+this message has been in the queue too long[.]\z/
|
87
|
+
# qmail-remote-fallback.patch
|
88
|
+
ReCommand = %r/Sorry,[ ]no[ ]SMTP[ ]connection[ ]got[ ]far[ ]enough;[ ]most[ ]progress[ ]was[ ]([A-Z]{4})[ ]/x
|
89
|
+
ReFailure = {
|
90
|
+
# qmail-local.c:589| strerr_die1x(100,"Sorry, no mailbox here by that name. (#5.1.1)");
|
91
|
+
# qmail-remote.c:253| out("s"); outhost(); out(" does not like recipient.\n");
|
92
|
+
'userunknown' => %r{(?:
|
93
|
+
no[ ]mailbox[ ]here[ ]by[ ]that[ ]name
|
94
|
+
|[ ]does[ ]not[ ]like[ ]recipient[.]
|
95
|
+
)
|
96
|
+
}x,
|
97
|
+
# error_str.c:192| X(EDQUOT,"disk quota exceeded")
|
98
|
+
'mailboxfull' => %r/disk[ ]quota[ ]exceeded/x,
|
99
|
+
# qmail-qmtpd.c:233| ... result = "Dsorry, that message size exceeds my databytes limit (#5.3.4)";
|
100
|
+
# qmail-smtpd.c:391| ... out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); return;
|
101
|
+
'mesgtoobig' => %r/Message[ ]size[ ]exceeds[ ]fixed[ ]maximum[ ]message[ ]size:/x,
|
102
|
+
# qmail-remote.c:68| Sorry, I couldn't find any host by that name. (#4.1.2)\n"); zerodie();
|
103
|
+
# qmail-remote.c:78| Sorry, I couldn't find any host named ");
|
104
|
+
'hostunknown' => %r/\ASorry[,][ ]I[ ]couldn[']t[ ]find[ ]any[ ]host[ ]/x,
|
105
|
+
'systemerror' => %r{(?>
|
106
|
+
bad[ ]interpreter:[ ]No[ ]such[ ]file[ ]or[ ]directory
|
107
|
+
|system[ ]error
|
108
|
+
|Unable[ ]to\b
|
109
|
+
)
|
110
|
+
}x,
|
111
|
+
'networkerror' => %r{Sorry(?:
|
112
|
+
[,][ ]I[ ]wasn[']t[ ]able[ ]to[ ]establish[ ]an[ ]SMTP[ ]connection
|
113
|
+
|[,][ ]I[ ]couldn[']t[ ]find[ ]a[ ]mail[ ]exchanger[ ]or[ ]IP[ ]address
|
114
|
+
|[.][ ]Although[ ]I[']m[ ]listed[ ]as[ ]a[ ]best[-]preference[ ]MX[ ]
|
115
|
+
or[ ]A[ ]for[ ]that[ ]host
|
116
|
+
)
|
117
|
+
}x,
|
118
|
+
'systemfull' => %r/Requested action not taken: mailbox unavailable [(]not enough free space[)]/,
|
119
|
+
}
|
120
|
+
# qmail-send.c:922| ... (&dline[c],"I'm not going to try again; this message has been in the queue too long.\n")) nomem();
|
121
|
+
ReDelayed = %r/this[ ]message[ ]has[ ]been[ ]in[ ]the[ ]queue[ ]too[ ]long[.]\z/x
|
122
|
+
|
123
|
+
Indicators = Sisimai::MTA.INDICATORS
|
124
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
125
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
126
|
+
|
127
|
+
def description; return 'qmail'; end
|
128
|
+
def smtpagent; return 'qmail'; end
|
129
|
+
def headerlist; return []; end
|
130
|
+
def pattern; return Re0; end
|
131
|
+
|
132
|
+
# Parse bounce messages from qmail
|
133
|
+
# @param [Hash] mhead Message header of a bounce email
|
134
|
+
# @options mhead [String] from From header
|
135
|
+
# @options mhead [String] date Date header
|
136
|
+
# @options mhead [String] subject Subject header
|
137
|
+
# @options mhead [Array] received Received headers
|
138
|
+
# @options mhead [String] others Other required headers
|
139
|
+
# @param [String] mbody Message body of a bounce email
|
140
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
141
|
+
# part or nil if it failed to parse or
|
142
|
+
# the arguments are missing
|
143
|
+
def scan(mhead, mbody)
|
144
|
+
return nil unless mhead
|
145
|
+
return nil unless mbody
|
146
|
+
|
147
|
+
# Pre process email headers and the body part of the message which generated
|
148
|
+
# by qmail, see http://cr.yp.to/qmail.html
|
149
|
+
# e.g.) Received: (qmail 12345 invoked for bounce); 29 Apr 2009 12:34:56 -0000
|
150
|
+
# Subject: failure notice
|
151
|
+
match = 0
|
152
|
+
match += 1 if mhead['subject'] =~ Re0[:subject]
|
153
|
+
match += 1 if mhead['received'].find { |a| a =~ Re0[:received] }
|
154
|
+
return nil if match == 0
|
155
|
+
|
156
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
157
|
+
hasdivided = mbody.split("\n")
|
158
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
159
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
160
|
+
previousfn = '' # (String) Previous field name
|
161
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
162
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
163
|
+
v = nil
|
164
|
+
|
165
|
+
hasdivided.each do |e|
|
166
|
+
if readcursor == 0
|
167
|
+
# Beginning of the bounce message or delivery status part
|
168
|
+
if e =~ Re1[:begin]
|
169
|
+
readcursor |= Indicators[:'deliverystatus']
|
170
|
+
next
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
175
|
+
# Beginning of the original message part
|
176
|
+
if e =~ Re1[:rfc822]
|
177
|
+
readcursor |= Indicators[:'message-rfc822']
|
178
|
+
next
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
183
|
+
# After "message/rfc822"
|
184
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
185
|
+
# Get required headers only
|
186
|
+
lhs = cv[1].downcase
|
187
|
+
previousfn = ''
|
188
|
+
next unless RFC822Head.key?(lhs)
|
189
|
+
|
190
|
+
previousfn = lhs
|
191
|
+
rfc822part += e + "\n"
|
192
|
+
|
193
|
+
elsif e =~ /\A[ \t]+/
|
194
|
+
# Continued line from the previous line
|
195
|
+
next if rfc822next[previousfn]
|
196
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
197
|
+
|
198
|
+
else
|
199
|
+
# Check the end of headers in rfc822 part
|
200
|
+
next unless LongFields.key?(previousfn)
|
201
|
+
next unless e.empty?
|
202
|
+
rfc822next[previousfn] = true
|
203
|
+
end
|
204
|
+
|
205
|
+
else
|
206
|
+
# Before "message/rfc822"
|
207
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
208
|
+
next if e.empty?
|
209
|
+
|
210
|
+
# <kijitora@example.jp>:
|
211
|
+
# 192.0.2.153 does not like recipient.
|
212
|
+
# Remote host said: 550 5.1.1 <kijitora@example.jp>... User Unknown
|
213
|
+
# Giving up on 192.0.2.153.
|
214
|
+
v = dscontents[-1]
|
215
|
+
|
216
|
+
if cv = e.match(/\A(?:To[ ]*:)?[<](.+[@].+)[>]:[ \t]*\z/)
|
217
|
+
# <kijitora@example.jp>:
|
218
|
+
if v['recipient']
|
219
|
+
# There are multiple recipient addresses in the message body.
|
220
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
221
|
+
v = dscontents[-1]
|
222
|
+
end
|
223
|
+
v['recipient'] = cv[1]
|
224
|
+
recipients += 1
|
225
|
+
|
226
|
+
elsif dscontents.size == recipients
|
227
|
+
# Append error message
|
228
|
+
next if e.empty?
|
229
|
+
v['diagnosis'] ||= ''
|
230
|
+
v['diagnosis'] += e + ' '
|
231
|
+
v['alterrors'] = e if e =~ Re1[:error]
|
232
|
+
|
233
|
+
next if v['rhost']
|
234
|
+
if cv = e.match(ReHost)
|
235
|
+
v['rhost'] = cv[1]
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
return nil if recipients == 0
|
241
|
+
|
242
|
+
require 'sisimai/string'
|
243
|
+
require 'sisimai/smtp/status'
|
244
|
+
|
245
|
+
dscontents.map do |e|
|
246
|
+
# Set default values if each value is empty.
|
247
|
+
e['agent'] = Sisimai::MTA::Qmail.smtpagent
|
248
|
+
|
249
|
+
if mhead['received'].size > 0
|
250
|
+
# Get localhost and remote host name from Received header.
|
251
|
+
r0 = mhead['received']
|
252
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
253
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
254
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
255
|
+
end
|
256
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis']) || ''
|
257
|
+
|
258
|
+
unless e['command']
|
259
|
+
# Get the SMTP command name for the session
|
260
|
+
ReSMTP.each_key do |r|
|
261
|
+
# Verify each regular expression of SMTP commands
|
262
|
+
next unless e['diagnosis'] =~ ReSMTP[r]
|
263
|
+
e['command'] = r.upcase
|
264
|
+
break
|
265
|
+
end
|
266
|
+
|
267
|
+
unless e['command']
|
268
|
+
# Verify each regular expression of patches
|
269
|
+
if cv = e['diagnosis'].match(ReCommand)
|
270
|
+
e['command'] = cv[1].upcase
|
271
|
+
end
|
272
|
+
e['command'] ||= ''
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
# Detect the reason of bounce
|
277
|
+
if e['command'] == 'MAIL'
|
278
|
+
# MAIL | Connected to 192.0.2.135 but sender was rejected.
|
279
|
+
e['reason'] = 'rejected'
|
280
|
+
|
281
|
+
elsif e['command'] =~ /\A(?:HELO|EHLO)\z/
|
282
|
+
# HELO | Connected to 192.0.2.135 but my name was rejected.
|
283
|
+
e['reason'] = 'blocked'
|
284
|
+
|
285
|
+
else
|
286
|
+
# Try to match with each error message in the table
|
287
|
+
if e['diagnosis'] =~ ReOnHold
|
288
|
+
# To decide the reason require pattern match with
|
289
|
+
# Sisimai::Reason::* modules
|
290
|
+
e['reason'] = 'onhold'
|
291
|
+
|
292
|
+
else
|
293
|
+
ReFailure.each_key do |r|
|
294
|
+
# Verify each regular expression of session errors
|
295
|
+
if e['alterrors']
|
296
|
+
# Check the value of "alterrors"
|
297
|
+
next unless e['alterrors'] =~ ReFailure[r]
|
298
|
+
e['reason'] = r
|
299
|
+
end
|
300
|
+
break if e['reason']
|
301
|
+
|
302
|
+
next unless e['diagnosis'] =~ ReFailure[r]
|
303
|
+
e['reason'] = r
|
304
|
+
break
|
305
|
+
end
|
306
|
+
|
307
|
+
unless e['reason']
|
308
|
+
ReLDAP.each_key do |r|
|
309
|
+
# Verify each regular expression of LDAP errors
|
310
|
+
next unless e['diagnosis'] =~ ReLDAP[r]
|
311
|
+
e['reason'] = r
|
312
|
+
break
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
unless e['reason']
|
317
|
+
e['reason'] = 'expired' if e['diagnosis'] =~ ReDelayed
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
323
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
324
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
325
|
+
e.each_key { |a| e[a] ||= '' }
|
326
|
+
end
|
327
|
+
|
328
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
329
|
+
end
|
330
|
+
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
@@ -0,0 +1,317 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::Sendmail parses a bounce email which created by v8 Sendmail.
|
4
|
+
# Methods in the module are called from only Sisimai::Message.
|
5
|
+
module Sendmail
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/Sendmail.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:from => %r/\AMail Delivery Subsystem/,
|
13
|
+
:subject => %r/(?:see transcript for details\z|\AWarning: )/,
|
14
|
+
}
|
15
|
+
# Error text regular expressions which defined in sendmail/savemail.c
|
16
|
+
# savemail.c:1040|if (printheader && !putline(" ----- Transcript of session follows -----\n",
|
17
|
+
# savemail.c:1041| mci))
|
18
|
+
# savemail.c:1042| goto writeerr;
|
19
|
+
#
|
20
|
+
Re1 = {
|
21
|
+
:begin => %r/\A[ \t]+[-]+ Transcript of session follows [-]+\z/,
|
22
|
+
:error => %r/\A[.]+ while talking to .+[:]\z/,
|
23
|
+
:rfc822 => %r{\AContent-Type:[ ]*(?:message/rfc822|text/rfc822-headers)\z},
|
24
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
25
|
+
}
|
26
|
+
Indicators = Sisimai::MTA.INDICATORS
|
27
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
28
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
29
|
+
|
30
|
+
def description; return 'V8Sendmail: /usr/sbin/sendmail'; end
|
31
|
+
def smtpagent; return 'Sendmail'; end
|
32
|
+
def headerlist; return []; end
|
33
|
+
def pattern; return Re0; end
|
34
|
+
|
35
|
+
# Parse bounce messages from Sendmail
|
36
|
+
# @param [Hash] mhead Message header of a bounce email
|
37
|
+
# @options mhead [String] from From header
|
38
|
+
# @options mhead [String] date Date header
|
39
|
+
# @options mhead [String] subject Subject header
|
40
|
+
# @options mhead [Array] received Received headers
|
41
|
+
# @options mhead [String] others Other required headers
|
42
|
+
# @param [String] mbody Message body of a bounce email
|
43
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
44
|
+
# part or nil if it failed to parse or
|
45
|
+
# the arguments are missing
|
46
|
+
def scan(mhead, mbody)
|
47
|
+
return nil unless mhead
|
48
|
+
return nil unless mbody
|
49
|
+
return nil unless mhead['subject'] =~ Re0[:subject]
|
50
|
+
|
51
|
+
unless mhead['subject'] =~ /\A[ \t]*Fwd?:/i
|
52
|
+
# Fwd: Returned mail: see transcript for details
|
53
|
+
# Do not execute this code if the bounce mail is a forwarded message.
|
54
|
+
return nil unless mhead['from'] =~ Re0[:from]
|
55
|
+
end
|
56
|
+
|
57
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
58
|
+
hasdivided = mbody.split("\n")
|
59
|
+
havepassed = [''];
|
60
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
61
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
62
|
+
previousfn = '' # (String) Previous field name
|
63
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
64
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
65
|
+
commandtxt = '' # (String) SMTP Command name begin with the string '>>>'
|
66
|
+
esmtpreply = '' # (String) Reply from remote server on SMTP session
|
67
|
+
sessionerr = false # (Boolean) Flag, "true" if it is SMTP session error
|
68
|
+
connvalues = 0 # (Integer) Flag, 1 if all the value of $connheader have been set
|
69
|
+
connheader = {
|
70
|
+
'date' => '', # The value of Arrival-Date header
|
71
|
+
'rhost' => '', # The value of Reporting-MTA header
|
72
|
+
}
|
73
|
+
anotherset = {} # Another error information
|
74
|
+
v = nil
|
75
|
+
|
76
|
+
hasdivided.each do |e|
|
77
|
+
# Save the current line for the next loop
|
78
|
+
havepassed << e; p = havepassed[-2]
|
79
|
+
|
80
|
+
if readcursor == 0
|
81
|
+
# Beginning of the bounce message or delivery status part
|
82
|
+
if e =~ Re1[:begin]
|
83
|
+
readcursor |= Indicators[:'deliverystatus']
|
84
|
+
next
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
89
|
+
# Beginning of the original message part
|
90
|
+
if e =~ Re1[:rfc822]
|
91
|
+
readcursor |= Indicators[:'message-rfc822']
|
92
|
+
next
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
97
|
+
# After "message/rfc822"
|
98
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
99
|
+
# Get required headers only
|
100
|
+
lhs = cv[1].downcase
|
101
|
+
previousfn = ''
|
102
|
+
next unless RFC822Head.key?(lhs)
|
103
|
+
|
104
|
+
previousfn = lhs
|
105
|
+
rfc822part += e + "\n"
|
106
|
+
|
107
|
+
elsif e =~ /\A[ \t]+/
|
108
|
+
# Continued line from the previous line
|
109
|
+
next if rfc822next[previousfn]
|
110
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
111
|
+
|
112
|
+
else
|
113
|
+
# Check the end of headers in rfc822 part
|
114
|
+
next unless LongFields.key?(previousfn)
|
115
|
+
next unless e.empty?
|
116
|
+
rfc822next[previousfn] = true
|
117
|
+
end
|
118
|
+
|
119
|
+
else
|
120
|
+
# Before "message/rfc822"
|
121
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
122
|
+
next if e.empty?
|
123
|
+
|
124
|
+
if connvalues == connheader.keys.size
|
125
|
+
# Final-Recipient: RFC822; userunknown@example.jp
|
126
|
+
# X-Actual-Recipient: RFC822; kijitora@example.co.jp
|
127
|
+
# Action: failed
|
128
|
+
# Status: 5.1.1
|
129
|
+
# Remote-MTA: DNS; mx.example.jp
|
130
|
+
# Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
|
131
|
+
# Last-Attempt-Date: Fri, 14 Feb 2014 12:30:08 -0500
|
132
|
+
v = dscontents[-1]
|
133
|
+
|
134
|
+
if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
|
135
|
+
# Final-Recipient: RFC822; userunknown@example.jp
|
136
|
+
if v['recipient']
|
137
|
+
# There are multiple recipient addresses in the message body.
|
138
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
139
|
+
v = dscontents[-1]
|
140
|
+
end
|
141
|
+
v['recipient'] = cv[1]
|
142
|
+
recipients += 1
|
143
|
+
|
144
|
+
elsif cv = e.match(/\A[Xx]-[Aa]ctual-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
|
145
|
+
# X-Actual-Recipient: RFC822; kijitora@example.co.jp
|
146
|
+
v['alias'] = cv[1]
|
147
|
+
|
148
|
+
elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
|
149
|
+
# Action: failed
|
150
|
+
v['action'] = cv[1].downcase
|
151
|
+
|
152
|
+
elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
|
153
|
+
# Status: 5.1.1
|
154
|
+
# Status:5.2.0
|
155
|
+
# Status: 5.1.0 (permanent failure)
|
156
|
+
v['status'] = cv[1]
|
157
|
+
|
158
|
+
elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
159
|
+
# Remote-MTA: DNS; mx.example.jp
|
160
|
+
v['rhost'] = cv[1].downcase
|
161
|
+
|
162
|
+
elsif cv = e.match(/\A[Ll]ast-[Aa]ttempt-[Dd]ate:[ ]*(.+)\z/)
|
163
|
+
# Last-Attempt-Date: Fri, 14 Feb 2014 12:30:08 -0500
|
164
|
+
v['date'] = cv[1]
|
165
|
+
|
166
|
+
else
|
167
|
+
if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
|
168
|
+
# Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
|
169
|
+
v['spec'] = cv[1].upcase
|
170
|
+
v['diagnosis'] = cv[2]
|
171
|
+
|
172
|
+
elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
|
173
|
+
# Continued line of the value of Diagnostic-Code header
|
174
|
+
v['diagnosis'] ||= ''
|
175
|
+
v['diagnosis'] += ' ' + cv[1]
|
176
|
+
havepassed[-1] = 'Diagnostic-Code: ' + e
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
else
|
181
|
+
# ----- Transcript of session follows -----
|
182
|
+
# ... while talking to mta.example.org.:
|
183
|
+
# >>> DATA
|
184
|
+
# <<< 550 Unknown user recipient@example.jp
|
185
|
+
# 554 5.0.0 Service unavailable
|
186
|
+
# ...
|
187
|
+
# Reporting-MTA: dns; mx.example.jp
|
188
|
+
# Received-From-MTA: DNS; x1x2x3x4.dhcp.example.ne.jp
|
189
|
+
# Arrival-Date: Wed, 29 Apr 2009 16:03:18 +0900
|
190
|
+
if cv = e.match(/\A[>]{3}[ ]+([A-Z]{4})[ ]?/)
|
191
|
+
# >>> DATA
|
192
|
+
commandtxt = cv[1]
|
193
|
+
|
194
|
+
elsif cv = e.match(/\A[<]{3}[ ]+(.+)\z/)
|
195
|
+
# <<< Response
|
196
|
+
esmtpreply = cv[1]
|
197
|
+
|
198
|
+
elsif cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
199
|
+
# Reporting-MTA: dns; mx.example.jp
|
200
|
+
next if connheader['rhost'].size > 0
|
201
|
+
connheader['rhost'] = cv[1].downcase
|
202
|
+
connvalues += 1
|
203
|
+
|
204
|
+
elsif cv = e.match(/\A[Rr]eceived-[Ff]rom-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
|
205
|
+
# Received-From-MTA: DNS; x1x2x3x4.dhcp.example.ne.jp
|
206
|
+
next if connheader['lhost']
|
207
|
+
|
208
|
+
# The value of "lhost" is optional
|
209
|
+
connheader['lhost'] = cv[1].downcase
|
210
|
+
connvalues += 1
|
211
|
+
|
212
|
+
elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
|
213
|
+
# Arrival-Date: Wed, 29 Apr 2009 16:03:18 +0900
|
214
|
+
next if connheader['date'].size > 0
|
215
|
+
connheader['date'] = cv[1]
|
216
|
+
connvalues += 1
|
217
|
+
|
218
|
+
else
|
219
|
+
# Detect SMTP session error or connection error
|
220
|
+
next if sessionerr
|
221
|
+
if e =~ Re1[:error]
|
222
|
+
# ----- Transcript of session follows -----
|
223
|
+
# ... while talking to mta.example.org.:
|
224
|
+
sessionerr = true
|
225
|
+
next
|
226
|
+
end
|
227
|
+
|
228
|
+
if cv = e.match(/\A[<](.+)[>][.]+ (.+)\z/)
|
229
|
+
# <kijitora@example.co.jp>... Deferred: Name server: example.co.jp.: host name lookup failure
|
230
|
+
anotherset['recipient'] = cv[1]
|
231
|
+
anotherset['diagnosis'] = cv[2]
|
232
|
+
|
233
|
+
else
|
234
|
+
# ----- Transcript of session follows -----
|
235
|
+
# Message could not be delivered for too long
|
236
|
+
# Message will be deleted from queue
|
237
|
+
next if e =~ /\A[ \t]*[-]+/
|
238
|
+
if cv = e.match(/\A[45]\d\d[ \t]([45][.]\d[.]\d)[ \t].+/)
|
239
|
+
# 550 5.1.2 <kijitora@example.org>... Message
|
240
|
+
#
|
241
|
+
# DBI connect('dbname=...')
|
242
|
+
# 554 5.3.0 unknown mailer error 255
|
243
|
+
anotherset['status'] = cv[1]
|
244
|
+
anotherset['diagnosis'] ||= ''
|
245
|
+
anotherset['diagnosis'] += ' ' + e
|
246
|
+
|
247
|
+
elsif e =~ /\A(?:Message|Warning:) /
|
248
|
+
# Message could not be delivered for too long
|
249
|
+
# Warning: message still undelivered after 4 hours
|
250
|
+
anotherset['diagnosis'] ||= ''
|
251
|
+
anotherset['diagnosis'] += ' ' + e
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
return nil if recipients == 0
|
260
|
+
require 'sisimai/string'
|
261
|
+
|
262
|
+
dscontents.map do |e|
|
263
|
+
# Set default values if each value is empty.
|
264
|
+
connheader.each_key { |a| e[a] ||= connheader[a] || '' }
|
265
|
+
|
266
|
+
if mhead['received'].size > 0
|
267
|
+
# Get localhost and remote host name from Received header.
|
268
|
+
r0 = mhead['received']
|
269
|
+
['lhost', 'rhost'].each { |a| e[a] ||= '' }
|
270
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
271
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
272
|
+
end
|
273
|
+
|
274
|
+
e['spec'] ||= 'SMTP'
|
275
|
+
e['agent'] = Sisimai::MTA::Sendmail.smtpagent
|
276
|
+
e['command'] ||= commandtxt
|
277
|
+
if e['command'].empty?
|
278
|
+
e['command'] = 'EHLO' if esmtpreply.size > 0
|
279
|
+
end
|
280
|
+
|
281
|
+
if anotherset['diagnosis']
|
282
|
+
# Copy alternative error message
|
283
|
+
e['diagnosis'] = anotherset['diagnosis'] if e['diagnosis'] =~ /\A[ \t]+\z/
|
284
|
+
e['diagnosis'] = anotherset['diagnosis'] unless e['diagnosis']
|
285
|
+
|
286
|
+
if e['diagnosis'] =~ /\A\d+\z/
|
287
|
+
# Override the value of diagnostic code message
|
288
|
+
e['diagnosis'] = anotherset['diagnosis']
|
289
|
+
end
|
290
|
+
end
|
291
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
292
|
+
|
293
|
+
if anotherset['status']
|
294
|
+
# Check alternative status code
|
295
|
+
if e['status'].empty? || e['status'] !~ /\A[45][.]\d[.]\d\z/
|
296
|
+
# Override alternative status code
|
297
|
+
e['status'] = anotherset['status']
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
unless e['recipient'] =~ /\A[^ ]+[@][^ ]+\z/
|
302
|
+
# @example.jp, no local part
|
303
|
+
if cv = e['diagnosis'].match(/[<]([^ ]+[@][^ ]+)[>]/)
|
304
|
+
# Get email address from the value of Diagnostic-Code header
|
305
|
+
e['recipient'] = cv[1]
|
306
|
+
end
|
307
|
+
end
|
308
|
+
e.each_key { |a| e[a] ||= '' }
|
309
|
+
end
|
310
|
+
|
311
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
312
|
+
end
|
313
|
+
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|