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.

Files changed (574) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +182 -0
  5. data/.travis.yml +18 -0
  6. data/ANALYTICAL-PRECISION +56 -0
  7. data/Changes +36 -0
  8. data/Developers.mk +129 -0
  9. data/Gemfile +15 -0
  10. data/LICENSE +25 -0
  11. data/Makefile +70 -0
  12. data/README.md +361 -0
  13. data/Rakefile +12 -0
  14. data/Repository.mk +69 -0
  15. data/appveyor.yml +23 -0
  16. data/bin/console +14 -0
  17. data/bin/setup +7 -0
  18. data/lib/sisimai.rb +95 -0
  19. data/lib/sisimai/address.rb +224 -0
  20. data/lib/sisimai/arf.rb +338 -0
  21. data/lib/sisimai/data.rb +409 -0
  22. data/lib/sisimai/data/json.rb +40 -0
  23. data/lib/sisimai/data/yaml.rb +32 -0
  24. data/lib/sisimai/datetime.rb +511 -0
  25. data/lib/sisimai/mail.rb +82 -0
  26. data/lib/sisimai/mail/maildir.rb +82 -0
  27. data/lib/sisimai/mail/mbox.rb +69 -0
  28. data/lib/sisimai/mail/stdin.rb +53 -0
  29. data/lib/sisimai/mda.rb +152 -0
  30. data/lib/sisimai/message.rb +525 -0
  31. data/lib/sisimai/mime.rb +127 -0
  32. data/lib/sisimai/msp.rb +54 -0
  33. data/lib/sisimai/msp/de/einsundeins.rb +174 -0
  34. data/lib/sisimai/msp/de/gmx.rb +197 -0
  35. data/lib/sisimai/msp/jp/biglobe.rb +179 -0
  36. data/lib/sisimai/msp/jp/ezweb.rb +292 -0
  37. data/lib/sisimai/msp/jp/kddi.rb +195 -0
  38. data/lib/sisimai/msp/ru/mailru.rb +306 -0
  39. data/lib/sisimai/msp/ru/yandex.rb +241 -0
  40. data/lib/sisimai/msp/uk/messagelabs.rb +250 -0
  41. data/lib/sisimai/msp/us/amazonses.rb +248 -0
  42. data/lib/sisimai/msp/us/amazonworkmail.rb +224 -0
  43. data/lib/sisimai/msp/us/aol.rb +234 -0
  44. data/lib/sisimai/msp/us/bigfoot.rb +243 -0
  45. data/lib/sisimai/msp/us/facebook.rb +306 -0
  46. data/lib/sisimai/msp/us/google.rb +357 -0
  47. data/lib/sisimai/msp/us/office365.rb +273 -0
  48. data/lib/sisimai/msp/us/outlook.rb +242 -0
  49. data/lib/sisimai/msp/us/receivingses.rb +247 -0
  50. data/lib/sisimai/msp/us/sendgrid.rb +257 -0
  51. data/lib/sisimai/msp/us/verizon.rb +311 -0
  52. data/lib/sisimai/msp/us/yahoo.rb +178 -0
  53. data/lib/sisimai/msp/us/zoho.rb +198 -0
  54. data/lib/sisimai/mta.rb +54 -0
  55. data/lib/sisimai/mta/activehunter.rb +155 -0
  56. data/lib/sisimai/mta/apachejames.rb +194 -0
  57. data/lib/sisimai/mta/courier.rb +307 -0
  58. data/lib/sisimai/mta/domino.rb +209 -0
  59. data/lib/sisimai/mta/exchange.rb +314 -0
  60. data/lib/sisimai/mta/exim.rb +549 -0
  61. data/lib/sisimai/mta/imailserver.rb +227 -0
  62. data/lib/sisimai/mta/interscanmss.rb +167 -0
  63. data/lib/sisimai/mta/mailfoundry.rb +173 -0
  64. data/lib/sisimai/mta/mailmarshalsmtp.rb +206 -0
  65. data/lib/sisimai/mta/mcafee.rb +201 -0
  66. data/lib/sisimai/mta/messagingserver.rb +241 -0
  67. data/lib/sisimai/mta/mfilter.rb +190 -0
  68. data/lib/sisimai/mta/mxlogic.rb +283 -0
  69. data/lib/sisimai/mta/notes.rb +206 -0
  70. data/lib/sisimai/mta/opensmtpd.rb +225 -0
  71. data/lib/sisimai/mta/postfix.rb +306 -0
  72. data/lib/sisimai/mta/qmail.rb +335 -0
  73. data/lib/sisimai/mta/sendmail.rb +317 -0
  74. data/lib/sisimai/mta/surfcontrol.rb +193 -0
  75. data/lib/sisimai/mta/userdefined.rb +148 -0
  76. data/lib/sisimai/mta/v5sendmail.rb +232 -0
  77. data/lib/sisimai/mta/x1.rb +156 -0
  78. data/lib/sisimai/mta/x2.rb +157 -0
  79. data/lib/sisimai/mta/x3.rb +171 -0
  80. data/lib/sisimai/mta/x4.rb +365 -0
  81. data/lib/sisimai/mta/x5.rb +208 -0
  82. data/lib/sisimai/order.rb +220 -0
  83. data/lib/sisimai/reason.rb +234 -0
  84. data/lib/sisimai/reason/blocked.rb +105 -0
  85. data/lib/sisimai/reason/contenterror.rb +53 -0
  86. data/lib/sisimai/reason/exceedlimit.rb +60 -0
  87. data/lib/sisimai/reason/expired.rb +53 -0
  88. data/lib/sisimai/reason/filtered.rb +98 -0
  89. data/lib/sisimai/reason/hasmoved.rb +45 -0
  90. data/lib/sisimai/reason/hostunknown.rb +79 -0
  91. data/lib/sisimai/reason/mailboxfull.rb +118 -0
  92. data/lib/sisimai/reason/mailererror.rb +55 -0
  93. data/lib/sisimai/reason/mesgtoobig.rb +82 -0
  94. data/lib/sisimai/reason/networkerror.rb +58 -0
  95. data/lib/sisimai/reason/norelaying.rb +71 -0
  96. data/lib/sisimai/reason/notaccept.rb +63 -0
  97. data/lib/sisimai/reason/onhold.rb +45 -0
  98. data/lib/sisimai/reason/rejected.rb +101 -0
  99. data/lib/sisimai/reason/securityerror.rb +72 -0
  100. data/lib/sisimai/reason/spamdetected.rb +172 -0
  101. data/lib/sisimai/reason/suspend.rb +58 -0
  102. data/lib/sisimai/reason/systemerror.rb +69 -0
  103. data/lib/sisimai/reason/systemfull.rb +45 -0
  104. data/lib/sisimai/reason/toomanyconn.rb +73 -0
  105. data/lib/sisimai/reason/userunknown.rb +194 -0
  106. data/lib/sisimai/rfc2606.rb +24 -0
  107. data/lib/sisimai/rfc3464.rb +497 -0
  108. data/lib/sisimai/rfc3834.rb +150 -0
  109. data/lib/sisimai/rfc5322.rb +204 -0
  110. data/lib/sisimai/rhost.rb +47 -0
  111. data/lib/sisimai/rhost/googleapps.rb +237 -0
  112. data/lib/sisimai/smtp.rb +58 -0
  113. data/lib/sisimai/smtp/reply.rb +84 -0
  114. data/lib/sisimai/smtp/status.rb +758 -0
  115. data/lib/sisimai/string.rb +65 -0
  116. data/lib/sisimai/time.rb +11 -0
  117. data/lib/sisimai/version.rb +4 -0
  118. data/set-of-emails/README.md +35 -0
  119. data/set-of-emails/mailbox/mbox-0 +2467 -0
  120. data/set-of-emails/mailbox/mbox-1 +71 -0
  121. data/set-of-emails/maildir/bsd/README.md +261 -0
  122. data/set-of-emails/maildir/bsd/activehunter-01.eml +54 -0
  123. data/set-of-emails/maildir/bsd/activehunter-02.eml +53 -0
  124. data/set-of-emails/maildir/bsd/apachejames-01.eml +46 -0
  125. data/set-of-emails/maildir/bsd/arf-01.eml +66 -0
  126. data/set-of-emails/maildir/bsd/arf-02.eml +68 -0
  127. data/set-of-emails/maildir/bsd/arf-03.eml +56 -0
  128. data/set-of-emails/maildir/bsd/arf-04.eml +89 -0
  129. data/set-of-emails/maildir/bsd/arf-05.eml +82 -0
  130. data/set-of-emails/maildir/bsd/arf-06.eml +166 -0
  131. data/set-of-emails/maildir/bsd/arf-07.eml +59 -0
  132. data/set-of-emails/maildir/bsd/arf-08.eml +103 -0
  133. data/set-of-emails/maildir/bsd/arf-09.eml +104 -0
  134. data/set-of-emails/maildir/bsd/arf-10.eml +56 -0
  135. data/set-of-emails/maildir/bsd/arf-11.eml +37 -0
  136. data/set-of-emails/maildir/bsd/arf-12.eml +40 -0
  137. data/set-of-emails/maildir/bsd/arf-13.eml +76 -0
  138. data/set-of-emails/maildir/bsd/arf-14.eml +333 -0
  139. data/set-of-emails/maildir/bsd/arf-15.eml +66 -0
  140. data/set-of-emails/maildir/bsd/courier-01.eml +79 -0
  141. data/set-of-emails/maildir/bsd/courier-02.eml +83 -0
  142. data/set-of-emails/maildir/bsd/courier-03.eml +85 -0
  143. data/set-of-emails/maildir/bsd/courier-04.eml +87 -0
  144. data/set-of-emails/maildir/bsd/de-einsundeins-01.eml +38 -0
  145. data/set-of-emails/maildir/bsd/de-gmx-01.eml +52 -0
  146. data/set-of-emails/maildir/bsd/de-gmx-02.eml +51 -0
  147. data/set-of-emails/maildir/bsd/de-gmx-03.eml +56 -0
  148. data/set-of-emails/maildir/bsd/de-gmx-04.eml +51 -0
  149. data/set-of-emails/maildir/bsd/domino-01.eml +33 -0
  150. data/set-of-emails/maildir/bsd/domino-02.eml +83 -0
  151. data/set-of-emails/maildir/bsd/exchange-01.eml +31 -0
  152. data/set-of-emails/maildir/bsd/exchange-02.eml +67 -0
  153. data/set-of-emails/maildir/bsd/exchange-03.eml +52 -0
  154. data/set-of-emails/maildir/bsd/exchange-04.eml +28 -0
  155. data/set-of-emails/maildir/bsd/exchange-05.eml +56 -0
  156. data/set-of-emails/maildir/bsd/exchange-06.eml +151 -0
  157. data/set-of-emails/maildir/bsd/exim-01.eml +46 -0
  158. data/set-of-emails/maildir/bsd/exim-02.eml +41 -0
  159. data/set-of-emails/maildir/bsd/exim-03.eml +42 -0
  160. data/set-of-emails/maildir/bsd/exim-04.eml +46 -0
  161. data/set-of-emails/maildir/bsd/exim-05.eml +49 -0
  162. data/set-of-emails/maildir/bsd/exim-06.eml +44 -0
  163. data/set-of-emails/maildir/bsd/exim-07.eml +28 -0
  164. data/set-of-emails/maildir/bsd/exim-08.eml +42 -0
  165. data/set-of-emails/maildir/bsd/exim-09.eml +169 -0
  166. data/set-of-emails/maildir/bsd/exim-10.eml +718 -0
  167. data/set-of-emails/maildir/bsd/exim-11.eml +718 -0
  168. data/set-of-emails/maildir/bsd/exim-12.eml +75 -0
  169. data/set-of-emails/maildir/bsd/exim-13.eml +145 -0
  170. data/set-of-emails/maildir/bsd/exim-14.eml +32 -0
  171. data/set-of-emails/maildir/bsd/exim-15.eml +49 -0
  172. data/set-of-emails/maildir/bsd/exim-16.eml +98 -0
  173. data/set-of-emails/maildir/bsd/exim-17.eml +50 -0
  174. data/set-of-emails/maildir/bsd/exim-18.eml +96 -0
  175. data/set-of-emails/maildir/bsd/exim-19.eml +52 -0
  176. data/set-of-emails/maildir/bsd/exim-20.eml +159 -0
  177. data/set-of-emails/maildir/bsd/exim-21.eml +150 -0
  178. data/set-of-emails/maildir/bsd/exim-22.eml +50 -0
  179. data/set-of-emails/maildir/bsd/exim-23.eml +57 -0
  180. data/set-of-emails/maildir/bsd/exim-24.eml +107 -0
  181. data/set-of-emails/maildir/bsd/exim-25.eml +18 -0
  182. data/set-of-emails/maildir/bsd/exim-26.eml +111 -0
  183. data/set-of-emails/maildir/bsd/exim-27.eml +120 -0
  184. data/set-of-emails/maildir/bsd/exim-28.eml +148 -0
  185. data/set-of-emails/maildir/bsd/google-apps-01.eml +66 -0
  186. data/set-of-emails/maildir/bsd/imailserver-01.eml +27 -0
  187. data/set-of-emails/maildir/bsd/imailserver-02.eml +36 -0
  188. data/set-of-emails/maildir/bsd/imailserver-03.eml +28 -0
  189. data/set-of-emails/maildir/bsd/imailserver-04.eml +15 -0
  190. data/set-of-emails/maildir/bsd/imailserver-05.eml +92 -0
  191. data/set-of-emails/maildir/bsd/imailserver-06.eml +29 -0
  192. data/set-of-emails/maildir/bsd/interscanmss-01.eml +49 -0
  193. data/set-of-emails/maildir/bsd/interscanmss-02.eml +259 -0
  194. data/set-of-emails/maildir/bsd/jp-biglobe-01.eml +43 -0
  195. data/set-of-emails/maildir/bsd/jp-ezweb-01.eml +36 -0
  196. data/set-of-emails/maildir/bsd/jp-ezweb-02.eml +65 -0
  197. data/set-of-emails/maildir/bsd/jp-ezweb-03.eml +35 -0
  198. data/set-of-emails/maildir/bsd/jp-ezweb-04.eml +38 -0
  199. data/set-of-emails/maildir/bsd/jp-ezweb-05.eml +38 -0
  200. data/set-of-emails/maildir/bsd/jp-ezweb-06.eml +33 -0
  201. data/set-of-emails/maildir/bsd/jp-kddi-01.eml +49 -0
  202. data/set-of-emails/maildir/bsd/jp-kddi-02.eml +54 -0
  203. data/set-of-emails/maildir/bsd/jp-kddi-03.eml +54 -0
  204. data/set-of-emails/maildir/bsd/mailfoundry-01.eml +50 -0
  205. data/set-of-emails/maildir/bsd/mailfoundry-02.eml +49 -0
  206. data/set-of-emails/maildir/bsd/mailmarshalsmtp-01.eml +43 -0
  207. data/set-of-emails/maildir/bsd/mcafee-01.eml +63 -0
  208. data/set-of-emails/maildir/bsd/mcafee-02.eml +65 -0
  209. data/set-of-emails/maildir/bsd/mcafee-03.eml +59 -0
  210. data/set-of-emails/maildir/bsd/messagingserver-01.eml +102 -0
  211. data/set-of-emails/maildir/bsd/messagingserver-02.eml +72 -0
  212. data/set-of-emails/maildir/bsd/messagingserver-03.eml +70 -0
  213. data/set-of-emails/maildir/bsd/messagingserver-04.eml +102 -0
  214. data/set-of-emails/maildir/bsd/messagingserver-05.eml +98 -0
  215. data/set-of-emails/maildir/bsd/messagingserver-06.eml +101 -0
  216. data/set-of-emails/maildir/bsd/messagingserver-07.eml +129 -0
  217. data/set-of-emails/maildir/bsd/mfilter-01.eml +49 -0
  218. data/set-of-emails/maildir/bsd/mfilter-02.eml +48 -0
  219. data/set-of-emails/maildir/bsd/mfilter-03.eml +43 -0
  220. data/set-of-emails/maildir/bsd/mxlogic-01.eml +47 -0
  221. data/set-of-emails/maildir/bsd/mxlogic-02.eml +44 -0
  222. data/set-of-emails/maildir/bsd/mxlogic-03.eml +46 -0
  223. data/set-of-emails/maildir/bsd/notes-01.eml +42 -0
  224. data/set-of-emails/maildir/bsd/notes-02.eml +42 -0
  225. data/set-of-emails/maildir/bsd/notes-03.eml +38 -0
  226. data/set-of-emails/maildir/bsd/notes-04.eml +181 -0
  227. data/set-of-emails/maildir/bsd/opensmtpd-01.eml +33 -0
  228. data/set-of-emails/maildir/bsd/opensmtpd-02.eml +33 -0
  229. data/set-of-emails/maildir/bsd/opensmtpd-03.eml +36 -0
  230. data/set-of-emails/maildir/bsd/opensmtpd-04.eml +40 -0
  231. data/set-of-emails/maildir/bsd/opensmtpd-05.eml +36 -0
  232. data/set-of-emails/maildir/bsd/postfix-01.eml +60 -0
  233. data/set-of-emails/maildir/bsd/postfix-02.eml +78 -0
  234. data/set-of-emails/maildir/bsd/postfix-03.eml +71 -0
  235. data/set-of-emails/maildir/bsd/postfix-04.eml +89 -0
  236. data/set-of-emails/maildir/bsd/postfix-05.eml +78 -0
  237. data/set-of-emails/maildir/bsd/postfix-06.eml +72 -0
  238. data/set-of-emails/maildir/bsd/postfix-07.eml +74 -0
  239. data/set-of-emails/maildir/bsd/postfix-08.eml +78 -0
  240. data/set-of-emails/maildir/bsd/postfix-09.eml +76 -0
  241. data/set-of-emails/maildir/bsd/postfix-10.eml +73 -0
  242. data/set-of-emails/maildir/bsd/postfix-11.eml +86 -0
  243. data/set-of-emails/maildir/bsd/postfix-12.eml +71 -0
  244. data/set-of-emails/maildir/bsd/postfix-13.eml +81 -0
  245. data/set-of-emails/maildir/bsd/postfix-14.eml +68 -0
  246. data/set-of-emails/maildir/bsd/postfix-15.eml +69 -0
  247. data/set-of-emails/maildir/bsd/postfix-16.eml +73 -0
  248. data/set-of-emails/maildir/bsd/postfix-17.eml +68 -0
  249. data/set-of-emails/maildir/bsd/postfix-18.eml +121 -0
  250. data/set-of-emails/maildir/bsd/postfix-19.eml +105 -0
  251. data/set-of-emails/maildir/bsd/postfix-20.eml +231 -0
  252. data/set-of-emails/maildir/bsd/postfix-21.eml +60 -0
  253. data/set-of-emails/maildir/bsd/qmail-01.eml +40 -0
  254. data/set-of-emails/maildir/bsd/qmail-02.eml +35 -0
  255. data/set-of-emails/maildir/bsd/qmail-03.eml +22 -0
  256. data/set-of-emails/maildir/bsd/qmail-04.eml +31 -0
  257. data/set-of-emails/maildir/bsd/qmail-05.eml +31 -0
  258. data/set-of-emails/maildir/bsd/qmail-06.eml +39 -0
  259. data/set-of-emails/maildir/bsd/qmail-07.eml +22 -0
  260. data/set-of-emails/maildir/bsd/qmail-08.eml +23 -0
  261. data/set-of-emails/maildir/bsd/qmail-09.eml +103 -0
  262. data/set-of-emails/maildir/bsd/rfc3464-01.eml +60 -0
  263. data/set-of-emails/maildir/bsd/rfc3464-02.eml +43 -0
  264. data/set-of-emails/maildir/bsd/rfc3464-03.eml +40 -0
  265. data/set-of-emails/maildir/bsd/rfc3464-04.eml +50 -0
  266. data/set-of-emails/maildir/bsd/rfc3464-05.eml +63 -0
  267. data/set-of-emails/maildir/bsd/rfc3464-06.eml +48 -0
  268. data/set-of-emails/maildir/bsd/rfc3464-07.eml +88 -0
  269. data/set-of-emails/maildir/bsd/rfc3464-08.eml +70 -0
  270. data/set-of-emails/maildir/bsd/rfc3464-09.eml +93 -0
  271. data/set-of-emails/maildir/bsd/rfc3464-10.eml +467 -0
  272. data/set-of-emails/maildir/bsd/rfc3464-11.eml +1171 -0
  273. data/set-of-emails/maildir/bsd/rfc3464-12.eml +101 -0
  274. data/set-of-emails/maildir/bsd/rfc3464-13.eml +131 -0
  275. data/set-of-emails/maildir/bsd/rfc3464-14.eml +121 -0
  276. data/set-of-emails/maildir/bsd/rfc3464-15.eml +144 -0
  277. data/set-of-emails/maildir/bsd/rfc3464-16.eml +36 -0
  278. data/set-of-emails/maildir/bsd/rfc3464-17.eml +109 -0
  279. data/set-of-emails/maildir/bsd/rfc3464-18.eml +149 -0
  280. data/set-of-emails/maildir/bsd/rfc3464-19.eml +65 -0
  281. data/set-of-emails/maildir/bsd/rfc3464-20.eml +145 -0
  282. data/set-of-emails/maildir/bsd/rfc3464-21.eml +146 -0
  283. data/set-of-emails/maildir/bsd/rfc3464-22.eml +105 -0
  284. data/set-of-emails/maildir/bsd/rfc3464-23.eml +21 -0
  285. data/set-of-emails/maildir/bsd/rfc3464-24.eml +27 -0
  286. data/set-of-emails/maildir/bsd/rfc3464-25.eml +33 -0
  287. data/set-of-emails/maildir/bsd/rfc3464-26.eml +98 -0
  288. data/set-of-emails/maildir/bsd/rfc3464-27.eml +180 -0
  289. data/set-of-emails/maildir/bsd/rfc3464-28.eml +122 -0
  290. data/set-of-emails/maildir/bsd/rfc3834-01.eml +37 -0
  291. data/set-of-emails/maildir/bsd/rfc3834-02.eml +51 -0
  292. data/set-of-emails/maildir/bsd/rfc3834-03.eml +33 -0
  293. data/set-of-emails/maildir/bsd/ru-mailru-01.eml +54 -0
  294. data/set-of-emails/maildir/bsd/ru-mailru-02.eml +54 -0
  295. data/set-of-emails/maildir/bsd/ru-mailru-03.eml +62 -0
  296. data/set-of-emails/maildir/bsd/ru-mailru-04.eml +54 -0
  297. data/set-of-emails/maildir/bsd/ru-yandex-01.eml +102 -0
  298. data/set-of-emails/maildir/bsd/ru-yandex-02.eml +113 -0
  299. data/set-of-emails/maildir/bsd/ru-yandex-03.eml +101 -0
  300. data/set-of-emails/maildir/bsd/sendmail-01.eml +70 -0
  301. data/set-of-emails/maildir/bsd/sendmail-02.eml +82 -0
  302. data/set-of-emails/maildir/bsd/sendmail-03.eml +76 -0
  303. data/set-of-emails/maildir/bsd/sendmail-04.eml +63 -0
  304. data/set-of-emails/maildir/bsd/sendmail-05.eml +64 -0
  305. data/set-of-emails/maildir/bsd/sendmail-06.eml +67 -0
  306. data/set-of-emails/maildir/bsd/sendmail-07.eml +65 -0
  307. data/set-of-emails/maildir/bsd/sendmail-08.eml +62 -0
  308. data/set-of-emails/maildir/bsd/sendmail-09.eml +60 -0
  309. data/set-of-emails/maildir/bsd/sendmail-10.eml +82 -0
  310. data/set-of-emails/maildir/bsd/sendmail-11.eml +60 -0
  311. data/set-of-emails/maildir/bsd/sendmail-12.eml +62 -0
  312. data/set-of-emails/maildir/bsd/sendmail-13.eml +66 -0
  313. data/set-of-emails/maildir/bsd/sendmail-14.eml +64 -0
  314. data/set-of-emails/maildir/bsd/sendmail-15.eml +60 -0
  315. data/set-of-emails/maildir/bsd/sendmail-16.eml +69 -0
  316. data/set-of-emails/maildir/bsd/sendmail-17.eml +68 -0
  317. data/set-of-emails/maildir/bsd/sendmail-18.eml +64 -0
  318. data/set-of-emails/maildir/bsd/sendmail-19.eml +71 -0
  319. data/set-of-emails/maildir/bsd/sendmail-20.eml +120 -0
  320. data/set-of-emails/maildir/bsd/sendmail-21.eml +69 -0
  321. data/set-of-emails/maildir/bsd/sendmail-22.eml +73 -0
  322. data/set-of-emails/maildir/bsd/sendmail-23.eml +137 -0
  323. data/set-of-emails/maildir/bsd/sendmail-24.eml +66 -0
  324. data/set-of-emails/maildir/bsd/sendmail-25.eml +70 -0
  325. data/set-of-emails/maildir/bsd/sendmail-26.eml +71 -0
  326. data/set-of-emails/maildir/bsd/sendmail-27.eml +69 -0
  327. data/set-of-emails/maildir/bsd/sendmail-28.eml +69 -0
  328. data/set-of-emails/maildir/bsd/sendmail-29.eml +70 -0
  329. data/set-of-emails/maildir/bsd/sendmail-30.eml +68 -0
  330. data/set-of-emails/maildir/bsd/sendmail-31.eml +80 -0
  331. data/set-of-emails/maildir/bsd/sendmail-32.eml +71 -0
  332. data/set-of-emails/maildir/bsd/sendmail-33.eml +71 -0
  333. data/set-of-emails/maildir/bsd/sendmail-34.eml +75 -0
  334. data/set-of-emails/maildir/bsd/sendmail-35.eml +70 -0
  335. data/set-of-emails/maildir/bsd/sendmail-36.eml +71 -0
  336. data/set-of-emails/maildir/bsd/sendmail-37.eml +71 -0
  337. data/set-of-emails/maildir/bsd/sendmail-38.eml +167 -0
  338. data/set-of-emails/maildir/bsd/surfcontrol-01.eml +79 -0
  339. data/set-of-emails/maildir/bsd/surfcontrol-02.eml +70 -0
  340. data/set-of-emails/maildir/bsd/surfcontrol-03.eml +70 -0
  341. data/set-of-emails/maildir/bsd/uk-messagelabs-01.eml +76 -0
  342. data/set-of-emails/maildir/bsd/us-amazonses-01.eml +59 -0
  343. data/set-of-emails/maildir/bsd/us-amazonses-02.eml +177 -0
  344. data/set-of-emails/maildir/bsd/us-amazonses-03.eml +55 -0
  345. data/set-of-emails/maildir/bsd/us-amazonses-04.eml +55 -0
  346. data/set-of-emails/maildir/bsd/us-amazonworkmail-01.eml +156 -0
  347. data/set-of-emails/maildir/bsd/us-amazonworkmail-02.eml +160 -0
  348. data/set-of-emails/maildir/bsd/us-amazonworkmail-03.eml +161 -0
  349. data/set-of-emails/maildir/bsd/us-amazonworkmail-04.eml +156 -0
  350. data/set-of-emails/maildir/bsd/us-amazonworkmail-05.eml +157 -0
  351. data/set-of-emails/maildir/bsd/us-aol-01.eml +1258 -0
  352. data/set-of-emails/maildir/bsd/us-aol-02.eml +1257 -0
  353. data/set-of-emails/maildir/bsd/us-aol-03.eml +1264 -0
  354. data/set-of-emails/maildir/bsd/us-aol-04.eml +1260 -0
  355. data/set-of-emails/maildir/bsd/us-bigfoot-01.eml +64 -0
  356. data/set-of-emails/maildir/bsd/us-facebook-01.eml +40 -0
  357. data/set-of-emails/maildir/bsd/us-facebook-02.eml +42 -0
  358. data/set-of-emails/maildir/bsd/us-google-01.eml +70 -0
  359. data/set-of-emails/maildir/bsd/us-google-02.eml +50 -0
  360. data/set-of-emails/maildir/bsd/us-google-03.eml +51 -0
  361. data/set-of-emails/maildir/bsd/us-google-04.eml +82 -0
  362. data/set-of-emails/maildir/bsd/us-google-05.eml +50 -0
  363. data/set-of-emails/maildir/bsd/us-google-06.eml +56 -0
  364. data/set-of-emails/maildir/bsd/us-google-07.eml +42 -0
  365. data/set-of-emails/maildir/bsd/us-google-08.eml +59 -0
  366. data/set-of-emails/maildir/bsd/us-google-09.eml +76 -0
  367. data/set-of-emails/maildir/bsd/us-google-10.eml +69 -0
  368. data/set-of-emails/maildir/bsd/us-google-11.eml +68 -0
  369. data/set-of-emails/maildir/bsd/us-google-12.eml +76 -0
  370. data/set-of-emails/maildir/bsd/us-google-13.eml +79 -0
  371. data/set-of-emails/maildir/bsd/us-google-14.eml +304 -0
  372. data/set-of-emails/maildir/bsd/us-office365-01.eml +102 -0
  373. data/set-of-emails/maildir/bsd/us-outlook-01.eml +72 -0
  374. data/set-of-emails/maildir/bsd/us-outlook-02.eml +72 -0
  375. data/set-of-emails/maildir/bsd/us-outlook-03.eml +72 -0
  376. data/set-of-emails/maildir/bsd/us-outlook-04.eml +79 -0
  377. data/set-of-emails/maildir/bsd/us-outlook-05.eml +85 -0
  378. data/set-of-emails/maildir/bsd/us-outlook-06.eml +75 -0
  379. data/set-of-emails/maildir/bsd/us-outlook-07.eml +70 -0
  380. data/set-of-emails/maildir/bsd/us-receivingses-01.eml +74 -0
  381. data/set-of-emails/maildir/bsd/us-receivingses-02.eml +74 -0
  382. data/set-of-emails/maildir/bsd/us-receivingses-03.eml +74 -0
  383. data/set-of-emails/maildir/bsd/us-receivingses-04.eml +74 -0
  384. data/set-of-emails/maildir/bsd/us-receivingses-05.eml +74 -0
  385. data/set-of-emails/maildir/bsd/us-receivingses-06.eml +74 -0
  386. data/set-of-emails/maildir/bsd/us-receivingses-07.eml +74 -0
  387. data/set-of-emails/maildir/bsd/us-sendgrid-01.eml +95 -0
  388. data/set-of-emails/maildir/bsd/us-sendgrid-02.eml +98 -0
  389. data/set-of-emails/maildir/bsd/us-sendgrid-03.eml +100 -0
  390. data/set-of-emails/maildir/bsd/us-verizon-01.eml +31 -0
  391. data/set-of-emails/maildir/bsd/us-yahoo-01.eml +78 -0
  392. data/set-of-emails/maildir/bsd/us-yahoo-02.eml +79 -0
  393. data/set-of-emails/maildir/bsd/us-yahoo-03.eml +93 -0
  394. data/set-of-emails/maildir/bsd/us-yahoo-04.eml +94 -0
  395. data/set-of-emails/maildir/bsd/us-yahoo-05.eml +94 -0
  396. data/set-of-emails/maildir/bsd/us-zoho-01.eml +40 -0
  397. data/set-of-emails/maildir/bsd/us-zoho-02.eml +38 -0
  398. data/set-of-emails/maildir/bsd/us-zoho-03.eml +37 -0
  399. data/set-of-emails/maildir/bsd/us-zoho-04.eml +47 -0
  400. data/set-of-emails/maildir/bsd/us-zoho-05.eml +37 -0
  401. data/set-of-emails/maildir/bsd/v5sendmail-01.eml +24 -0
  402. data/set-of-emails/maildir/bsd/v5sendmail-02.eml +26 -0
  403. data/set-of-emails/maildir/bsd/v5sendmail-03.eml +29 -0
  404. data/set-of-emails/maildir/bsd/v5sendmail-04.eml +29 -0
  405. data/set-of-emails/maildir/bsd/v5sendmail-05.eml +42 -0
  406. data/set-of-emails/maildir/bsd/v5sendmail-06.eml +28 -0
  407. data/set-of-emails/maildir/bsd/v5sendmail-07.eml +35 -0
  408. data/set-of-emails/maildir/bsd/x1-01.eml +61 -0
  409. data/set-of-emails/maildir/bsd/x1-02.eml +62 -0
  410. data/set-of-emails/maildir/bsd/x2-01.eml +41 -0
  411. data/set-of-emails/maildir/bsd/x2-02.eml +46 -0
  412. data/set-of-emails/maildir/bsd/x2-03.eml +34 -0
  413. data/set-of-emails/maildir/bsd/x2-04.eml +0 -0
  414. data/set-of-emails/maildir/bsd/x2-05.eml +98 -0
  415. data/set-of-emails/maildir/bsd/x3-01.eml +61 -0
  416. data/set-of-emails/maildir/bsd/x3-02.eml +64 -0
  417. data/set-of-emails/maildir/bsd/x3-03.eml +59 -0
  418. data/set-of-emails/maildir/bsd/x3-04.eml +106 -0
  419. data/set-of-emails/maildir/bsd/x4-01.eml +92 -0
  420. data/set-of-emails/maildir/bsd/x4-02.eml +112 -0
  421. data/set-of-emails/maildir/bsd/x4-03.eml +245 -0
  422. data/set-of-emails/maildir/bsd/x4-04.eml +81 -0
  423. data/set-of-emails/maildir/bsd/x4-05.eml +121 -0
  424. data/set-of-emails/maildir/bsd/x4-06.eml +32 -0
  425. data/set-of-emails/maildir/bsd/x4-07.eml +153 -0
  426. data/set-of-emails/maildir/bsd/x5-01.eml +155 -0
  427. data/set-of-emails/maildir/dos/activehunter-01.eml +54 -0
  428. data/set-of-emails/maildir/dos/apachejames-01.eml +46 -0
  429. data/set-of-emails/maildir/dos/arf-01.eml +66 -0
  430. data/set-of-emails/maildir/dos/courier-01.eml +79 -0
  431. data/set-of-emails/maildir/dos/de-einsundeins-01.eml +38 -0
  432. data/set-of-emails/maildir/dos/de-gmx-01.eml +52 -0
  433. data/set-of-emails/maildir/dos/domino-01.eml +33 -0
  434. data/set-of-emails/maildir/dos/exchange-01.eml +31 -0
  435. data/set-of-emails/maildir/dos/exim-01.eml +46 -0
  436. data/set-of-emails/maildir/dos/google-apps-01.eml +66 -0
  437. data/set-of-emails/maildir/dos/imailserver-01.eml +27 -0
  438. data/set-of-emails/maildir/dos/interscanmss-01.eml +49 -0
  439. data/set-of-emails/maildir/dos/jp-biglobe-01.eml +43 -0
  440. data/set-of-emails/maildir/dos/jp-ezweb-01.eml +36 -0
  441. data/set-of-emails/maildir/dos/jp-kddi-01.eml +49 -0
  442. data/set-of-emails/maildir/dos/mailfoundry-01.eml +50 -0
  443. data/set-of-emails/maildir/dos/mailmarshalsmtp-01.eml +43 -0
  444. data/set-of-emails/maildir/dos/mcafee-01.eml +63 -0
  445. data/set-of-emails/maildir/dos/messagingserver-01.eml +102 -0
  446. data/set-of-emails/maildir/dos/mfilter-01.eml +49 -0
  447. data/set-of-emails/maildir/dos/mxlogic-01.eml +47 -0
  448. data/set-of-emails/maildir/dos/notes-01.eml +42 -0
  449. data/set-of-emails/maildir/dos/opensmtpd-01.eml +33 -0
  450. data/set-of-emails/maildir/dos/postfix-01.eml +60 -0
  451. data/set-of-emails/maildir/dos/qmail-01.eml +40 -0
  452. data/set-of-emails/maildir/dos/rfc3464-01.eml +59 -0
  453. data/set-of-emails/maildir/dos/rfc3834-01.eml +37 -0
  454. data/set-of-emails/maildir/dos/ru-mailru-01.eml +54 -0
  455. data/set-of-emails/maildir/dos/ru-yandex-01.eml +102 -0
  456. data/set-of-emails/maildir/dos/sendmail-01.eml +69 -0
  457. data/set-of-emails/maildir/dos/surfcontrol-01.eml +79 -0
  458. data/set-of-emails/maildir/dos/uk-messagelabs-01.eml +76 -0
  459. data/set-of-emails/maildir/dos/us-amazonses-01.eml +59 -0
  460. data/set-of-emails/maildir/dos/us-aol-01.eml +1258 -0
  461. data/set-of-emails/maildir/dos/us-bigfoot-01.eml +64 -0
  462. data/set-of-emails/maildir/dos/us-facebook-01.eml +40 -0
  463. data/set-of-emails/maildir/dos/us-google-01.eml +70 -0
  464. data/set-of-emails/maildir/dos/us-outlook-01.eml +72 -0
  465. data/set-of-emails/maildir/dos/us-receivingses-01.eml +74 -0
  466. data/set-of-emails/maildir/dos/us-sendgrid-01.eml +95 -0
  467. data/set-of-emails/maildir/dos/us-verizon-01.eml +31 -0
  468. data/set-of-emails/maildir/dos/us-yahoo-01.eml +78 -0
  469. data/set-of-emails/maildir/dos/us-zoho-01.eml +40 -0
  470. data/set-of-emails/maildir/dos/v5sendmail-01.eml +24 -0
  471. data/set-of-emails/maildir/dos/x1-01.eml +61 -0
  472. data/set-of-emails/maildir/dos/x2-01.eml +41 -0
  473. data/set-of-emails/maildir/dos/x3-01.eml +61 -0
  474. data/set-of-emails/maildir/dos/x4-01.eml +90 -0
  475. data/set-of-emails/maildir/dos/x5-01.eml +155 -0
  476. data/set-of-emails/maildir/err/make-test-01.eml +70 -0
  477. data/set-of-emails/maildir/err/make-test-02.eml +70 -0
  478. data/set-of-emails/maildir/err/make-test-03.eml +64 -0
  479. data/set-of-emails/maildir/err/make-test-04.eml +64 -0
  480. data/set-of-emails/maildir/err/make-test-05.eml +66 -0
  481. data/set-of-emails/maildir/err/make-test-06.eml +118 -0
  482. data/set-of-emails/maildir/err/make-test-07.eml +26 -0
  483. data/set-of-emails/maildir/err/make-test-08.eml +67 -0
  484. data/set-of-emails/maildir/err/make-test-09.eml +55 -0
  485. data/set-of-emails/maildir/err/make-test-10.eml +69 -0
  486. data/set-of-emails/maildir/err/make-test-11.eml +64 -0
  487. data/set-of-emails/maildir/err/make-test-12.eml +66 -0
  488. data/set-of-emails/maildir/err/make-test-13.eml +67 -0
  489. data/set-of-emails/maildir/err/make-test-14.eml +66 -0
  490. data/set-of-emails/maildir/err/make-test-15.eml +70 -0
  491. data/set-of-emails/maildir/err/make-test-16.eml +68 -0
  492. data/set-of-emails/maildir/err/make-test-17.eml +68 -0
  493. data/set-of-emails/maildir/err/make-test-18.eml +68 -0
  494. data/set-of-emails/maildir/err/make-test-19.eml +69 -0
  495. data/set-of-emails/maildir/err/make-test-20.eml +67 -0
  496. data/set-of-emails/maildir/err/make-test-21.eml +69 -0
  497. data/set-of-emails/maildir/err/make-test-22.eml +66 -0
  498. data/set-of-emails/maildir/err/make-test-23.eml +70 -0
  499. data/set-of-emails/maildir/err/make-test-24.eml +69 -0
  500. data/set-of-emails/maildir/err/make-test-25.eml +67 -0
  501. data/set-of-emails/maildir/err/make-test-26.eml +69 -0
  502. data/set-of-emails/maildir/err/make-test-27.eml +69 -0
  503. data/set-of-emails/maildir/err/make-test-28.eml +66 -0
  504. data/set-of-emails/maildir/err/make-test-29.eml +68 -0
  505. data/set-of-emails/maildir/err/make-test-30.eml +68 -0
  506. data/set-of-emails/maildir/err/make-test-31.eml +80 -0
  507. data/set-of-emails/maildir/err/make-test-32.eml +66 -0
  508. data/set-of-emails/maildir/err/make-test-33.eml +68 -0
  509. data/set-of-emails/maildir/err/make-test-34.eml +56 -0
  510. data/set-of-emails/maildir/err/make-test-35.eml +59 -0
  511. data/set-of-emails/maildir/err/make-test-36.eml +53 -0
  512. data/set-of-emails/maildir/err/make-test-37.eml +62 -0
  513. data/set-of-emails/maildir/mac/activehunter-01.eml +1 -2
  514. data/set-of-emails/maildir/mac/apachejames-01.eml +1 -4
  515. data/set-of-emails/maildir/mac/arf-01.eml +1 -3
  516. data/set-of-emails/maildir/mac/courier-01.eml +1 -6
  517. data/set-of-emails/maildir/mac/de-einsundeins-01.eml +1 -1
  518. data/set-of-emails/maildir/mac/de-gmx-01.eml +1 -1
  519. data/set-of-emails/maildir/mac/domino-01.eml +1 -0
  520. data/set-of-emails/maildir/mac/exchange-01.eml +1 -0
  521. data/set-of-emails/maildir/mac/exim-01.eml +1 -1
  522. data/set-of-emails/maildir/mac/google-apps-01.eml +1 -4
  523. data/set-of-emails/maildir/mac/imailserver-01.eml +1 -0
  524. data/set-of-emails/maildir/mac/interscanmss-01.eml +1 -2
  525. data/set-of-emails/maildir/mac/jp-biglobe-01.eml +1 -2
  526. data/set-of-emails/maildir/mac/jp-ezweb-01.eml +1 -1
  527. data/set-of-emails/maildir/mac/jp-kddi-01.eml +1 -2
  528. data/set-of-emails/maildir/mac/mailfoundry-01.eml +1 -2
  529. data/set-of-emails/maildir/mac/mailmarshalsmtp-01.eml +1 -2
  530. data/set-of-emails/maildir/mac/mcafee-01.eml +1 -4
  531. data/set-of-emails/maildir/mac/messagingserver-01.eml +1 -4
  532. data/set-of-emails/maildir/mac/mfilter-01.eml +1 -3
  533. data/set-of-emails/maildir/mac/mxlogic-01.eml +1 -1
  534. data/set-of-emails/maildir/mac/notes-01.eml +1 -2
  535. data/set-of-emails/maildir/mac/opensmtpd-01.eml +1 -0
  536. data/set-of-emails/maildir/mac/postfix-01.eml +1 -3
  537. data/set-of-emails/maildir/mac/qmail-01.eml +1 -1
  538. data/set-of-emails/maildir/mac/rfc3464-01.eml +1 -4
  539. data/set-of-emails/maildir/mac/rfc3834-01.eml +1 -0
  540. data/set-of-emails/maildir/mac/ru-mailru-01.eml +1 -1
  541. data/set-of-emails/maildir/mac/ru-yandex-01.eml +1 -4
  542. data/set-of-emails/maildir/mac/sendmail-01.eml +1 -4
  543. data/set-of-emails/maildir/mac/surfcontrol-01.eml +1 -5
  544. data/set-of-emails/maildir/mac/uk-messagelabs-01.eml +1 -4
  545. data/set-of-emails/maildir/mac/us-amazonses-01.eml +1 -4
  546. data/set-of-emails/maildir/mac/us-aol-01.eml +1 -15
  547. data/set-of-emails/maildir/mac/us-bigfoot-01.eml +1 -4
  548. data/set-of-emails/maildir/mac/us-facebook-01.eml +1 -4
  549. data/set-of-emails/maildir/mac/us-google-01.eml +1 -1
  550. data/set-of-emails/maildir/mac/us-outlook-01.eml +1 -4
  551. data/set-of-emails/maildir/mac/us-receivingses-01.eml +1 -4
  552. data/set-of-emails/maildir/mac/us-sendgrid-01.eml +1 -3
  553. data/set-of-emails/maildir/mac/us-verizon-01.eml +1 -2
  554. data/set-of-emails/maildir/mac/us-yahoo-01.eml +1 -1
  555. data/set-of-emails/maildir/mac/us-zoho-01.eml +1 -2
  556. data/set-of-emails/maildir/mac/v5sendmail-01.eml +1 -0
  557. data/set-of-emails/maildir/mac/x1-01.eml +1 -4
  558. data/set-of-emails/maildir/mac/x2-01.eml +1 -1
  559. data/set-of-emails/maildir/mac/x3-01.eml +1 -3
  560. data/set-of-emails/maildir/mac/x4-01.eml +1 -2
  561. data/set-of-emails/maildir/mac/x5-01.eml +1 -8
  562. data/set-of-emails/maildir/not/is-not-bounce-01.eml +25 -0
  563. data/set-of-emails/to-be-debugged-because/reason-is-onhold/onhold-0001.eml +85 -0
  564. data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0002.eml +27 -0
  565. data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0003.eml +78 -0
  566. data/set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet/cannot-parse-this-email-0002.eml +25 -0
  567. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-01.eml +79 -0
  568. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-02.eml +72 -0
  569. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-03.eml +68 -0
  570. data/set-of-emails/to-be-debugged-because/something-is-wrong/no-message-id-from-pr-150.eml +75 -0
  571. data/set-of-emails/to-be-parsed-for-test/README.md +20 -0
  572. data/sisimai-java.gemspec +29 -0
  573. data/sisimai.gemspec +28 -0
  574. metadata +680 -0
@@ -0,0 +1,365 @@
1
+ module Sisimai
2
+ module MTA
3
+ # Sisimai::MTA::X4 parses a bounce email which created by some qmail clone.
4
+ # Methods in the module are called from only Sisimai::Message.
5
+ module X4
6
+ # Imported from p5-Sisimail/lib/Sisimai/MTA/X4.pm
7
+ class << self
8
+ require 'sisimai/mta'
9
+ require 'sisimai/rfc5322'
10
+ Re0 = {
11
+ :subject => %r{\A(?:
12
+ failure[ ]notice
13
+ |Permanent[ ]Delivery[ ]Failure
14
+ )
15
+ }xi,
16
+ :received => %r/\A[(]qmail[ ]+\d+[ ]+invoked[ ]+for[ ]+bounce[)]/,
17
+ }
18
+ # qmail-remote.c:248| if (code >= 500) {
19
+ # qmail-remote.c:249| out("h"); outhost(); out(" does not like recipient.\n");
20
+ # qmail-remote.c:265| if (code >= 500) quit("D"," failed on DATA command");
21
+ # qmail-remote.c:271| if (code >= 500) quit("D"," failed after I sent the message");
22
+ #
23
+ # Characters: K,Z,D in qmail-qmqpc.c, qmail-send.c, qmail-rspawn.c
24
+ # K = success, Z = temporary error, D = permanent error
25
+ #
26
+ # MTA module for qmail clones
27
+ Re1 = {
28
+ :begin => %r{\A(?>
29
+ He/Her[ ]is[ ]not.+[ ]user
30
+ |Hi[.][ ].+[ ]unable[ ]to[ ]deliver[ ]your[ ]message[ ]to[ ]
31
+ the[ ]following[ ]addresses
32
+ |Su[ ]mensaje[ ]no[ ]pudo[ ]ser[ ]entregado
33
+ |This[ ]is[ ]the[ ](?:
34
+ machine[ ]generated[ ]message[ ]from[ ]mail[ ]service
35
+ |mail[ ]delivery[ ]agent[ ]at
36
+ )
37
+ |Unable[ ]to[ ]deliver[ ]message[ ]to[ ]the[ ]following[ ]address
38
+ |Unfortunately,[ ]your[ ]mail[ ]was[ ]not[ ]delivered[ ]to[ ]the[ ]following[ ]address:
39
+ |Your[ ](?:
40
+ mail[ ]message[ ]to[ ]the[ ]following[ ]address
41
+ |message[ ]to[ ]the[ ]following[ ]addresses
42
+ )
43
+ |We're[ ]sorry[.]
44
+ )
45
+ }ix,
46
+ :rfc822 => %r{\A(?:
47
+ ---[ ]Below[ ]this[ ]line[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]message[.]
48
+ |---[ ]Original[ ]message[ ]follows[.]
49
+ )
50
+ }xi,
51
+ :error => %r/\ARemote host said:/,
52
+ :sorry => %r/\A[Ss]orry[,.][ ]/,
53
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
54
+ }
55
+ ReSMTP = {
56
+ # Error text regular expressions which defined in qmail-remote.c
57
+ # qmail-remote.c:225| if (smtpcode() != 220) quit("ZConnected to "," but greeting failed");
58
+ 'conn' => %r/(?:Error:)?Connected[ ]to[ ].+[ ]but[ ]greeting[ ]failed[.]/x,
59
+ # qmail-remote.c:231| if (smtpcode() != 250) quit("ZConnected to "," but my name was rejected");
60
+ 'ehlo' => %r/(?:Error:)?Connected[ ]to[ ].+[ ]but[ ]my[ ]name[ ]was[ ]rejected[.]/x,
61
+ # qmail-remote.c:238| if (code >= 500) quit("DConnected to "," but sender was rejected");
62
+ # reason = rejected
63
+ 'mail' => %r/(?:Error:)?Connected[ ]to[ ].+[ ]but[ ]sender[ ]was[ ]rejected[.]/x,
64
+ # qmail-remote.c:249| out("h"); outhost(); out(" does not like recipient.\n");
65
+ # qmail-remote.c:253| out("s"); outhost(); out(" does not like recipient.\n");
66
+ # reason = userunknown
67
+ 'rcpt' => %r/(?:Error:)?.+[ ]does[ ]not[ ]like[ ]recipient[.]/x,
68
+ # qmail-remote.c:265| if (code >= 500) quit("D"," failed on DATA command");
69
+ # qmail-remote.c:266| if (code >= 400) quit("Z"," failed on DATA command");
70
+ # qmail-remote.c:271| if (code >= 500) quit("D"," failed after I sent the message");
71
+ # qmail-remote.c:272| if (code >= 400) quit("Z"," failed after I sent the message");
72
+ 'data' => %r{(?:
73
+ (?:Error:)?.+[ ]failed[ ]on[ ]DATA[ ]command[.]
74
+ |(?:Error:)?.+[ ]failed[ ]after[ ]I[ ]sent[ ]the[ ]message[.]
75
+ )
76
+ }x,
77
+ }
78
+ # qmail-remote.c:261| if (!flagbother) quit("DGiving up on ","");
79
+ ReHost = %r{(?:
80
+ Giving[ ]up[ ]on[ ](.+[0-9a-zA-Z])[.]?\z
81
+ |Connected[ ]to[ ]([-0-9a-zA-Z.]+[0-9a-zA-Z])[ ]
82
+ |remote[ ]host[ ]([-0-9a-zA-Z.]+[0-9a-zA-Z])[ ]said:
83
+ )
84
+ }x
85
+ # qmail-ldap-1.03-20040101.patch:19817 - 19866
86
+ ReLDAP = {
87
+ 'suspend' => %r/Mailaddress is administrative?le?y disabled/, # 5.2.1
88
+ 'userunknown' => %r/[Ss]orry, no mailbox here by that name/, # 5.1.1
89
+ 'exceedlimit' => %r/The message exeeded the maximum size the user accepts/, # 5.2.3
90
+ 'systemerror' => %r{(?>
91
+ Automatic[ ]homedir[ ]creator[ ]crashed # 4.3.0
92
+ |Illegal[ ]value[ ]in[ ]LDAP[ ]attribute # 5.3.5
93
+ |LDAP[ ]attribute[ ]is[ ]not[ ]given[ ]but[ ]mandatory # 5.3.5
94
+ |Timeout[ ]while[ ]performing[ ]search[ ]on[ ]LDAP[ ]server # 4.4.3
95
+ |Too[ ]many[ ]results[ ]returned[ ]but[ ]needs[ ]to[ ]be[ ]unique # 5.3.5
96
+ |Permanent[ ]error[ ]while[ ]executing[ ]qmail[-]forward # 5.4.4
97
+ |Temporary[ ](?:
98
+ error[ ](?:
99
+ in[ ]automatic[ ]homedir[ ]creation # 4.3.0 or 5.3.0
100
+ |while[ ]executing[ ]qmail[-]forward # 4.4.4
101
+ )
102
+ |failure[ ]in[ ]LDAP[ ]lookup # 4.4.3
103
+ )
104
+ |Unable[ ]to[ ](?:
105
+ contact[ ]LDAP[ ]server # 4.4.3
106
+ |login[ ]into[ ]LDAP[ ]server,[ ]bad[ ]credentials # 4.4.3
107
+ )
108
+ )
109
+ }x,
110
+ }
111
+ # userunknown + expired
112
+ ReOnHold = %r/\A[^ ]+ does not like recipient[.][ ]+.+this message has been in the queue too long[.]\z/
113
+ # qmail-remote-fallback.patch
114
+ ReCommand = %r/Sorry,[ ]no[ ]SMTP[ ]connection[ ]got[ ]far[ ]enough;[ ]most[ ]progress[ ]was[ ]([A-Z]{4})[ ]/x
115
+ ReFailure = {
116
+ # qmail-local.c:589| strerr_die1x(100,"Sorry, no mailbox here by that name. (#5.1.1)");
117
+ # qmail-remote.c:253| out("s"); outhost(); out(" does not like recipient.\n");
118
+ 'userunknown' => %r{(?:
119
+ no[ ]mailbox[ ]here[ ]by[ ]that[ ]name
120
+ |[ ]does[ ]not[ ]like[ ]recipient[.]
121
+ )
122
+ }x,
123
+ # error_str.c:192| X(EDQUOT,"disk quota exceeded")
124
+ 'mailboxfull' => %r/disk[ ]quota[ ]exceeded/x,
125
+ # qmail-qmtpd.c:233| ... result = "Dsorry, that message size exceeds my databytes limit (#5.3.4)";
126
+ # qmail-smtpd.c:391| ... out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); return;
127
+ 'mesgtoobig' => %r/Message[ ]size[ ]exceeds[ ]fixed[ ]maximum[ ]message[ ]size:/x,
128
+ # qmail-remote.c:68| Sorry, I couldn't find any host by that name. (#4.1.2)\n"); zerodie();
129
+ # qmail-remote.c:78| Sorry, I couldn't find any host named ");
130
+ 'hostunknown' => %r/\ASorry[,][ ]I[ ]couldn[']t[ ]find[ ]any[ ]host[ ]/x,
131
+ 'systemerror' => %r{(?>
132
+ bad[ ]interpreter:[ ]No[ ]such[ ]file[ ]or[ ]directory
133
+ |system[ ]error
134
+ |Unable[ ]to\b
135
+ )
136
+ }x,
137
+ 'networkerror' => %r{Sorry(?:
138
+ [,][ ]I[ ]wasn[']t[ ]able[ ]to[ ]establish[ ]an[ ]SMTP[ ]connection
139
+ |[,][ ]I[ ]couldn[']t[ ]find[ ]a[ ]mail[ ]exchanger[ ]or[ ]IP[ ]address
140
+ |[.][ ]Although[ ]I[']m[ ]listed[ ]as[ ]a[ ]best[-]preference[ ]MX[ ]or[ ]A[ ]for[ ]that[ ]host
141
+ )
142
+ }x,
143
+ 'systemfull' => %r/Requested action not taken: mailbox unavailable [(]not enough free space[)]/,
144
+ }
145
+
146
+ # qmail-send.c:922| ... (&dline[c],"I'm not going to try again; this message has been in the queue too long.\n")) nomem();
147
+ ReDelayed = %r/this[ ]message[ ]has[ ]been[ ]in[ ]the[ ]queue[ ]too[ ]long[.]\z/x
148
+
149
+ Indicators = Sisimai::MTA.INDICATORS
150
+ LongFields = Sisimai::RFC5322.LONGFIELDS
151
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
152
+
153
+ def description; return 'Unknown MTA #4'; end
154
+ def smtpagent; return 'X4'; end
155
+ def headerlist; return []; end
156
+ def pattern; return Re0; end
157
+
158
+ # Parse bounce messages from Unknown MTA #4
159
+ # @param [Hash] mhead Message header of a bounce email
160
+ # @options mhead [String] from From header
161
+ # @options mhead [String] date Date header
162
+ # @options mhead [String] subject Subject header
163
+ # @options mhead [Array] received Received headers
164
+ # @options mhead [String] others Other required headers
165
+ # @param [String] mbody Message body of a bounce email
166
+ # @return [Hash, Nil] Bounce data list and message/rfc822
167
+ # part or nil if it failed to parse or
168
+ # the arguments are missing
169
+ def scan(mhead, mbody)
170
+ return nil unless mhead
171
+ return nil unless mbody
172
+
173
+ # Pre process email headers and the body part of the message which generated
174
+ # by qmail, see http://cr.yp.to/qmail.html
175
+ # e.g.) Received: (qmail 12345 invoked for bounce); 29 Apr 2009 12:34:56 -0000
176
+ # Subject: failure notice
177
+ match = 0
178
+ match += 1 if mhead['subject'] =~ Re0[:subject]
179
+ match += 1 if mhead['received'].find { |a| a =~ Re0[:received] }
180
+ return nil if match == 0
181
+
182
+ dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
183
+ hasdivided = mbody.split("\n")
184
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
185
+ rfc822part = '' # (String) message/rfc822-headers part
186
+ previousfn = '' # (String) Previous field name
187
+ readcursor = 0 # (Integer) Points the current cursor position
188
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
189
+ v = nil
190
+
191
+ hasdivided.each do |e|
192
+ if readcursor == 0
193
+ # Beginning of the bounce message or delivery status part
194
+ if e =~ Re1[:begin]
195
+ readcursor |= Indicators[:'deliverystatus']
196
+ next
197
+ end
198
+ end
199
+
200
+ if readcursor & Indicators[:'message-rfc822'] == 0
201
+ # Beginning of the original message part
202
+ if e =~ Re1[:rfc822]
203
+ readcursor |= Indicators[:'message-rfc822']
204
+ next
205
+ end
206
+ end
207
+
208
+ if readcursor & Indicators[:'message-rfc822'] > 0
209
+ # After "message/rfc822"
210
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
211
+ # Get required headers only
212
+ lhs = cv[1].downcase
213
+ previousfn = ''
214
+ next unless RFC822Head.key?(lhs)
215
+
216
+ previousfn = lhs
217
+ rfc822part += e + "\n"
218
+
219
+ elsif e =~ /\A[ \t]+/
220
+ # Continued line from the previous line
221
+ next if rfc822next[previousfn]
222
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
223
+
224
+ else
225
+ # Check the end of headers in rfc822 part
226
+ next unless LongFields.key?(previousfn)
227
+ next unless e.empty?
228
+ rfc822next[previousfn] = true
229
+ end
230
+
231
+ else
232
+ # Before "message/rfc822"
233
+ next if readcursor & Indicators[:'deliverystatus'] == 0
234
+ next if e.empty?
235
+
236
+ # <kijitora@example.jp>:
237
+ # 192.0.2.153 does not like recipient.
238
+ # Remote host said: 550 5.1.1 <kijitora@example.jp>... User Unknown
239
+ # Giving up on 192.0.2.153.
240
+ v = dscontents[-1]
241
+
242
+ if cv = e.match(/\AThis is a permanent error;/)
243
+ # This is a permanent error; I've given up. Sorry it didn't work out.
244
+ v['softbounce'] = 0
245
+
246
+ elsif cv = e.match(/\A(?:To[ ]*:)?[<](.+[@].+)[>]:[ ]*\z/)
247
+ # <kijitora@example.jp>:
248
+ if v['recipient']
249
+ # There are multiple recipient addresses in the message body.
250
+ dscontents << Sisimai::MTA.DELIVERYSTATUS
251
+ v = dscontents[-1]
252
+ end
253
+ v['recipient'] = cv[1]
254
+ recipients += 1
255
+
256
+ elsif dscontents.size == recipients
257
+ # Append error message
258
+ next if e.empty?
259
+ v['diagnosis'] ||= ''
260
+ v['diagnosis'] += e + ' '
261
+ v['alterrors'] = e if e =~ Re1[:error]
262
+
263
+ next if v['rhost']
264
+ if cv = e.match(ReHost)
265
+ v['rhost'] = cv[1]
266
+ end
267
+ end
268
+ end
269
+
270
+ end
271
+
272
+ return nil if recipients == 0
273
+ require 'sisimai/string'
274
+ require 'sisimai/smtp/status'
275
+
276
+ dscontents.map do |e|
277
+ e['agent'] = Sisimai::MTA::X4.smtpagent
278
+
279
+ if mhead['received'].size > 0
280
+ # Get localhost and remote host name from Received header.
281
+ r0 = mhead['received']
282
+ %w|lhost rhost|.each { |a| e[a] ||= '' }
283
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
284
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
285
+ end
286
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
287
+
288
+ unless e['command']
289
+ # Get the SMTP command name for the session
290
+ ReSMTP.each_key do |r|
291
+ # Verify each regular expression of SMTP commands
292
+ next unless e['diagnosis'] =~ ReSMTP[r]
293
+ e['command'] = r.upcase
294
+ break
295
+ end
296
+
297
+ unless e['command']
298
+ # Verify each regular expression of patches
299
+ if cv = e['diagnosis'].match(ReCommand)
300
+ e['command'] = cv[1].upcase
301
+ end
302
+ e['command'] ||= ''
303
+ end
304
+ end
305
+
306
+ # Detect the reason of bounce
307
+ if e['command'] == 'MAIL'
308
+ # MAIL | Connected to 192.0.2.135 but sender was rejected.
309
+ e['reason'] = 'rejected'
310
+
311
+ elsif e['command'] =~ /\A(?:HELO|EHLO)\z/
312
+ # HELO | Connected to 192.0.2.135 but my name was rejected.
313
+ e['reason'] = 'blocked'
314
+
315
+ else
316
+ # Try to match with each error message in the table
317
+ if e['diagnosis'] =~ ReOnHold
318
+ # To decide the reason require pattern match with
319
+ # Sisimai::Reason::* modules
320
+ e['reason'] = 'onhold'
321
+
322
+ else
323
+ ReFailure.each_key do |r|
324
+ # Verify each regular expression of session errors
325
+ if e['alterrors']
326
+ # Check the value of "alterrors"
327
+ next unless e['alterrors'] =~ ReFailure[r]
328
+ e['reason'] = r
329
+ end
330
+ break if e['reason']
331
+
332
+ next unless e['diagnosis'] =~ ReFailure[r]
333
+ e['reason'] = r
334
+ break
335
+ end
336
+
337
+ unless e['reason']
338
+ ReLDAP.each_key do |r|
339
+ # Verify each regular expression of LDAP errors
340
+ next unless e['diagnosis'] =~ ReLDAP[r]
341
+ e['reason'] = r
342
+ break
343
+ end
344
+ end
345
+
346
+ unless e['reason']
347
+ e['reason'] = 'expired' if e['diagnosis'] =~ ReDelayed
348
+ end
349
+ end
350
+ end
351
+
352
+ e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
353
+ e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
354
+ e['action'] = 'failed' if e['status'] =~ /\A[45]/
355
+ e.each_key { |a| e[a] ||= '' }
356
+ end
357
+
358
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
359
+ end
360
+
361
+ end
362
+ end
363
+ end
364
+ end
365
+
@@ -0,0 +1,208 @@
1
+ module Sisimai
2
+ module MTA
3
+ # Sisimai::MTA::X5 parses a bounce email which created by Unknown MTA #5.
4
+ # Methods in the module are called from only Sisimai::Message.
5
+ module X5
6
+ # Imported from p5-Sisimail/lib/Sisimai/MTA/X5.pm
7
+ class << self
8
+ require 'sisimai/mta'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :from => %r/\bTWFpbCBEZWxpdmVyeSBTdWJzeXN0ZW0\b/,
13
+ :to => %r/\bNotificationRecipients\b/,
14
+ }
15
+ Re1 = {
16
+ :begin => %r|\AContent-Type: message/delivery-status|,
17
+ :rfc822 => %r|\AContent-Type: message/rfc822|,
18
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
19
+ }
20
+ Indicators = Sisimai::MTA.INDICATORS
21
+ LongFields = Sisimai::RFC5322.LONGFIELDS
22
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
23
+
24
+ def description; return 'Unknown MTA #5'; end
25
+ def smtpagent; return 'X5'; end
26
+ def headerlist; return []; end
27
+ def pattern; return Re0; end
28
+
29
+ # Parse bounce messages from Unknown MTA #5
30
+ # @param [Hash] mhead Message header of a bounce email
31
+ # @options mhead [String] from From header
32
+ # @options mhead [String] date Date header
33
+ # @options mhead [String] subject Subject header
34
+ # @options mhead [Array] received Received headers
35
+ # @options mhead [String] others Other required headers
36
+ # @param [String] mbody Message body of a bounce email
37
+ # @return [Hash, Nil] Bounce data list and message/rfc822
38
+ # part or nil if it failed to parse or
39
+ # the arguments are missing
40
+ def scan(mhead, mbody)
41
+ return nil unless mhead
42
+ return nil unless mbody
43
+ match = 0
44
+
45
+ # To: "NotificationRecipients" <...>
46
+ match += 1 if mhead['to'] && mhead['to'] =~ Re0[:to]
47
+
48
+ require 'sisimai/mime'
49
+ if mhead['from'] =~ Re0[:from]
50
+ # From: "=?iso-2022-jp?B?TWFpbCBEZWxpdmVyeSBTdWJzeXN0ZW0=?=" <...>
51
+ # Mail Delivery Subsystem
52
+ mhead['from'].split(' ').each do |f|
53
+ # Check each element of From: header
54
+ next unless Sisimai::MIME.is_mimeencoded(f)
55
+ match += 1 if Sisimai::MIME.mimedecode([f]) =~ /Mail Delivery Subsystem/
56
+ break
57
+ end
58
+ end
59
+
60
+ if Sisimai::MIME.is_mimeencoded(mhead['subject'])
61
+ # Subject: =?iso-2022-jp?B?UmV0dXJuZWQgbWFpbDogVXNlciB1bmtub3du?=
62
+ plain = Sisimai::MIME.mimedecode([mhead['subject']])
63
+ match += 1 if plain =~ /Mail Delivery Subsystem/
64
+ end
65
+ return nil if match < 2
66
+
67
+ dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
68
+ hasdivided = mbody.split("\n")
69
+ havepassed = ['']
70
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
71
+ rfc822part = '' # (String) message/rfc822-headers part
72
+ previousfn = '' # (String) Previous field name
73
+ readcursor = 0 # (Integer) Points the current cursor position
74
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
75
+ v = nil
76
+
77
+ hasdivided.each do |e|
78
+ # Save the current line for the next loop
79
+ havepassed << e; p = havepassed[-2]
80
+
81
+ if readcursor == 0
82
+ # Beginning of the bounce message or delivery status part
83
+ if e =~ Re1[:begin]
84
+ readcursor |= Indicators[:'deliverystatus']
85
+ next
86
+ end
87
+ end
88
+
89
+ if readcursor & Indicators[:'message-rfc822'] == 0
90
+ # Beginning of the original message part
91
+ if e =~ Re1[:rfc822]
92
+ readcursor |= Indicators[:'message-rfc822']
93
+ next
94
+ end
95
+ end
96
+
97
+ if readcursor & Indicators[:'message-rfc822'] > 0
98
+ # Before "message/rfc822"
99
+ next if e.empty?
100
+ v = dscontents[-1]
101
+
102
+ if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
103
+ # Final-Recipient: RFC822; kijitora@example.jp
104
+ if v['recipient']
105
+ # There are multiple recipient addresses in the message body.
106
+ dscontents << Sisimai::MTA.DELIVERYSTATUS
107
+ v = dscontents[-1]
108
+ end
109
+ v['recipient'] = cv[1]
110
+ recipients += 1
111
+
112
+ elsif cv = e.match(/\A[Xx]-[Aa]ctual-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/) ||
113
+ cv = e.match(/\A[Oo]riginal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
114
+ # X-Actual-Recipient: RFC822; kijitora@example.co.jp
115
+ # Original-Recipient: rfc822;kijitora@example.co.jp
116
+ v['alias'] = cv[1]
117
+
118
+ elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
119
+ # Action: failed
120
+ v['action'] = cv[1].downcase
121
+
122
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
123
+ # Status: 5.1.1
124
+ v['status'] = cv[1]
125
+
126
+ elsif cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
127
+ # Reporting-MTA: dns; mx.example.jp
128
+ v['lhost'] = cv[1].downcase
129
+
130
+ elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
131
+ # Remote-MTA: DNS; mx.example.jp
132
+ v['rhost'] = cv[1].downcase
133
+
134
+ elsif cv = e.match(/\A[Ll]ast-[Aa]ttempt-[Dd]ate:[ ]*(.+)\z/)
135
+ # Last-Attempt-Date: Fri, 14 Feb 2014 12:30:08 -0500
136
+ v['date'] = cv[1]
137
+
138
+ else
139
+ # Get an error message from Diagnostic-Code: field
140
+ if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
141
+ # Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
142
+ v['spec'] = cv[1].downcase
143
+ v['diagnosis'] = cv[2]
144
+
145
+ elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
146
+ # Continued line of the value of Diagnostic-Code header
147
+ v['diagnosis'] ||= ''
148
+ v['diagnosis'] += ' ' + cv[1]
149
+ havepassed[-1] = 'Diagnostic-Code: ' + e
150
+ end
151
+ end
152
+ else
153
+ # After "message/rfc822"
154
+ next if recipients == 0
155
+ next if readcursor & Indicators['deliverystatus'] == 0
156
+
157
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
158
+ # Get required headers only
159
+ lhs = cv[1].downcase
160
+ previousfn = ''
161
+ next unless RFC822Head.key?(lhs)
162
+
163
+ previousfn = lhs
164
+ rfc822part += e + "\n"
165
+
166
+ elsif e =~ /\A[ \t]+/
167
+ # Continued line from the previous line
168
+ next if rfc822next[previousfn]
169
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
170
+
171
+ else
172
+ # Check the end of headers in rfc822 part
173
+ next unless LongFields.key?(previousfn)
174
+ next unless e.empty?
175
+ rfc822next[previousfn] = true
176
+ end
177
+ end
178
+ end
179
+
180
+ return nil if recipients == 0
181
+ require 'sisimai/string'
182
+ require 'sisimai/smtp/status'
183
+
184
+ dscontents.map do |e|
185
+ e['agent'] = Sisimai::MTA::X5.smtpagent
186
+
187
+ if mhead['received'].size > 0
188
+ # Get localhost and remote host name from Received header.
189
+ r0 = mhead['received']
190
+ %w|lhost rhost|.each { |a| e[a] ||= '' }
191
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
192
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
193
+ end
194
+ e['diagnosis'] ||= Sisimai::String.sweep(e['diagnosis'])
195
+ e['status'] ||= Sisimai::SMTP::Status.find(e['diagnosis'])
196
+ e['spec'] ||= e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
197
+ e['action'] ||= 'failed' if e['status'] =~ /\A[45]/
198
+ e.each_key { |a| e[a] ||= '' }
199
+ end
200
+
201
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
202
+ end
203
+
204
+ end
205
+ end
206
+ end
207
+ end
208
+