sisimai 4.16.0-java
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 +182 -0
- data/.travis.yml +18 -0
- data/ANALYTICAL-PRECISION +56 -0
- data/Changes +36 -0
- data/Developers.mk +129 -0
- data/Gemfile +15 -0
- data/LICENSE +25 -0
- data/Makefile +70 -0
- data/README.md +361 -0
- data/Rakefile +12 -0
- data/Repository.mk +69 -0
- data/appveyor.yml +23 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/sisimai.rb +95 -0
- data/lib/sisimai/address.rb +224 -0
- data/lib/sisimai/arf.rb +338 -0
- data/lib/sisimai/data.rb +409 -0
- data/lib/sisimai/data/json.rb +40 -0
- data/lib/sisimai/data/yaml.rb +32 -0
- data/lib/sisimai/datetime.rb +511 -0
- data/lib/sisimai/mail.rb +82 -0
- data/lib/sisimai/mail/maildir.rb +82 -0
- data/lib/sisimai/mail/mbox.rb +69 -0
- data/lib/sisimai/mail/stdin.rb +53 -0
- data/lib/sisimai/mda.rb +152 -0
- data/lib/sisimai/message.rb +525 -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/amazonworkmail.rb +224 -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/office365.rb +273 -0
- data/lib/sisimai/msp/us/outlook.rb +242 -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 +54 -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 +220 -0
- data/lib/sisimai/reason.rb +234 -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 +79 -0
- data/lib/sisimai/reason/mailboxfull.rb +118 -0
- data/lib/sisimai/reason/mailererror.rb +55 -0
- data/lib/sisimai/reason/mesgtoobig.rb +82 -0
- data/lib/sisimai/reason/networkerror.rb +58 -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 +84 -0
- data/lib/sisimai/smtp/status.rb +758 -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/rfc3464-28.eml +122 -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/sendmail-38.eml +167 -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-amazonworkmail-01.eml +156 -0
- data/set-of-emails/maildir/bsd/us-amazonworkmail-02.eml +160 -0
- data/set-of-emails/maildir/bsd/us-amazonworkmail-03.eml +161 -0
- data/set-of-emails/maildir/bsd/us-amazonworkmail-04.eml +156 -0
- data/set-of-emails/maildir/bsd/us-amazonworkmail-05.eml +157 -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-office365-01.eml +102 -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-java.gemspec +29 -0
- data/sisimai.gemspec +28 -0
- metadata +680 -0
@@ -0,0 +1,193 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::SurfControl parses a bounce email which created by WebSense
|
4
|
+
# SurfControl. Methods in the module are called from only Sisimai::Message.
|
5
|
+
module SurfControl
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/SurfControl.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:'from' => %r/ [(]Mail Delivery System[)]\z/,
|
13
|
+
:'x-mailer' => %r/\ASurfControl E-mail Filter\z/,
|
14
|
+
}
|
15
|
+
Re1 = {
|
16
|
+
:begin => %r/\AYour message could not be sent[.]\z/,
|
17
|
+
:error => %r/\AFailed to send to identified host,\z/,
|
18
|
+
:rfc822 => %r|\AContent-Type: message/rfc822\z|,
|
19
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
20
|
+
}
|
21
|
+
Indicators = Sisimai::MTA.INDICATORS
|
22
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
23
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
24
|
+
|
25
|
+
def description; return 'WebSense SurfControl'; end
|
26
|
+
def smtpagent; return 'SurfControl'; end
|
27
|
+
# X-SEF-ZeroHour-RefID: fgs=000000000
|
28
|
+
# X-SEF-Processed: 0_0_0_000__2010_04_29_23_34_45
|
29
|
+
# X-Mailer: SurfControl E-mail Filter
|
30
|
+
def headerlist; return ['X-SEF-Processed', 'X-Mailer']; end
|
31
|
+
def pattern; return Re0; end
|
32
|
+
|
33
|
+
# Parse bounce messages from SurfControl
|
34
|
+
# @param [Hash] mhead Message header of a bounce email
|
35
|
+
# @options mhead [String] from From header
|
36
|
+
# @options mhead [String] date Date header
|
37
|
+
# @options mhead [String] subject Subject header
|
38
|
+
# @options mhead [Array] received Received headers
|
39
|
+
# @options mhead [String] others Other required headers
|
40
|
+
# @param [String] mbody Message body of a bounce email
|
41
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
42
|
+
# part or nil if it failed to parse or
|
43
|
+
# the arguments are missing
|
44
|
+
def scan(mhead, mbody)
|
45
|
+
return nil unless mhead
|
46
|
+
return nil unless mbody
|
47
|
+
return nil unless mhead['x-sef-processed']
|
48
|
+
return nil unless mhead['x-mailer']
|
49
|
+
return nil unless mhead['x-mailer'] =~ Re0[:'x-mailer']
|
50
|
+
|
51
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
52
|
+
hasdivided = mbody.split("\n")
|
53
|
+
havepassed = [''];
|
54
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
55
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
56
|
+
previousfn = '' # (String) Previous field name
|
57
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
58
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
59
|
+
v = nil
|
60
|
+
|
61
|
+
hasdivided.each do |e|
|
62
|
+
# Save the current line for the next loop
|
63
|
+
havepassed << e; p = havepassed[-2]
|
64
|
+
|
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
|
+
# Your message could not be sent.
|
110
|
+
# A transcript of the attempts to send the message follows.
|
111
|
+
# The number of attempts made: 1
|
112
|
+
# Addressed To: kijitora@example.com
|
113
|
+
#
|
114
|
+
# Thu 29 Apr 2010 23:34:45 +0900
|
115
|
+
# Failed to send to identified host,
|
116
|
+
# kijitora@example.com: [192.0.2.5], 550 kijitora@example.com... No such user
|
117
|
+
# --- Message non-deliverable.
|
118
|
+
v = dscontents[-1]
|
119
|
+
|
120
|
+
if cv = e.match(/\AAddressed To:[ ]*([^ ]+?[@][^ ]+?)\z/)
|
121
|
+
# Addressed To: kijitora@example.com
|
122
|
+
if v['recipient']
|
123
|
+
# There are multiple recipient addresses in the message body.
|
124
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
125
|
+
v = dscontents[-1]
|
126
|
+
end
|
127
|
+
v['recipient'] = cv[1]
|
128
|
+
recipients += 1
|
129
|
+
|
130
|
+
elsif e =~ /\A(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[ ,]/
|
131
|
+
# Thu 29 Apr 2010 23:34:45 +0900
|
132
|
+
v['date'] = e
|
133
|
+
|
134
|
+
elsif cv = e.match(/\A[^ ]+[@][^ ]+:[ ]*\[(\d+[.]\d+[.]\d+[.]\d)\],[ ]*(.+)\z/)
|
135
|
+
# kijitora@example.com: [192.0.2.5], 550 kijitora@example.com... No such user
|
136
|
+
v['rhost'] = cv[1]
|
137
|
+
v['diagnosis'] = cv[2]
|
138
|
+
|
139
|
+
else
|
140
|
+
# Fallback, parse RFC3464 headers.
|
141
|
+
if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
|
142
|
+
# Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
|
143
|
+
v['spec'] = cv[1].upcase
|
144
|
+
v['diagnosis'] = cv[2]
|
145
|
+
|
146
|
+
elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ ]+(.+)\z/)
|
147
|
+
# Continued line of the value of Diagnostic-Code header
|
148
|
+
v['diagnosis'] ||= ''
|
149
|
+
v['diagnosis'] += ' ' + cv[1]
|
150
|
+
havepassed[-1] = 'Diagnostic-Code: ' + e
|
151
|
+
|
152
|
+
elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
|
153
|
+
# Action: failed
|
154
|
+
v['action'] = cv[1].downcase
|
155
|
+
|
156
|
+
elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
|
157
|
+
# Status: 5.0.-
|
158
|
+
v['status'] = cv[1]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
return nil if recipients == 0
|
165
|
+
require 'sisimai/string'
|
166
|
+
require 'sisimai/smtp/status'
|
167
|
+
|
168
|
+
dscontents.map do |e|
|
169
|
+
e['agent'] = Sisimai::MTA::SurfControl.smtpagent
|
170
|
+
|
171
|
+
if mhead['received'].size > 0
|
172
|
+
# Get localhost and remote host name from Received header.
|
173
|
+
r0 = mhead['received']
|
174
|
+
%w|lhost rhost|.each { |a| e[a] ||= '' }
|
175
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
176
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
177
|
+
end
|
178
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
179
|
+
|
180
|
+
e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
|
181
|
+
e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
|
182
|
+
e['action'] = 'failed' if e['status'] =~ /\A[45]/
|
183
|
+
e.each_key { |a| e[a] ||= '' }
|
184
|
+
end
|
185
|
+
|
186
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::UserDefined is an example module as a template to implement
|
4
|
+
# your custom MTA module.
|
5
|
+
module UserDefined
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/UserDefined.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
# Re0 is a regular expression to match with message headers which are
|
12
|
+
# given as the first argument of scan() method.
|
13
|
+
Re0 = {
|
14
|
+
:from => %r/\AMail Sysmet/,
|
15
|
+
:subject => %r/\AError Mail Report/,
|
16
|
+
}
|
17
|
+
|
18
|
+
# Re1 is delimiter set of these sections:
|
19
|
+
# begin: The first line of a bounce message to be parsed.
|
20
|
+
# error: The first line of an error message to get an error reason, recipient
|
21
|
+
# addresses, or other bounce information.
|
22
|
+
# rfc822: The first line of the original message.
|
23
|
+
# endof: Fixed string ``__END_OF_EMAIL_MESSAGE__''
|
24
|
+
Re1 = {
|
25
|
+
:begin => %r/\A[ \t]+[-]+ Transcript of session follows [-]+\z/,
|
26
|
+
:error => %r/\A[.]+ while talking to .+[:]\z/,
|
27
|
+
:rfc822 => %r{\AContent-Type:[ ]*(?:message/rfc822|text/rfc822-headers)\z},
|
28
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
29
|
+
}
|
30
|
+
Indicators = Sisimai::MTA.INDICATORS
|
31
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
32
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
33
|
+
|
34
|
+
def description; return 'Module description'; end
|
35
|
+
def smtpagent; return 'Module name'; end
|
36
|
+
def headerlist; return ['X-Some-UserDefined-Header']; end
|
37
|
+
def pattern; return Re0; end
|
38
|
+
|
39
|
+
# @abstract Template for User-Defined MTA module
|
40
|
+
# @param [Hash] mhead Message header of a bounce email
|
41
|
+
# @options mhead [String] from From header
|
42
|
+
# @options mhead [String] date Date header
|
43
|
+
# @options mhead [String] subject Subject header
|
44
|
+
# @options mhead [Array] received Received headers
|
45
|
+
# @options mhead [String] others Other required headers
|
46
|
+
# @param [String] mbody Message body of a bounce email
|
47
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
48
|
+
# part or nil if it failed to parse or
|
49
|
+
# the arguments are missing
|
50
|
+
def scan(mhead, mbody)
|
51
|
+
return nil unless mhead
|
52
|
+
return nil unless mbody
|
53
|
+
|
54
|
+
match = 0
|
55
|
+
# 1. Check some value in mhead using regular expression or "==" operator
|
56
|
+
# whether the bounce message should be parsed by this module or not.
|
57
|
+
# - Matched 1 or more values: Proceed to the step 2.
|
58
|
+
# - Did not matched: return nil
|
59
|
+
#
|
60
|
+
match += 1 if mhead['subject'] =~ Re0[:subject]
|
61
|
+
match += 1 if mhead['from'] =~ Re0[:from]
|
62
|
+
match += 1 if mhead['x-some-userdefined-header']
|
63
|
+
return nil if match == 0
|
64
|
+
|
65
|
+
# 2. Parse message body(mbody) of the bounce message. See some modules
|
66
|
+
# in lib/sisimai/mta or lib/sisimai/msp directory to implement codes.
|
67
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
68
|
+
hasdivided = mbody.split("\n")
|
69
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
70
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
71
|
+
previousfn = '' # (String) Previous field name
|
72
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
73
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
74
|
+
|
75
|
+
hasdivided.each do |e|
|
76
|
+
if readcursor == 0
|
77
|
+
# Beginning of the bounce message or delivery status part
|
78
|
+
if e =~ Re1[:begin]
|
79
|
+
readcursor |= Indicators[:'deliverystatus']
|
80
|
+
next
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if readcursor & Indicators[:'message-rfc822'] == 0
|
85
|
+
# Beginning of the original message part
|
86
|
+
if e =~ Re1[:rfc822]
|
87
|
+
readcursor |= Indicators[:'message-rfc822']
|
88
|
+
next
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
if readcursor & Indicators[:'message-rfc822'] > 0
|
93
|
+
# After "message/rfc822"
|
94
|
+
if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
|
95
|
+
# Get required headers only
|
96
|
+
lhs = cv[1].downcase
|
97
|
+
previousfn = ''
|
98
|
+
next unless RFC822Head.key?(lhs)
|
99
|
+
|
100
|
+
previousfn = lhs
|
101
|
+
rfc822part += e + "\n"
|
102
|
+
|
103
|
+
elsif e =~ /\A[ \t]+/
|
104
|
+
# Continued line from the previous line
|
105
|
+
next if rfc822next[previousfn]
|
106
|
+
rfc822part += e + "\n" if LongFields.key?(previousfn)
|
107
|
+
|
108
|
+
else
|
109
|
+
# Check the end of headers in rfc822 part
|
110
|
+
next unless LongFields.key?(previousfn)
|
111
|
+
next unless e.empty?
|
112
|
+
rfc822next[previousfn] = true
|
113
|
+
end
|
114
|
+
|
115
|
+
else
|
116
|
+
# Before "message/rfc822"
|
117
|
+
next if readcursor & Indicators[:'deliverystatus'] == 0
|
118
|
+
next if e.empty?
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# The following code is dummy to be passed "make test".
|
124
|
+
dscontents[0]['recipient'] = 'kijitora@example.jp'
|
125
|
+
dscontents[0]['diagnosis'] = '550 something wrong'
|
126
|
+
dscontents[0]['status'] = '5.1.1'
|
127
|
+
dscontents[0]['spec'] = 'SMTP'
|
128
|
+
dscontents[0]['date'] = 'Thu 29 Apr 2010 23:34:45 +0900'
|
129
|
+
dscontents[0]['agent'] = Sisimai::MTA::UserDefined.smtpagent
|
130
|
+
recipients = 1 if dscontents[0]['recipient']
|
131
|
+
|
132
|
+
rfc822part += 'From: shironeko@example.org' + "\n"
|
133
|
+
rfc822part += 'Subject: Nyaaan' + "\n"
|
134
|
+
rfc822part += 'Message-Id: 000000000000@example.jp' + "\n"
|
135
|
+
|
136
|
+
# 3. Return undef when there is no recipient address which is failed to
|
137
|
+
# delivery in the bounce message
|
138
|
+
return nil if recipients == 0
|
139
|
+
|
140
|
+
# 4. Return the following variable.
|
141
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
@@ -0,0 +1,232 @@
|
|
1
|
+
module Sisimai
|
2
|
+
module MTA
|
3
|
+
# Sisimai::MTA::V5sendmail parses a bounce email which created by Sendmail
|
4
|
+
# version 5. Methods in the module are called from only Sisimai::Message.
|
5
|
+
module V5sendmail
|
6
|
+
# Imported from p5-Sisimail/lib/Sisimai/MTA/V5sendmail.pm
|
7
|
+
class << self
|
8
|
+
require 'sisimai/mta'
|
9
|
+
require 'sisimai/rfc5322'
|
10
|
+
|
11
|
+
Re0 = {
|
12
|
+
:from => %r/\AMail Delivery Subsystem/,
|
13
|
+
:subject => %r/\AReturned mail: [A-Z]/,
|
14
|
+
}
|
15
|
+
# Error text regular expressions which defined in src/savemail.c
|
16
|
+
# savemail.c:485| (void) fflush(stdout);
|
17
|
+
# savemail.c:486| p = queuename(e->e_parent, 'x');
|
18
|
+
# savemail.c:487| if ((xfile = fopen(p, "r")) == NULL)
|
19
|
+
# savemail.c:488| {
|
20
|
+
# savemail.c:489| syserr("Cannot open %s", p);
|
21
|
+
# savemail.c:490| fprintf(fp, " ----- Transcript of session is unavailable -----\n");
|
22
|
+
# savemail.c:491| }
|
23
|
+
# savemail.c:492| else
|
24
|
+
# savemail.c:493| {
|
25
|
+
# savemail.c:494| fprintf(fp, " ----- Transcript of session follows -----\n");
|
26
|
+
# savemail.c:495| if (e->e_xfp != NULL)
|
27
|
+
# savemail.c:496| (void) fflush(e->e_xfp);
|
28
|
+
# savemail.c:497| while (fgets(buf, sizeof buf, xfile) != NULL)
|
29
|
+
# savemail.c:498| putline(buf, fp, m);
|
30
|
+
# savemail.c:499| (void) fclose(xfile);
|
31
|
+
Re1 = {
|
32
|
+
:begin => %r/\A[ \t]+[-]+ Transcript of session follows [-]+\z/,
|
33
|
+
:error => %r/\A[.]+ while talking to .+[:]\z/,
|
34
|
+
:rfc822 => %r{\A[ \t]+-----[ ](?:
|
35
|
+
Unsent[ ]message[ ]follows
|
36
|
+
|No[ ]message[ ]was[ ]collected
|
37
|
+
)[ ]-----
|
38
|
+
}x,
|
39
|
+
:endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
|
40
|
+
}
|
41
|
+
Indicators = Sisimai::MTA.INDICATORS
|
42
|
+
LongFields = Sisimai::RFC5322.LONGFIELDS
|
43
|
+
RFC822Head = Sisimai::RFC5322.HEADERFIELDS
|
44
|
+
|
45
|
+
def description; return 'Sendmail version 5'; end
|
46
|
+
def smtpagent; return 'V5sendmail'; end
|
47
|
+
def headerlist; return []; end
|
48
|
+
def pattern; return Re0; end
|
49
|
+
|
50
|
+
# Parse bounce messages from Sendmail version 5
|
51
|
+
# @param [Hash] mhead Message header of a bounce email
|
52
|
+
# @options mhead [String] from From header
|
53
|
+
# @options mhead [String] date Date header
|
54
|
+
# @options mhead [String] subject Subject header
|
55
|
+
# @options mhead [Array] received Received headers
|
56
|
+
# @options mhead [String] others Other required headers
|
57
|
+
# @param [String] mbody Message body of a bounce email
|
58
|
+
# @return [Hash, Nil] Bounce data list and message/rfc822
|
59
|
+
# part or nil if it failed to parse or
|
60
|
+
# the arguments are missing
|
61
|
+
def scan(mhead, mbody)
|
62
|
+
return nil unless mhead
|
63
|
+
return nil unless mbody
|
64
|
+
return nil unless mhead['subject'] =~ Re0[:subject]
|
65
|
+
|
66
|
+
dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
|
67
|
+
hasdivided = mbody.split("\n")
|
68
|
+
rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
|
69
|
+
rfc822part = '' # (String) message/rfc822-headers part
|
70
|
+
previousfn = '' # (String) Previous field name
|
71
|
+
readcursor = 0 # (Integer) Points the current cursor position
|
72
|
+
recipients = 0 # (Integer) The number of 'Final-Recipient' header
|
73
|
+
responding = [] # (Array) Responses from remote server
|
74
|
+
commandset = [] # (Array) SMTP command which is sent to remote server
|
75
|
+
anotherset = {} # (Hash) Another error information
|
76
|
+
errorindex = -1 # (Integer)
|
77
|
+
v = nil
|
78
|
+
|
79
|
+
hasdivided.each do |e|
|
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
|
+
# ----- Transcript of session follows -----
|
125
|
+
# While talking to smtp.example.com:
|
126
|
+
# >>> RCPT To:<kijitora@example.org>
|
127
|
+
# <<< 550 <kijitora@example.org>, User Unknown
|
128
|
+
# 550 <kijitora@example.org>... User unknown
|
129
|
+
# 421 example.org (smtp)... Deferred: Connection timed out during user open with example.org
|
130
|
+
v = dscontents[-1]
|
131
|
+
|
132
|
+
if cv = e.match(/\A\d{3}[ ]+[<]([^ ]+[@][^ ]+)[>][.]{3}[ ]*(.+)\z/)
|
133
|
+
# 550 <kijitora@example.org>... User unknown
|
134
|
+
if v['recipient']
|
135
|
+
# There are multiple recipient addresses in the message body.
|
136
|
+
dscontents << Sisimai::MTA.DELIVERYSTATUS
|
137
|
+
v = dscontents[-1]
|
138
|
+
end
|
139
|
+
v['recipient'] = cv[1]
|
140
|
+
v['diagnosis'] = cv[2]
|
141
|
+
|
142
|
+
if responding[recipients]
|
143
|
+
# Concatenate the response of the server and error message
|
144
|
+
v['diagnosis'] ||= ''
|
145
|
+
v['diagnosis'] += ': ' + responding[recipients]
|
146
|
+
end
|
147
|
+
recipients += 1
|
148
|
+
|
149
|
+
elsif cv = e.match(/\A[>]{3}[ ]*([A-Z]{4})[ ]*/)
|
150
|
+
# >>> RCPT To:<kijitora@example.org>
|
151
|
+
commandset[recipients] = cv[1]
|
152
|
+
|
153
|
+
elsif cv = e.match(/\A[<]{3}[ ]+(.+)\z/)
|
154
|
+
# <<< Response
|
155
|
+
# <<< 501 <shironeko@example.co.jp>... no access from mail server [192.0.2.55] which is an open relay.
|
156
|
+
# <<< 550 Requested User Mailbox not found. No such user here.
|
157
|
+
responding[recipients] = cv[1]
|
158
|
+
|
159
|
+
else
|
160
|
+
# Detect SMTP session error or connection error
|
161
|
+
next if v['sessionerr']
|
162
|
+
|
163
|
+
if e =~ Re1[:error]
|
164
|
+
# ----- Transcript of session follows -----
|
165
|
+
# ... while talking to mta.example.org.:
|
166
|
+
v['sessionerr'] = true
|
167
|
+
next
|
168
|
+
end
|
169
|
+
|
170
|
+
if cv = e.match(/\A\d{3}[ ]+.+[.]{3}[ \t]*(.+)\z/)
|
171
|
+
# 421 example.org (smtp)... Deferred: Connection timed out during user open with example.org
|
172
|
+
anotherset['diagnosis'] = cv[1]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
return nil if readcursor & Indicators[:'message-rfc822'] == 0
|
178
|
+
|
179
|
+
if recipients == 0
|
180
|
+
# Get the recipient address from the original message
|
181
|
+
if cv = rfc822part.match(/^To: (.+)$/m)
|
182
|
+
# The value of To: header in the original message
|
183
|
+
dscontents[0]['recipient'] = Sisimai::Address.s3s4(cv[1])
|
184
|
+
recipients = 1
|
185
|
+
end
|
186
|
+
end
|
187
|
+
return nil if recipients == 0
|
188
|
+
require 'sisimai/string'
|
189
|
+
|
190
|
+
dscontents.map do |e|
|
191
|
+
errorindex += 1
|
192
|
+
|
193
|
+
if mhead['received'].size > 0
|
194
|
+
# Get localhost and remote host name from Received header.
|
195
|
+
r0 = mhead['received']
|
196
|
+
%w|lhost rhost|.each { |a| e[a] ||= '' }
|
197
|
+
e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
|
198
|
+
e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
|
199
|
+
end
|
200
|
+
e['spec'] ||= 'SMTP'
|
201
|
+
e['agent'] = Sisimai::MTA::V5sendmail.smtpagent
|
202
|
+
e['command'] = commandset[errorindex] || ''
|
203
|
+
|
204
|
+
if anotherset['diagnosis'] && anotherset['diagnosis'].size > 0
|
205
|
+
# Copy alternative error message
|
206
|
+
e['diagnosis'] ||= anotherset['diagnosis']
|
207
|
+
|
208
|
+
else
|
209
|
+
# Set server response as a error message
|
210
|
+
e['diagnosis'] ||= responding[errorindex]
|
211
|
+
end
|
212
|
+
e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
|
213
|
+
|
214
|
+
unless e['recipient'] =~ /\A[^ ]+[@][^ ]+\z/
|
215
|
+
# @example.jp, no local part
|
216
|
+
if cv = e['diagnosis'].match(/[<]([^ ]+[@][^ ]+)[>]/)
|
217
|
+
# Get email address from the value of Diagnostic-Code header
|
218
|
+
e['recipient'] = cv[1]
|
219
|
+
end
|
220
|
+
end
|
221
|
+
e.delete('sessionerr')
|
222
|
+
e.each_key { |a| e[a] ||= '' }
|
223
|
+
end
|
224
|
+
|
225
|
+
return { 'ds' => dscontents, 'rfc822' => rfc822part }
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|