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