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,69 @@
1
+ module Sisimai
2
+ module Reason
3
+ # Sisimai::Reason::SystemError checks the bounce reason is "systemerror" or
4
+ # not. This class is called only Sisimai::Reason class.
5
+ #
6
+ # This is the error that an email has bounced due to system error on the
7
+ # remote host such as LDAP connection failure or other internal system error.
8
+ #
9
+ # <kijitora@example.net>:
10
+ # Unable to contact LDAP server. (#4.4.3)I'm not going to try again; this
11
+ # message has been in the queue too long.
12
+ module SystemError
13
+ # Imported from p5-Sisimail/lib/Sisimai/Reason/SystemError.pm
14
+ class << self
15
+ def text; return 'systemerror'; end
16
+
17
+ # Try to match that the given text and regular expressions
18
+ # @param [String] argv1 String to be matched with regular expressions
19
+ # @return [True,False] false: Did not match
20
+ # true: Matched
21
+ def match(argv1)
22
+ return nil unless argv1
23
+ regex = %r{(?>
24
+ can[']t[ ]create[ ]user[ ]output[ ]file
25
+ |Internal[ ](?:
26
+ error[ ]reading[ ]data # Microsoft
27
+ |server[ ]error:[ ]Operation[ ]now[ ]in[ ]progress # Microsoft
28
+ )
29
+ |interrupted[ ]system[ ]call
30
+ |it[ ](?:
31
+ encountered[ ]an[ ]error[ ]while[ ]being[ ]processed
32
+ |would[ ]create[ ]a[ ]mail[ ]loop
33
+ )
34
+ |local[ ](?:
35
+ configuration[ ]error
36
+ |error[ ]in[ ]processing
37
+ )
38
+ |loop[ ]was[ ]found[ ]in[ ]the[ ]Mail[ ]eXchanger
39
+ |mail[ ](?:
40
+ for[ ].+[ ]loops[ ]back[ ]to[ ]myself
41
+ |system[ ]configuration[ ]error
42
+ )
43
+ |server[ ]configuration[ ]error
44
+ |service[ ]currently[ ]unavailable
45
+ |system[ ]config[ ]error
46
+ |timeout[ ]waiting[ ]for[ ]input
47
+ )
48
+ }ix
49
+
50
+ return true if argv1 =~ regex
51
+ return false
52
+ end
53
+
54
+ # The bounce reason is system error or not
55
+ # @param [Sisimai::Data] argvs Object to be detected the reason
56
+ # @return [True,False] true: is system error
57
+ # false: is not system error
58
+ # @see http://www.ietf.org/rfc/rfc2822.txt
59
+ def true(_argvs)
60
+ return nil
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+
69
+
@@ -0,0 +1,45 @@
1
+ module Sisimai
2
+ module Reason
3
+ # Sisimai::Reason::SystemFull checks the bounce reason is "systemfull" or
4
+ # not. This class is called only Sisimai::Reason class.
5
+ #
6
+ # This is the error that a destination mail server's disk (or spool) is full.
7
+ # Sisimai will set C<systemfull> to the reason of email bounce if the value
8
+ # of Status: field in a bounce email is "4.3.1" or "5.3.1".
9
+ module SystemFull
10
+ # Imported from p5-Sisimail/lib/Sisimai/Reason/SystemFull.pm
11
+ class << self
12
+ def text; return 'systemfull'; end
13
+
14
+ # Try to match that the given text and regular expressions
15
+ # @param [String] argv1 String to be matched with regular expressions
16
+ # @return [True,False] false: Did not match
17
+ # true: Matched
18
+ def match(argv1)
19
+ return nil unless argv1
20
+ regex = %r{(?:
21
+ mail[ ]system[ ]full
22
+ |requested[ ]mail[ ]action[ ]aborted:[ ]exceeded[ ]storage[ ]allocation # MS Exchange
23
+ )
24
+ }ix
25
+
26
+ return true if argv1 =~ regex
27
+ return false
28
+ end
29
+
30
+ # The bounce reason is system full or not
31
+ # @param [Sisimai::Data] argvs Object to be detected the reason
32
+ # @return [True,False] true: is system full
33
+ # false: is not system full
34
+ # @see http://www.ietf.org/rfc/rfc2822.txt
35
+ def true(_argvs)
36
+ return nil
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+
@@ -0,0 +1,73 @@
1
+ module Sisimai
2
+ module Reason
3
+ # Sisimai::Reason::TooManyConn checks the bounce reason is "toomanyconn" or
4
+ # not. This class is called only Sisimai::Reason class.
5
+ #
6
+ # This is the error that SMTP connection was rejected temporarily due to too
7
+ # many concurrency connections to the remote server. This reason has added
8
+ # in Sisimai 4.1.26 and does not exist in any version of bounceHammer.
9
+ #
10
+ # <kijitora@example.ne.jp>: host mx02.example.ne.jp[192.0.1.20] said:
11
+ # 452 4.3.2 Connection rate limit exceeded. (in reply to MAIL FROM command)
12
+ module TooManyConn
13
+ # Imported from p5-Sisimail/lib/Sisimai/Reason/TooManyConn.pm
14
+ class << self
15
+ def text; return 'toomanyconn'; end
16
+
17
+ # Try to match that the given text and regular expressions
18
+ # @param [String] argv1 String to be matched with regular expressions
19
+ # @return [True,False] false: Did not match
20
+ # true: Matched
21
+ def match(argv1)
22
+ return nil unless argv1
23
+ regex = %r{(?>
24
+ All[ ]available[ ]IPs[ ]are[ ]at[ ]maximum[ ]connection[ ]limit # SendGrid
25
+ |connection[ ]rate[ ]limit[ ]exceeded
26
+ |no[ ]IPs[ ]available[ ][-][ ].+[ ]exceeds[ ]per[-]domain[ ]connection[ ]limit[ ]for
27
+ |Too[ ]many[ ](?:
28
+ connections
29
+ |connections[ ]from[ ]your[ ]host[.] # Microsoft
30
+ |concurrent[ ]SMTP[ ]connections # Microsoft
31
+ |SMTP[ ]sessions[ ]for[ ]this[ ]host # Sendmail(daemon.c)
32
+ )
33
+ )
34
+ }ix
35
+
36
+ return true if argv1 =~ regex
37
+ return false
38
+ end
39
+
40
+ # Rejected by domain or address filter ?
41
+ # @param [Sisimai::Data] argvs Object to be detected the reason
42
+ # @return [True,False] true: is filtered
43
+ # false: is not filtered
44
+ # @see http://www.ietf.org/rfc/rfc2822.txt
45
+ def true(argvs)
46
+ return nil unless argvs
47
+ return nil unless argvs.is_a? Sisimai::Data
48
+ return true if argvs.reason == Sisimai::Reason::TooManyConn.text
49
+
50
+ require 'sisimai/smtp/status'
51
+ statuscode = argvs.deliverystatus || ''
52
+ diagnostic = argvs.diagnosticcode || ''
53
+ reasontext = Sisimai::Reason::TooManyConn.text
54
+ tempreason = Sisimai::SMTP::Status.name(statuscode)
55
+ v = false
56
+
57
+ if tempreason == reasontext
58
+ # Delivery status code points "toomanyconn".
59
+ v = true
60
+ else
61
+ # Matched with a pattern in this class
62
+ v = true if Sisimai::Reason::TooManyConn.match(diagnostic)
63
+ end
64
+ return v
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+
73
+
@@ -0,0 +1,194 @@
1
+ module Sisimai
2
+ module Reason
3
+ # Sisimai::Reason::UserUnknown checks the bounce reason is "userunknown" or
4
+ # not. This class is called only Sisimai::Reason class.
5
+ #
6
+ # This is the error that a local part (Left hand side of @ sign) of a recipient's
7
+ # email address does not exist. In many case, a user has changed internet service
8
+ # provider, or has quit company, or the local part is misspelled. Sisimai will
9
+ # set "userunknown" to the reason of email bounce if the value of Status: field
10
+ # in a bounce email is "5.1.1", or connection was refused at SMTP RCPT command,
11
+ # or the contents of Diagnostic-Code: field represents that it is unknown user.
12
+ #
13
+ # <kijitora@example.co.jp>: host mx01.example.co.jp[192.0.2.8] said:
14
+ # 550 5.1.1 Address rejected kijitora@example.co.jp (in reply to
15
+ # RCPT TO command)
16
+ module UserUnknown
17
+ # Imported from p5-Sisimail/lib/Sisimai/Reason/UserUnknown.pm
18
+ class << self
19
+ def text; return 'userunknown'; end
20
+
21
+ # Try to match that the given text and regular expressions
22
+ # @param [String] argv1 String to be matched with regular expressions
23
+ # @return [True,False] false: Did not match
24
+ # true: Matched
25
+ def match(argv1)
26
+ return nil unless argv1
27
+ regex = %r{(?>
28
+ .+[ ]user[ ]unknown
29
+ |[#]5[.]1[.]1[ ]bad[ ]address
30
+ |[<].+[>][ ]not[ ]found
31
+ |address[ ]does[ ]not[ ]exist
32
+ |address[ ]unknown
33
+ |archived[ ]recipient
34
+ |BAD[-_ ]RECIPIENT
35
+ |destination[ ]addresses[ ]were[ ]unknown
36
+ |destination[ ]server[ ]rejected[ ]recipients
37
+ |email[ ]address[ ]does[ ]not[ ]exist
38
+ |invalid[ ](?:
39
+ mailbox[ ]path
40
+ |recipient # Linkedin
41
+ )
42
+ |is[ ]not[ ](?:
43
+ a[ ]known[ ]user
44
+ |an[ ]active[ ]address[ ]at[ ]this[ ]host
45
+ )
46
+ |mailbox[ ](?:
47
+ not[ ]present
48
+ |not[ ]found
49
+ |unavailable
50
+ )
51
+ |no[ ](?:
52
+ account[ ]by[ ]that[ ]name[ ]here
53
+ |mail[ ]box[ ]available[ ]for[ ]this[ ]user
54
+ |mailbox[ ]found
55
+ |matches[ ]to[ ]nameserver[ ]query
56
+ |such[ ](?:
57
+ mailbox
58
+ |person[ ]at[ ]this[ ]address
59
+ |recipient
60
+ |user(?:[ ]here)?
61
+ )
62
+ |[ ].+[ ]in[ ]name[ ]directory
63
+ |valid[ ]recipients[,][ ]bye # Microsoft
64
+ )
65
+ |non[- ]?existent[ ]user
66
+ |not[ ](?:
67
+ a[ ]valid[ ]user[ ]here
68
+ |a[ ]local[ ]address
69
+ )
70
+ |rcpt[ ][<].+[>][ ]does[ ]not[ ]exist
71
+ |recipient[ ](?:
72
+ .+[ ]was[ ]not[ ]found[ ]in
73
+ |address[ ]rejected:[ ](?:
74
+ access[ ]denied
75
+ |invalid[ ]user
76
+ |user[ ].+[ ]does[ ]not[ ]exist
77
+ |user[ ]unknown[ ]in[ ].+[ ]table
78
+ |unknown[ ]user
79
+ )
80
+ |does[ ]not[ ]exist(?:[ ]on[ ]this[ ]system)?
81
+ |is[ ]not[ ]local
82
+ |not[ ]found
83
+ |not[ ]OK
84
+ |unknown
85
+ )
86
+ |requested[ ]action[ ]not[ ]taken:[ ]mailbox[ ]unavailable
87
+ |RESOLVER[.]ADR[.]RecipNotFound # Microsoft
88
+ |said:[ ]550[-[ ]]5[.]1[.]1[ ].+[ ]user[ ]unknown[ ]
89
+ |sorry,[ ](?:
90
+ user[ ]unknown
91
+ |badrcptto
92
+ |no[ ]mailbox[ ]here[ ]by[ ]that[ ]name
93
+ )
94
+ |the[ ](?:
95
+ following[ ]recipients[ ]was[ ]undeliverable
96
+ |user[']s[ ]email[ ]name[ ]is[ ]not[ ]found
97
+ )
98
+ |this[ ](?:
99
+ address[ ]no[ ]longer[ ]accepts[ ]mail
100
+ |email[ ]address[ ]is[ ]wrong[ ]or[ ]no[ ]longer[ ]valid
101
+ |user[ ]doesn[']?t[ ]have[ ]a[ ].+[ ]account
102
+ )
103
+ |unknown[ ](?:
104
+ address
105
+ |e[-]?mail[ ]address
106
+ |local[- ]part
107
+ |mailbox
108
+ |recipient
109
+ |user
110
+ )
111
+ |user[ ](?:
112
+ .+[ ]was[ ]not[ ]found
113
+ |.+[ ]does[ ]not[ ]exist
114
+ |does[ ]not[ ]exist
115
+ |missing[ ]home[ ]directory
116
+ |not[ ]found # 550 User not found. See http://mail.bigmir.net/err/2/
117
+ |not[ ]known
118
+ |unknown
119
+ )
120
+ |vdeliver:[ ]invalid[ ]or[ ]unknown[ ]virtual[ ]user
121
+ )
122
+ }ix
123
+
124
+ return true if argv1 =~ regex
125
+ return false
126
+ end
127
+
128
+ # Whether the address is "userunknown" or not
129
+ # @param [Sisimai::Data] argvs Object to be detected the reason
130
+ # @return [True,False] true: is unknown user
131
+ # false: is not unknown user.
132
+ # @see http://www.ietf.org/rfc/rfc2822.txt
133
+ def true(argvs)
134
+ return nil unless argvs
135
+ return nil unless argvs.is_a? Sisimai::Data
136
+ return true if argvs.reason == Sisimai::Reason::UserUnknown.text
137
+
138
+ require 'sisimai/smtp/status'
139
+ prematches = %w|NoRelaying Blocked MailboxFull HasMoved|
140
+ matchother = false
141
+ statuscode = argvs.deliverystatus || ''
142
+ diagnostic = argvs.diagnosticcode || ''
143
+ reasontext = Sisimai::Reason::UserUnknown.text
144
+ tempreason = Sisimai::SMTP::Status.name(statuscode)
145
+ v = false
146
+
147
+ return false if tempreason == 'suspend'
148
+
149
+ if tempreason == reasontext
150
+ # *.1.1 = 'Bad destination mailbox address'
151
+ # Status: 5.1.1
152
+ # Diagnostic-Code: SMTP; 550 5.1.1 <***@example.jp>:
153
+ # Recipient address rejected: User unknown in local recipient table
154
+ prematches.each do |e|
155
+ # Check the value of "Diagnostic-Code" with other error patterns.
156
+ p = 'Sisimai::Reason::' + e
157
+ r = nil
158
+ begin
159
+ require p.downcase.gsub('::', '/')
160
+ r = Module.const_get(p)
161
+ rescue
162
+ warn '***warning: Failed to load ' + p
163
+ next
164
+ end
165
+
166
+ if r.match(diagnostic)
167
+ # Match with reason defined in Sisimai::Reason::* except UserUnknown.
168
+ matchother = true
169
+ break
170
+ end
171
+ end
172
+
173
+ # Did not match with other message patterns
174
+ v = true unless matchother
175
+
176
+ else
177
+ # Check the last SMTP command of the session.
178
+ if argvs.smtpcommand == 'RCPT'
179
+ # When the SMTP command is not "RCPT", the session rejected by other
180
+ # reason, maybe.
181
+ v = true if Sisimai::Reason::UserUnknown.match(diagnostic)
182
+ end
183
+ end
184
+
185
+ return v
186
+ end
187
+
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+
194
+
@@ -0,0 +1,24 @@
1
+ module Sisimai
2
+ # Sisimai::RFC2606 checks that the domain part of the email address in the
3
+ # argument is reserved or not.
4
+ module RFC2606
5
+ # Imported from p5-Sisimail/lib/Sisimai/RFC2606.pm
6
+ class << self
7
+ # Whether domain part is Reserved or not
8
+ # @param [String] dpart Domain part
9
+ # @return [True,False] true: is Reserved top level domain
10
+ # false: is NOT reserved top level domain
11
+ # @see http://www.ietf.org/rfc/rfc2606.txt
12
+ def is_reserved(argv = '')
13
+ return false unless argv
14
+ return false unless argv.is_a?(::String)
15
+
16
+ return true if argv =~ /[.](?:test|example|invalid|localhost)\z/
17
+ return true if argv =~ /example[.](?:com|net|org)\z/
18
+ return true if argv =~ /example[.]jp\z/
19
+ return true if argv =~ /example[.](?:ac|ad|co|ed|go|gr|lg|ne|or)[.]jp\z/
20
+ return false
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,497 @@
1
+ module Sisimai
2
+ # Sisimai::RFC3464 - bounce mail parser class for Fallback.
3
+ module RFC3464
4
+ # Imported from p5-Sisimail/lib/Sisimai/RFC3464.pm
5
+ class << self
6
+ require 'sisimai/mta'
7
+ require 'sisimai/rfc5322'
8
+
9
+ # http://tools.ietf.org/html/rfc3464
10
+ Re0 = {
11
+ :'from' => %r/\b(?:postmaster|mailer-daemon|root)[@]/i,
12
+ :'return-path' => %r/(?:[<][>]|mailer-daemon)/i,
13
+ :'subject' => %r{(?>
14
+ delivery[ ](?:failed|failure|report)
15
+ |failure[ ]notice
16
+ |mail[ ](?:delivery|error)
17
+ |non[-]delivery
18
+ |returned[ ]mail
19
+ |undeliverable[ ]mail
20
+ |Warning:[ ]
21
+ )
22
+ }xi,
23
+ }
24
+ Re1 = {
25
+ :begin => %r{\A(?>
26
+ Content-Type:[ ]*(?:
27
+ message/delivery-status
28
+ |message/disposition-notification
29
+ |text/plain;[ ]charset=
30
+ )
31
+ |The[ ]original[ ]message[ ]was[ ]received[ ]at[ ]
32
+ |This[ ]report[ ]relates[ ]to[ ]your[ ]message
33
+ |Your[ ]message[ ]was[ ]not[ ]delivered[ ]to[ ]the[ ]following[ ]recipients
34
+ )
35
+ }xi,
36
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
37
+ :rfc822 => %r{\A(?>
38
+ Content-Type:[ ]*(?:message/rfc822|text/rfc822-headers)
39
+ |Return-Path:[ ]*[<].+[>]\z
40
+ )\z
41
+ }xi,
42
+ :error => %r/\A(?:[45]\d\d[ \t]+|[<][^@]+[@][^@]+[>]:?[ \t]+)/i,
43
+ :command => %r/[ ](RCPT|MAIL|DATA)[ ]+command\b/,
44
+ }
45
+
46
+ Indicators = Sisimai::MTA.INDICATORS
47
+ LongFields = Sisimai::RFC5322.LONGFIELDS
48
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
49
+
50
+ def description; 'Fallback Module for MTAs'; end
51
+ def smtpagent; 'RFC3464'; end
52
+ def pattern; return Re0; end
53
+ def headerlist; return []; end
54
+
55
+ # Detect an error for RFC3464
56
+ # @param [Hash] mhead Message header of a bounce email
57
+ # @options mhead [String] from From header
58
+ # @options mhead [String] date Date header
59
+ # @options mhead [String] subject Subject header
60
+ # @options mhead [Array] received Received headers
61
+ # @options mhead [String] others Other required headers
62
+ # @param [String] mbody Message body of a bounce email
63
+ # @return [Hash, Nil] Bounce data list and message/rfc822 part
64
+ # or Undef if it failed to parse or the
65
+ def scan(mhead, mbody)
66
+ return nil unless mhead
67
+ return nil unless mbody
68
+ return nil if mhead.keys.size == 0
69
+ return nil if mbody.empty?
70
+
71
+ require 'sisimai/mda'
72
+ require 'sisimai/address'
73
+
74
+ dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
75
+ hasdivided = mbody.split("\n")
76
+ havepassed = ['']
77
+ scannedset = Sisimai::MDA.scan(mhead, mbody)
78
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
79
+ rfc822part = '' # (String) message/rfc822-headers part
80
+ previousfn = '' # (String) Previous field name
81
+ readcursor = 0 # (Integer) Points the current cursor position
82
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
83
+ connheader = {
84
+ 'date' => nil, # The value of Arrival-Date header
85
+ 'rhost' => nil, # The value of Reporting-MTA header
86
+ 'lhost' => nil, # The value of Received-From-MTA header
87
+ }
88
+ v = nil
89
+
90
+ hasdivided.each do |e|
91
+ # Save the current line for the next loop
92
+ havepassed << e; p = havepassed[-2]
93
+
94
+ if readcursor == 0
95
+ # Beginning of the bounce message or delivery status part
96
+ if e =~ Re1[:begin]
97
+ readcursor |= Indicators[:'deliverystatus']
98
+ next
99
+ end
100
+ end
101
+
102
+ if readcursor & Indicators[:'message-rfc822'] > 0
103
+ # Beginning of the original message part
104
+ if e =~ Re1[:rfc822]
105
+ readcursor |= Indicators[:'message-rfc822']
106
+ next
107
+ end
108
+ end
109
+
110
+ if readcursor & Indicators[:'message-rfc822'] > 0
111
+ # After "message/rfc822"
112
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
113
+ # Get required headers only
114
+ lhs = cv[1].downcase
115
+ previousfn = ''
116
+ next unless RFC822Head.key?(lhs)
117
+
118
+ previousfn = lhs
119
+ rfc822part += e + "\n"
120
+
121
+ elsif e =~ /\A[ \t]+/
122
+ # Continued line from the previous line
123
+ next if rfc822next[previousfn]
124
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
125
+
126
+ else
127
+ # Check the end of headers in rfc822 part
128
+ next unless LongFields.key?(previousfn)
129
+ next if e.size > 0
130
+ rfc822next[previousfn] = true
131
+ end
132
+
133
+ else
134
+ # Before "message/rfc822"
135
+ next unless readcursor & Indicators[:'deliverystatus'] > 0
136
+ next unless e.size > 0
137
+
138
+ v = dscontents[-1]
139
+ if cv = e.match(/\A(?:[Ff]inal|[Oo]riginal)-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/) ||
140
+ cv = e.match(/\A(?:[Ff]inal|[Oo]riginal)-[Rr]ecipient:[ ]*([^ ]+)\z/)
141
+ # 2.3.2 Final-Recipient field
142
+ # The Final-Recipient field indicates the recipient for which this set
143
+ # of per-recipient fields applies. This field MUST be present in each
144
+ # set of per-recipient data.
145
+ # The syntax of the field is as follows:
146
+ #
147
+ # final-recipient-field =
148
+ # "Final-Recipient" ":" address-type ";" generic-address
149
+ #
150
+ # 2.3.1 Original-Recipient field
151
+ # The Original-Recipient field indicates the original recipient address
152
+ # as specified by the sender of the message for which the DSN is being
153
+ # issued.
154
+ #
155
+ # original-recipient-field =
156
+ # "Original-Recipient" ":" address-type ";" generic-address
157
+ #
158
+ # generic-address = *text
159
+ x = v['recipienet'] || ''
160
+ y = Sisimai::Address.s3s4(cv[1])
161
+
162
+ if x.size > 0 && x != y
163
+ # There are multiple recipient addresses in the message body.
164
+ dscontents << Sisimai::MTA.DELIVERYSTATUS
165
+ v = dscontents[-1]
166
+ end
167
+ v['recipient'] = y
168
+ recipients += 1
169
+
170
+ elsif cv = e.match(/\A[Xx]-[Aa]ctual-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
171
+ # X-Actual-Recipient:
172
+ if cv[1] =~ /[ \t]+/
173
+ # X-Actual-Recipient: RFC822; |IFS=' ' && exec procmail -f- || exit 75 ...
174
+
175
+ else
176
+ # X-Actual-Recipient: rfc822; kijitora@neko.example.jp
177
+ v['alias'] = cv[1]
178
+ end
179
+
180
+ elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
181
+ # 2.3.3 Action field
182
+ # The Action field indicates the action performed by the Reporting-MTA
183
+ # as a result of its attempt to deliver the message to this recipient
184
+ # address. This field MUST be present for each recipient named in the
185
+ # DSN.
186
+ # The syntax for the action-field is:
187
+ #
188
+ # action-field = "Action" ":" action-value
189
+ # action-value =
190
+ # "failed" / "delayed" / "delivered" / "relayed" / "expanded"
191
+ #
192
+ # The action-value may be spelled in any combination of upper and lower
193
+ # case characters.
194
+ v['action'] = cv[1].downcase
195
+
196
+ if cv = v['action'].match(/\A([^ ]+)[ ]/)
197
+ # failed (bad destination mailbox address)
198
+ v['action'] = cv[1]
199
+ end
200
+
201
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
202
+ # 2.3.4 Status field
203
+ # The per-recipient Status field contains a transport-independent
204
+ # status code that indicates the delivery status of the message to that
205
+ # recipient. This field MUST be present for each delivery attempt
206
+ # which is described by a DSN.
207
+ #
208
+ # The syntax of the status field is:
209
+ #
210
+ # status-field = "Status" ":" status-code
211
+ # status-code = DIGIT "." 1*3DIGIT "." 1*3DIGIT
212
+ v['status'] = cv[1]
213
+
214
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d+[ ]+.+)\z/)
215
+ # Status: 553 Exceeded maximum inbound message size
216
+ v['alterrors'] = cv[1]
217
+
218
+ elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
219
+ # 2.3.5 Remote-MTA field
220
+ # The value associated with the Remote-MTA DSN field is a printable
221
+ # ASCII representation of the name of the "remote" MTA that reported
222
+ # delivery status to the "reporting" MTA.
223
+ #
224
+ # remote-mta-field = "Remote-MTA" ":" mta-name-type ";" mta-name
225
+ #
226
+ # NOTE: The Remote-MTA field preserves the "while talking to"
227
+ # information that was provided in some pre-existing nondelivery
228
+ # reports.
229
+ #
230
+ # This field is optional. It MUST NOT be included if no remote MTA was
231
+ # involved in the attempted delivery of the message to that recipient.
232
+ v['rhost'] = cv[1].downcase
233
+
234
+ elsif cv = e.match(/\A[Ll]ast-[Aa]ttempt-[Dd]ate:[ ]*(.+)\z/)
235
+ # 2.3.7 Last-Attempt-Date field
236
+ # The Last-Attempt-Date field gives the date and time of the last
237
+ # attempt to relay, gateway, or deliver the message (whether successful
238
+ # or unsuccessful) by the Reporting MTA. This is not necessarily the
239
+ # same as the value of the Date field from the header of the message
240
+ # used to transmit this delivery status notification: In cases where
241
+ # the DSN was generated by a gateway, the Date field in the message
242
+ # header contains the time the DSN was sent by the gateway and the DSN
243
+ # Last-Attempt-Date field contains the time the last delivery attempt
244
+ # occurred.
245
+ #
246
+ # last-attempt-date-field = "Last-Attempt-Date" ":" date-time
247
+ v['date'] = cv[1]
248
+
249
+ else
250
+ if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
251
+ # 2.3.6 Diagnostic-Code field
252
+ # For a "failed" or "delayed" recipient, the Diagnostic-Code DSN field
253
+ # contains the actual diagnostic code issued by the mail transport.
254
+ # Since such codes vary from one mail transport to another, the
255
+ # diagnostic-type sub-field is needed to specify which type of
256
+ # diagnostic code is represented.
257
+ #
258
+ # diagnostic-code-field =
259
+ # "Diagnostic-Code" ":" diagnostic-type ";" *text
260
+ v['spec'] = cv[1].upcase
261
+ v['diagnosis'] = cv[2]
262
+
263
+ elsif cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+)\z/)
264
+ # No value of "diagnostic-type"
265
+ # Diagnostic-Code: 554 ...
266
+ v['diagnosis'] = cv[1]
267
+
268
+ elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
269
+ # Continued line of the value of Diagnostic-Code header
270
+ v['diagnosis'] += ' ' + cv[1]
271
+ e = 'Diagnostic-Code: ' + e
272
+
273
+ else
274
+ if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
275
+ # 2.2.2 The Reporting-MTA DSN field
276
+ #
277
+ # reporting-mta-field =
278
+ # "Reporting-MTA" ":" mta-name-type ";" mta-name
279
+ # mta-name = *text
280
+ #
281
+ # The Reporting-MTA field is defined as follows:
282
+ #
283
+ # A DSN describes the results of attempts to deliver, relay, or gateway
284
+ # a message to one or more recipients. In all cases, the Reporting-MTA
285
+ # is the MTA that attempted to perform the delivery, relay, or gateway
286
+ # operation described in the DSN. This field is required.
287
+ connheader['rhost'] ||= cv[1].downcase
288
+
289
+ elsif cv = e.match(/\A[Rr]eceived-[Ff]rom-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
290
+ # 2.2.4 The Received-From-MTA DSN field
291
+ # The optional Received-From-MTA field indicates the name of the MTA
292
+ # from which the message was received.
293
+ #
294
+ # received-from-mta-field =
295
+ # "Received-From-MTA" ":" mta-name-type ";" mta-name
296
+ #
297
+ # If the message was received from an Internet host via SMTP, the
298
+ # contents of the mta-name sub-field SHOULD be the Internet domain name
299
+ # supplied in the HELO or EHLO command, and the network address used by
300
+ # the SMTP client SHOULD be included as a comment enclosed in
301
+ # parentheses. (In this case, the MTA-name-type will be "dns".)
302
+ connheader['lhost'] = cv[1].downcase
303
+
304
+ elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
305
+ # 2.2.5 The Arrival-Date DSN field
306
+ # The optional Arrival-Date field indicates the date and time at which
307
+ # the message arrived at the Reporting MTA. If the Last-Attempt-Date
308
+ # field is also provided in a per-recipient field, this can be used to
309
+ # determine the interval between when the message arrived at the
310
+ # Reporting MTA and when the report was issued for that recipient.
311
+ #
312
+ # arrival-date-field = "Arrival-Date" ":" date-time
313
+ connheader['date'] = cv[1]
314
+
315
+ else
316
+ # Get error message
317
+ next if e =~ /\A[ -]+/
318
+ next unless e =~ Re1[:error]
319
+
320
+ # 500 User Unknown
321
+ # <kijitora@example.jp> Unknown
322
+ v['alterrors'] ||= ' '
323
+ v['alterrors'] += ' ' + e
324
+ end
325
+ end
326
+ end
327
+ end # End of if: rfc822
328
+
329
+ end
330
+
331
+ loop do
332
+ # Fallback, parse entire message body
333
+ break if recipients > 0
334
+ match = 0
335
+
336
+ # Failed to get a recipient address at code above
337
+ match += 1 if mhead['from'] =~ Re0[:from]
338
+ match += 1 if mhead['subject'] =~ Re0[:subject]
339
+
340
+ if mhead['return-path']
341
+ # Check the value of Return-Path of the message
342
+ match += 1 if mhead['return-path'] =~ Re0[:'return-path']
343
+ end
344
+ break unless match > 0
345
+
346
+ re_skip = %r{(?>
347
+ \A[-]+=
348
+ |\A\s+\z
349
+ |\A\s*--
350
+ |\A\s+[=]\d+
351
+ |\AHi[ ][!]
352
+ |Content-(?:Description|Disposition|Transfer-Encoding|Type):[ ]
353
+ |(?:name|charset)=
354
+ |--\z
355
+ |:[ ]--------
356
+ )
357
+ }xi
358
+ re_stop = %r{(?:
359
+ \AContent-Type:[ ]message/delivery-status
360
+ |\AHere[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]first[ ]part[ ]of[ ]the[ ]message
361
+ |\AThe[ ]non-delivered[ ]message[ ]is[ ]attached[ ]to[ ]this[ ]message.
362
+ |\AReceived:[ \t]*
363
+ |\AReceived-From-MTA:[ \t]*
364
+ |\AReporting-MTA:[ \t]*
365
+ |\AReturn-Path:[ \t]*
366
+ |\AA[ ]copy[ ]of[ ]the[ ]original[ ]message[ ]below[ ]this[ ]line:
367
+ |Attachment[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]message
368
+ |Below[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]original[ ]message:
369
+ |Below[ ]this[ ]line[ ]is[ ]a[ ]copy[ ]of[ ]the[ ]message
370
+ |Message[ ]contains[ ].+[ ]file[ ]attachments
371
+ |Message[ ]text[ ]follows:[ ]
372
+ |Original[ ]message[ ]follows
373
+ |The[ ]attachment[ ]contains[ ]the[ ]original[ ]mail[ ]headers
374
+ |The[ ]first[ ]\d+[ ]lines[ ]
375
+ |Unsent[ ]Message[ ]below
376
+ |Your[ ]message[ ]reads[ ][(]in[ ]part[)]:
377
+ )
378
+ }xi
379
+ re_addr = %r{(?:
380
+ \A\s*
381
+ |\A["].+["]\s*
382
+ |\A[ \t]*Recipient:[ \t]*
383
+ |\A[ ]*Address:[ ]
384
+ |addressed[ ]to[ ]
385
+ |Could[ ]not[ ]be[ ]delivered[ ]to:[ ]
386
+ |delivered[ ]to[ ]+
387
+ |delivery[ ]failed:[ ]
388
+ |Did[ ]not[ ]reach[ ]the[ ]following[ ]recipient:[ ]
389
+ |Error-for:[ ]+
390
+ |Failed[ ]Recipient:[ ]
391
+ |Failed[ ]to[ ]deliver[ ]to[ ]
392
+ |generated[ ]from[ ]
393
+ |Intended[ ]recipient:[ ]
394
+ |Mailbox[ ]is[ ]full:[ ]
395
+ |RCPT[ ]To:
396
+ |SMTP[ ]Server[ ][<].+[>][ ]rejected[ ]recipient[ ]
397
+ |The[ ]following[ ]recipients[ ]returned[ ]permanent[ ]errors:[ ]
398
+ |The[ ]following[ ]message[ ]to[ ]
399
+ |Unknown[ ]User:[ ]
400
+ |undeliverable[ ]to[ ]
401
+ |Undeliverable[ ]Address:[ ]*
402
+ |You[ ]sent[ ]mail[ ]to[ ]
403
+ |Your[ ]message[ ]to[ ]
404
+ )
405
+ ['"]?[<]?([^\s\n\r@=]+[@][-.0-9A-Za-z]+[.][0-9A-Za-z]+)[>]?['"]?
406
+ }xi
407
+
408
+ b = dscontents[-1]
409
+ mbody.split("\n").each do |e|
410
+ # Get the recipient's email address and error messages.
411
+ break if e =~ Re1[:endof]
412
+ break if e =~ Re1[:rfc822]
413
+ break if e =~ re_stop
414
+
415
+ next if e.size == 0
416
+ next if e =~ re_skip
417
+ next if e =~ /\A[*]/
418
+
419
+ if cv = e.match(re_addr)
420
+ # May be an email address
421
+ x = b['recipient'] || ''
422
+ y = Sisimai::Address.s3s4(cv[1])
423
+
424
+ if x.size > 0 && x != y
425
+ # There are multiple recipient addresses in the message body.
426
+ dscontents << Sisimai::MTA.DELIVERYSTATUS
427
+ b = dscontents[-1]
428
+ end
429
+ b['recipient'] = y
430
+ b['agent'] = self.smtpagent + '::Fallback'
431
+ recipients += 1
432
+
433
+ elsif cv = e.match(/[(]expanded[ ]from:[ ]([^@]+[@][^@]+)[)]/)
434
+ # (expanded from: neko@example.jp)
435
+ b['alias'] = Sisimai::Address.s3s4(cv[1])
436
+ end
437
+ b['diagnosis'] ||= ''
438
+ b['diagnosis'] += ' ' + e
439
+ end
440
+
441
+ break
442
+ end
443
+
444
+ return nil unless recipients > 0
445
+ require 'sisimai/string'
446
+ require 'sisimai/smtp/status'
447
+
448
+ dscontents.map do |e|
449
+ # Set default values if each value is empty.
450
+ connheader.each_key { |a| e[a] ||= connheader[a] || '' }
451
+
452
+ if e.key?('alterrors') && e['alterrors'].size > 0
453
+ # Copy alternative error message
454
+ e['diagnosis'] ||= e['alterrors']
455
+ if e['diagnosis'] =~ /\A[-]+/ || e['diagnosis'] =~ /__\z/
456
+ # Override the value of diagnostic code message
457
+ e['diagnosis'] = e['alterrors'] if e['alterrors'].size > 0
458
+ end
459
+ e.delete('alterrors')
460
+ end
461
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis']) || ''
462
+
463
+ if scannedset
464
+ # Make bounce data by the values returned from Sisimai::MDA->scan()
465
+ e['agent'] = scannedset['mda'] || self.smtpagent
466
+ e['reason'] = scannedset['reason'] || 'undefined'
467
+ e['diagnosis'] = scannedset['message'] if scannedset['message'].size > 0
468
+ e['command'] = ''
469
+
470
+ else
471
+ # Set the value of smtpagent
472
+ e['agent'] = self.smtpagent
473
+ end
474
+
475
+ e['status'] ||= Sisimai::SMTP::Status.find(e['diagnosis'])
476
+ if cv = e['diagnosis'].match(Re1[:command])
477
+ e['command'] = cv[1]
478
+ end
479
+
480
+ if mhead['received'].size > 0
481
+ # Get localhost and remote host name from Received header.
482
+ r0 = mhead['received']
483
+ %w|lhost rhost|.each { |a| e[a] ||= '' }
484
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
485
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
486
+ end
487
+
488
+ e['date'] ||= mhead['date']
489
+ e['spec'] ||= 'SMTP'
490
+ e.each_key { |a| e[a] ||= '' }
491
+ end
492
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
493
+ end
494
+
495
+ end
496
+ end
497
+ end