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