sisimai 4.14.2

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 (562) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +165 -0
  5. data/.travis.yml +21 -0
  6. data/ANALYTICAL-PRECISION +54 -0
  7. data/Changes +5 -0
  8. data/Developers.mk +129 -0
  9. data/Gemfile +9 -0
  10. data/LICENSE +26 -0
  11. data/Makefile +56 -0
  12. data/README.md +300 -0
  13. data/Rakefile +7 -0
  14. data/Repository.mk +69 -0
  15. data/bin/console +14 -0
  16. data/bin/setup +7 -0
  17. data/lib/sisimai.rb +60 -0
  18. data/lib/sisimai/address.rb +218 -0
  19. data/lib/sisimai/arf.rb +343 -0
  20. data/lib/sisimai/data.rb +413 -0
  21. data/lib/sisimai/data/json.rb +36 -0
  22. data/lib/sisimai/data/yaml.rb +32 -0
  23. data/lib/sisimai/datetime.rb +518 -0
  24. data/lib/sisimai/mail.rb +82 -0
  25. data/lib/sisimai/mail/maildir.rb +85 -0
  26. data/lib/sisimai/mail/mbox.rb +69 -0
  27. data/lib/sisimai/mail/stdin.rb +52 -0
  28. data/lib/sisimai/mda.rb +152 -0
  29. data/lib/sisimai/message.rb +510 -0
  30. data/lib/sisimai/mime.rb +127 -0
  31. data/lib/sisimai/msp.rb +54 -0
  32. data/lib/sisimai/msp/de/einsundeins.rb +174 -0
  33. data/lib/sisimai/msp/de/gmx.rb +197 -0
  34. data/lib/sisimai/msp/jp/biglobe.rb +179 -0
  35. data/lib/sisimai/msp/jp/ezweb.rb +292 -0
  36. data/lib/sisimai/msp/jp/kddi.rb +195 -0
  37. data/lib/sisimai/msp/ru/mailru.rb +306 -0
  38. data/lib/sisimai/msp/ru/yandex.rb +241 -0
  39. data/lib/sisimai/msp/uk/messagelabs.rb +250 -0
  40. data/lib/sisimai/msp/us/amazonses.rb +248 -0
  41. data/lib/sisimai/msp/us/aol.rb +234 -0
  42. data/lib/sisimai/msp/us/bigfoot.rb +243 -0
  43. data/lib/sisimai/msp/us/facebook.rb +306 -0
  44. data/lib/sisimai/msp/us/google.rb +357 -0
  45. data/lib/sisimai/msp/us/outlook.rb +243 -0
  46. data/lib/sisimai/msp/us/receivingses.rb +247 -0
  47. data/lib/sisimai/msp/us/sendgrid.rb +257 -0
  48. data/lib/sisimai/msp/us/verizon.rb +311 -0
  49. data/lib/sisimai/msp/us/yahoo.rb +178 -0
  50. data/lib/sisimai/msp/us/zoho.rb +198 -0
  51. data/lib/sisimai/mta.rb +55 -0
  52. data/lib/sisimai/mta/activehunter.rb +155 -0
  53. data/lib/sisimai/mta/apachejames.rb +194 -0
  54. data/lib/sisimai/mta/courier.rb +307 -0
  55. data/lib/sisimai/mta/domino.rb +209 -0
  56. data/lib/sisimai/mta/exchange.rb +314 -0
  57. data/lib/sisimai/mta/exim.rb +549 -0
  58. data/lib/sisimai/mta/imailserver.rb +227 -0
  59. data/lib/sisimai/mta/interscanmss.rb +167 -0
  60. data/lib/sisimai/mta/mailfoundry.rb +173 -0
  61. data/lib/sisimai/mta/mailmarshalsmtp.rb +206 -0
  62. data/lib/sisimai/mta/mcafee.rb +201 -0
  63. data/lib/sisimai/mta/messagingserver.rb +241 -0
  64. data/lib/sisimai/mta/mfilter.rb +190 -0
  65. data/lib/sisimai/mta/mxlogic.rb +283 -0
  66. data/lib/sisimai/mta/notes.rb +206 -0
  67. data/lib/sisimai/mta/opensmtpd.rb +225 -0
  68. data/lib/sisimai/mta/postfix.rb +306 -0
  69. data/lib/sisimai/mta/qmail.rb +335 -0
  70. data/lib/sisimai/mta/sendmail.rb +317 -0
  71. data/lib/sisimai/mta/surfcontrol.rb +193 -0
  72. data/lib/sisimai/mta/userdefined.rb +148 -0
  73. data/lib/sisimai/mta/v5sendmail.rb +232 -0
  74. data/lib/sisimai/mta/x1.rb +156 -0
  75. data/lib/sisimai/mta/x2.rb +157 -0
  76. data/lib/sisimai/mta/x3.rb +171 -0
  77. data/lib/sisimai/mta/x4.rb +365 -0
  78. data/lib/sisimai/mta/x5.rb +208 -0
  79. data/lib/sisimai/order.rb +217 -0
  80. data/lib/sisimai/reason.rb +235 -0
  81. data/lib/sisimai/reason/blocked.rb +105 -0
  82. data/lib/sisimai/reason/contenterror.rb +53 -0
  83. data/lib/sisimai/reason/exceedlimit.rb +60 -0
  84. data/lib/sisimai/reason/expired.rb +53 -0
  85. data/lib/sisimai/reason/filtered.rb +98 -0
  86. data/lib/sisimai/reason/hasmoved.rb +45 -0
  87. data/lib/sisimai/reason/hostunknown.rb +74 -0
  88. data/lib/sisimai/reason/mailboxfull.rb +118 -0
  89. data/lib/sisimai/reason/mailererror.rb +55 -0
  90. data/lib/sisimai/reason/mesgtoobig.rb +77 -0
  91. data/lib/sisimai/reason/networkerror.rb +57 -0
  92. data/lib/sisimai/reason/norelaying.rb +71 -0
  93. data/lib/sisimai/reason/notaccept.rb +63 -0
  94. data/lib/sisimai/reason/onhold.rb +45 -0
  95. data/lib/sisimai/reason/rejected.rb +101 -0
  96. data/lib/sisimai/reason/securityerror.rb +72 -0
  97. data/lib/sisimai/reason/spamdetected.rb +172 -0
  98. data/lib/sisimai/reason/suspend.rb +58 -0
  99. data/lib/sisimai/reason/systemerror.rb +69 -0
  100. data/lib/sisimai/reason/systemfull.rb +45 -0
  101. data/lib/sisimai/reason/toomanyconn.rb +73 -0
  102. data/lib/sisimai/reason/userunknown.rb +194 -0
  103. data/lib/sisimai/rfc2606.rb +24 -0
  104. data/lib/sisimai/rfc3464.rb +497 -0
  105. data/lib/sisimai/rfc3834.rb +150 -0
  106. data/lib/sisimai/rfc5322.rb +204 -0
  107. data/lib/sisimai/rhost.rb +47 -0
  108. data/lib/sisimai/rhost/googleapps.rb +237 -0
  109. data/lib/sisimai/smtp.rb +58 -0
  110. data/lib/sisimai/smtp/reply.rb +81 -0
  111. data/lib/sisimai/smtp/status.rb +755 -0
  112. data/lib/sisimai/string.rb +65 -0
  113. data/lib/sisimai/time.rb +11 -0
  114. data/lib/sisimai/version.rb +4 -0
  115. data/set-of-emails/README.md +35 -0
  116. data/set-of-emails/mailbox/mbox-0 +2467 -0
  117. data/set-of-emails/mailbox/mbox-1 +71 -0
  118. data/set-of-emails/maildir/bsd/README.md +261 -0
  119. data/set-of-emails/maildir/bsd/activehunter-01.eml +54 -0
  120. data/set-of-emails/maildir/bsd/activehunter-02.eml +53 -0
  121. data/set-of-emails/maildir/bsd/apachejames-01.eml +46 -0
  122. data/set-of-emails/maildir/bsd/arf-01.eml +66 -0
  123. data/set-of-emails/maildir/bsd/arf-02.eml +68 -0
  124. data/set-of-emails/maildir/bsd/arf-03.eml +56 -0
  125. data/set-of-emails/maildir/bsd/arf-04.eml +89 -0
  126. data/set-of-emails/maildir/bsd/arf-05.eml +82 -0
  127. data/set-of-emails/maildir/bsd/arf-06.eml +166 -0
  128. data/set-of-emails/maildir/bsd/arf-07.eml +59 -0
  129. data/set-of-emails/maildir/bsd/arf-08.eml +103 -0
  130. data/set-of-emails/maildir/bsd/arf-09.eml +104 -0
  131. data/set-of-emails/maildir/bsd/arf-10.eml +56 -0
  132. data/set-of-emails/maildir/bsd/arf-11.eml +37 -0
  133. data/set-of-emails/maildir/bsd/arf-12.eml +40 -0
  134. data/set-of-emails/maildir/bsd/arf-13.eml +76 -0
  135. data/set-of-emails/maildir/bsd/arf-14.eml +333 -0
  136. data/set-of-emails/maildir/bsd/arf-15.eml +66 -0
  137. data/set-of-emails/maildir/bsd/courier-01.eml +79 -0
  138. data/set-of-emails/maildir/bsd/courier-02.eml +83 -0
  139. data/set-of-emails/maildir/bsd/courier-03.eml +85 -0
  140. data/set-of-emails/maildir/bsd/courier-04.eml +87 -0
  141. data/set-of-emails/maildir/bsd/de-einsundeins-01.eml +38 -0
  142. data/set-of-emails/maildir/bsd/de-gmx-01.eml +52 -0
  143. data/set-of-emails/maildir/bsd/de-gmx-02.eml +51 -0
  144. data/set-of-emails/maildir/bsd/de-gmx-03.eml +56 -0
  145. data/set-of-emails/maildir/bsd/de-gmx-04.eml +51 -0
  146. data/set-of-emails/maildir/bsd/domino-01.eml +33 -0
  147. data/set-of-emails/maildir/bsd/domino-02.eml +83 -0
  148. data/set-of-emails/maildir/bsd/exchange-01.eml +31 -0
  149. data/set-of-emails/maildir/bsd/exchange-02.eml +67 -0
  150. data/set-of-emails/maildir/bsd/exchange-03.eml +52 -0
  151. data/set-of-emails/maildir/bsd/exchange-04.eml +28 -0
  152. data/set-of-emails/maildir/bsd/exchange-05.eml +56 -0
  153. data/set-of-emails/maildir/bsd/exchange-06.eml +151 -0
  154. data/set-of-emails/maildir/bsd/exim-01.eml +46 -0
  155. data/set-of-emails/maildir/bsd/exim-02.eml +41 -0
  156. data/set-of-emails/maildir/bsd/exim-03.eml +42 -0
  157. data/set-of-emails/maildir/bsd/exim-04.eml +46 -0
  158. data/set-of-emails/maildir/bsd/exim-05.eml +49 -0
  159. data/set-of-emails/maildir/bsd/exim-06.eml +44 -0
  160. data/set-of-emails/maildir/bsd/exim-07.eml +28 -0
  161. data/set-of-emails/maildir/bsd/exim-08.eml +42 -0
  162. data/set-of-emails/maildir/bsd/exim-09.eml +169 -0
  163. data/set-of-emails/maildir/bsd/exim-10.eml +718 -0
  164. data/set-of-emails/maildir/bsd/exim-11.eml +718 -0
  165. data/set-of-emails/maildir/bsd/exim-12.eml +75 -0
  166. data/set-of-emails/maildir/bsd/exim-13.eml +145 -0
  167. data/set-of-emails/maildir/bsd/exim-14.eml +32 -0
  168. data/set-of-emails/maildir/bsd/exim-15.eml +49 -0
  169. data/set-of-emails/maildir/bsd/exim-16.eml +98 -0
  170. data/set-of-emails/maildir/bsd/exim-17.eml +50 -0
  171. data/set-of-emails/maildir/bsd/exim-18.eml +96 -0
  172. data/set-of-emails/maildir/bsd/exim-19.eml +52 -0
  173. data/set-of-emails/maildir/bsd/exim-20.eml +159 -0
  174. data/set-of-emails/maildir/bsd/exim-21.eml +150 -0
  175. data/set-of-emails/maildir/bsd/exim-22.eml +50 -0
  176. data/set-of-emails/maildir/bsd/exim-23.eml +57 -0
  177. data/set-of-emails/maildir/bsd/exim-24.eml +107 -0
  178. data/set-of-emails/maildir/bsd/exim-25.eml +18 -0
  179. data/set-of-emails/maildir/bsd/exim-26.eml +111 -0
  180. data/set-of-emails/maildir/bsd/exim-27.eml +120 -0
  181. data/set-of-emails/maildir/bsd/exim-28.eml +148 -0
  182. data/set-of-emails/maildir/bsd/google-apps-01.eml +66 -0
  183. data/set-of-emails/maildir/bsd/imailserver-01.eml +27 -0
  184. data/set-of-emails/maildir/bsd/imailserver-02.eml +36 -0
  185. data/set-of-emails/maildir/bsd/imailserver-03.eml +28 -0
  186. data/set-of-emails/maildir/bsd/imailserver-04.eml +15 -0
  187. data/set-of-emails/maildir/bsd/imailserver-05.eml +92 -0
  188. data/set-of-emails/maildir/bsd/imailserver-06.eml +29 -0
  189. data/set-of-emails/maildir/bsd/interscanmss-01.eml +49 -0
  190. data/set-of-emails/maildir/bsd/interscanmss-02.eml +259 -0
  191. data/set-of-emails/maildir/bsd/jp-biglobe-01.eml +43 -0
  192. data/set-of-emails/maildir/bsd/jp-ezweb-01.eml +36 -0
  193. data/set-of-emails/maildir/bsd/jp-ezweb-02.eml +65 -0
  194. data/set-of-emails/maildir/bsd/jp-ezweb-03.eml +35 -0
  195. data/set-of-emails/maildir/bsd/jp-ezweb-04.eml +38 -0
  196. data/set-of-emails/maildir/bsd/jp-ezweb-05.eml +38 -0
  197. data/set-of-emails/maildir/bsd/jp-ezweb-06.eml +33 -0
  198. data/set-of-emails/maildir/bsd/jp-kddi-01.eml +49 -0
  199. data/set-of-emails/maildir/bsd/jp-kddi-02.eml +54 -0
  200. data/set-of-emails/maildir/bsd/jp-kddi-03.eml +54 -0
  201. data/set-of-emails/maildir/bsd/mailfoundry-01.eml +50 -0
  202. data/set-of-emails/maildir/bsd/mailfoundry-02.eml +49 -0
  203. data/set-of-emails/maildir/bsd/mailmarshalsmtp-01.eml +43 -0
  204. data/set-of-emails/maildir/bsd/mcafee-01.eml +63 -0
  205. data/set-of-emails/maildir/bsd/mcafee-02.eml +65 -0
  206. data/set-of-emails/maildir/bsd/mcafee-03.eml +59 -0
  207. data/set-of-emails/maildir/bsd/messagingserver-01.eml +102 -0
  208. data/set-of-emails/maildir/bsd/messagingserver-02.eml +72 -0
  209. data/set-of-emails/maildir/bsd/messagingserver-03.eml +70 -0
  210. data/set-of-emails/maildir/bsd/messagingserver-04.eml +102 -0
  211. data/set-of-emails/maildir/bsd/messagingserver-05.eml +98 -0
  212. data/set-of-emails/maildir/bsd/messagingserver-06.eml +101 -0
  213. data/set-of-emails/maildir/bsd/messagingserver-07.eml +129 -0
  214. data/set-of-emails/maildir/bsd/mfilter-01.eml +49 -0
  215. data/set-of-emails/maildir/bsd/mfilter-02.eml +48 -0
  216. data/set-of-emails/maildir/bsd/mfilter-03.eml +43 -0
  217. data/set-of-emails/maildir/bsd/mxlogic-01.eml +47 -0
  218. data/set-of-emails/maildir/bsd/mxlogic-02.eml +44 -0
  219. data/set-of-emails/maildir/bsd/mxlogic-03.eml +46 -0
  220. data/set-of-emails/maildir/bsd/notes-01.eml +42 -0
  221. data/set-of-emails/maildir/bsd/notes-02.eml +42 -0
  222. data/set-of-emails/maildir/bsd/notes-03.eml +38 -0
  223. data/set-of-emails/maildir/bsd/notes-04.eml +181 -0
  224. data/set-of-emails/maildir/bsd/opensmtpd-01.eml +33 -0
  225. data/set-of-emails/maildir/bsd/opensmtpd-02.eml +33 -0
  226. data/set-of-emails/maildir/bsd/opensmtpd-03.eml +36 -0
  227. data/set-of-emails/maildir/bsd/opensmtpd-04.eml +40 -0
  228. data/set-of-emails/maildir/bsd/opensmtpd-05.eml +36 -0
  229. data/set-of-emails/maildir/bsd/postfix-01.eml +60 -0
  230. data/set-of-emails/maildir/bsd/postfix-02.eml +78 -0
  231. data/set-of-emails/maildir/bsd/postfix-03.eml +71 -0
  232. data/set-of-emails/maildir/bsd/postfix-04.eml +89 -0
  233. data/set-of-emails/maildir/bsd/postfix-05.eml +78 -0
  234. data/set-of-emails/maildir/bsd/postfix-06.eml +72 -0
  235. data/set-of-emails/maildir/bsd/postfix-07.eml +74 -0
  236. data/set-of-emails/maildir/bsd/postfix-08.eml +78 -0
  237. data/set-of-emails/maildir/bsd/postfix-09.eml +76 -0
  238. data/set-of-emails/maildir/bsd/postfix-10.eml +73 -0
  239. data/set-of-emails/maildir/bsd/postfix-11.eml +86 -0
  240. data/set-of-emails/maildir/bsd/postfix-12.eml +71 -0
  241. data/set-of-emails/maildir/bsd/postfix-13.eml +81 -0
  242. data/set-of-emails/maildir/bsd/postfix-14.eml +68 -0
  243. data/set-of-emails/maildir/bsd/postfix-15.eml +69 -0
  244. data/set-of-emails/maildir/bsd/postfix-16.eml +73 -0
  245. data/set-of-emails/maildir/bsd/postfix-17.eml +68 -0
  246. data/set-of-emails/maildir/bsd/postfix-18.eml +121 -0
  247. data/set-of-emails/maildir/bsd/postfix-19.eml +105 -0
  248. data/set-of-emails/maildir/bsd/postfix-20.eml +231 -0
  249. data/set-of-emails/maildir/bsd/postfix-21.eml +60 -0
  250. data/set-of-emails/maildir/bsd/qmail-01.eml +40 -0
  251. data/set-of-emails/maildir/bsd/qmail-02.eml +35 -0
  252. data/set-of-emails/maildir/bsd/qmail-03.eml +22 -0
  253. data/set-of-emails/maildir/bsd/qmail-04.eml +31 -0
  254. data/set-of-emails/maildir/bsd/qmail-05.eml +31 -0
  255. data/set-of-emails/maildir/bsd/qmail-06.eml +39 -0
  256. data/set-of-emails/maildir/bsd/qmail-07.eml +22 -0
  257. data/set-of-emails/maildir/bsd/qmail-08.eml +23 -0
  258. data/set-of-emails/maildir/bsd/qmail-09.eml +103 -0
  259. data/set-of-emails/maildir/bsd/rfc3464-01.eml +60 -0
  260. data/set-of-emails/maildir/bsd/rfc3464-02.eml +43 -0
  261. data/set-of-emails/maildir/bsd/rfc3464-03.eml +40 -0
  262. data/set-of-emails/maildir/bsd/rfc3464-04.eml +50 -0
  263. data/set-of-emails/maildir/bsd/rfc3464-05.eml +63 -0
  264. data/set-of-emails/maildir/bsd/rfc3464-06.eml +48 -0
  265. data/set-of-emails/maildir/bsd/rfc3464-07.eml +88 -0
  266. data/set-of-emails/maildir/bsd/rfc3464-08.eml +70 -0
  267. data/set-of-emails/maildir/bsd/rfc3464-09.eml +93 -0
  268. data/set-of-emails/maildir/bsd/rfc3464-10.eml +467 -0
  269. data/set-of-emails/maildir/bsd/rfc3464-11.eml +1171 -0
  270. data/set-of-emails/maildir/bsd/rfc3464-12.eml +101 -0
  271. data/set-of-emails/maildir/bsd/rfc3464-13.eml +131 -0
  272. data/set-of-emails/maildir/bsd/rfc3464-14.eml +121 -0
  273. data/set-of-emails/maildir/bsd/rfc3464-15.eml +144 -0
  274. data/set-of-emails/maildir/bsd/rfc3464-16.eml +36 -0
  275. data/set-of-emails/maildir/bsd/rfc3464-17.eml +109 -0
  276. data/set-of-emails/maildir/bsd/rfc3464-18.eml +149 -0
  277. data/set-of-emails/maildir/bsd/rfc3464-19.eml +65 -0
  278. data/set-of-emails/maildir/bsd/rfc3464-20.eml +145 -0
  279. data/set-of-emails/maildir/bsd/rfc3464-21.eml +146 -0
  280. data/set-of-emails/maildir/bsd/rfc3464-22.eml +105 -0
  281. data/set-of-emails/maildir/bsd/rfc3464-23.eml +21 -0
  282. data/set-of-emails/maildir/bsd/rfc3464-24.eml +27 -0
  283. data/set-of-emails/maildir/bsd/rfc3464-25.eml +33 -0
  284. data/set-of-emails/maildir/bsd/rfc3464-26.eml +98 -0
  285. data/set-of-emails/maildir/bsd/rfc3464-27.eml +180 -0
  286. data/set-of-emails/maildir/bsd/rfc3834-01.eml +37 -0
  287. data/set-of-emails/maildir/bsd/rfc3834-02.eml +51 -0
  288. data/set-of-emails/maildir/bsd/rfc3834-03.eml +33 -0
  289. data/set-of-emails/maildir/bsd/ru-mailru-01.eml +54 -0
  290. data/set-of-emails/maildir/bsd/ru-mailru-02.eml +54 -0
  291. data/set-of-emails/maildir/bsd/ru-mailru-03.eml +62 -0
  292. data/set-of-emails/maildir/bsd/ru-mailru-04.eml +54 -0
  293. data/set-of-emails/maildir/bsd/ru-yandex-01.eml +102 -0
  294. data/set-of-emails/maildir/bsd/ru-yandex-02.eml +113 -0
  295. data/set-of-emails/maildir/bsd/ru-yandex-03.eml +101 -0
  296. data/set-of-emails/maildir/bsd/sendmail-01.eml +70 -0
  297. data/set-of-emails/maildir/bsd/sendmail-02.eml +82 -0
  298. data/set-of-emails/maildir/bsd/sendmail-03.eml +76 -0
  299. data/set-of-emails/maildir/bsd/sendmail-04.eml +63 -0
  300. data/set-of-emails/maildir/bsd/sendmail-05.eml +64 -0
  301. data/set-of-emails/maildir/bsd/sendmail-06.eml +67 -0
  302. data/set-of-emails/maildir/bsd/sendmail-07.eml +65 -0
  303. data/set-of-emails/maildir/bsd/sendmail-08.eml +62 -0
  304. data/set-of-emails/maildir/bsd/sendmail-09.eml +60 -0
  305. data/set-of-emails/maildir/bsd/sendmail-10.eml +82 -0
  306. data/set-of-emails/maildir/bsd/sendmail-11.eml +60 -0
  307. data/set-of-emails/maildir/bsd/sendmail-12.eml +62 -0
  308. data/set-of-emails/maildir/bsd/sendmail-13.eml +66 -0
  309. data/set-of-emails/maildir/bsd/sendmail-14.eml +64 -0
  310. data/set-of-emails/maildir/bsd/sendmail-15.eml +60 -0
  311. data/set-of-emails/maildir/bsd/sendmail-16.eml +69 -0
  312. data/set-of-emails/maildir/bsd/sendmail-17.eml +68 -0
  313. data/set-of-emails/maildir/bsd/sendmail-18.eml +64 -0
  314. data/set-of-emails/maildir/bsd/sendmail-19.eml +71 -0
  315. data/set-of-emails/maildir/bsd/sendmail-20.eml +120 -0
  316. data/set-of-emails/maildir/bsd/sendmail-21.eml +69 -0
  317. data/set-of-emails/maildir/bsd/sendmail-22.eml +73 -0
  318. data/set-of-emails/maildir/bsd/sendmail-23.eml +137 -0
  319. data/set-of-emails/maildir/bsd/sendmail-24.eml +66 -0
  320. data/set-of-emails/maildir/bsd/sendmail-25.eml +70 -0
  321. data/set-of-emails/maildir/bsd/sendmail-26.eml +71 -0
  322. data/set-of-emails/maildir/bsd/sendmail-27.eml +69 -0
  323. data/set-of-emails/maildir/bsd/sendmail-28.eml +69 -0
  324. data/set-of-emails/maildir/bsd/sendmail-29.eml +70 -0
  325. data/set-of-emails/maildir/bsd/sendmail-30.eml +68 -0
  326. data/set-of-emails/maildir/bsd/sendmail-31.eml +80 -0
  327. data/set-of-emails/maildir/bsd/sendmail-32.eml +71 -0
  328. data/set-of-emails/maildir/bsd/sendmail-33.eml +71 -0
  329. data/set-of-emails/maildir/bsd/sendmail-34.eml +75 -0
  330. data/set-of-emails/maildir/bsd/sendmail-35.eml +70 -0
  331. data/set-of-emails/maildir/bsd/sendmail-36.eml +71 -0
  332. data/set-of-emails/maildir/bsd/sendmail-37.eml +71 -0
  333. data/set-of-emails/maildir/bsd/surfcontrol-01.eml +79 -0
  334. data/set-of-emails/maildir/bsd/surfcontrol-02.eml +70 -0
  335. data/set-of-emails/maildir/bsd/surfcontrol-03.eml +70 -0
  336. data/set-of-emails/maildir/bsd/uk-messagelabs-01.eml +76 -0
  337. data/set-of-emails/maildir/bsd/us-amazonses-01.eml +59 -0
  338. data/set-of-emails/maildir/bsd/us-amazonses-02.eml +177 -0
  339. data/set-of-emails/maildir/bsd/us-amazonses-03.eml +55 -0
  340. data/set-of-emails/maildir/bsd/us-amazonses-04.eml +55 -0
  341. data/set-of-emails/maildir/bsd/us-aol-01.eml +1258 -0
  342. data/set-of-emails/maildir/bsd/us-aol-02.eml +1257 -0
  343. data/set-of-emails/maildir/bsd/us-aol-03.eml +1264 -0
  344. data/set-of-emails/maildir/bsd/us-aol-04.eml +1260 -0
  345. data/set-of-emails/maildir/bsd/us-bigfoot-01.eml +64 -0
  346. data/set-of-emails/maildir/bsd/us-facebook-01.eml +40 -0
  347. data/set-of-emails/maildir/bsd/us-facebook-02.eml +42 -0
  348. data/set-of-emails/maildir/bsd/us-google-01.eml +70 -0
  349. data/set-of-emails/maildir/bsd/us-google-02.eml +50 -0
  350. data/set-of-emails/maildir/bsd/us-google-03.eml +51 -0
  351. data/set-of-emails/maildir/bsd/us-google-04.eml +82 -0
  352. data/set-of-emails/maildir/bsd/us-google-05.eml +50 -0
  353. data/set-of-emails/maildir/bsd/us-google-06.eml +56 -0
  354. data/set-of-emails/maildir/bsd/us-google-07.eml +42 -0
  355. data/set-of-emails/maildir/bsd/us-google-08.eml +59 -0
  356. data/set-of-emails/maildir/bsd/us-google-09.eml +76 -0
  357. data/set-of-emails/maildir/bsd/us-google-10.eml +69 -0
  358. data/set-of-emails/maildir/bsd/us-google-11.eml +68 -0
  359. data/set-of-emails/maildir/bsd/us-google-12.eml +76 -0
  360. data/set-of-emails/maildir/bsd/us-google-13.eml +79 -0
  361. data/set-of-emails/maildir/bsd/us-google-14.eml +304 -0
  362. data/set-of-emails/maildir/bsd/us-outlook-01.eml +72 -0
  363. data/set-of-emails/maildir/bsd/us-outlook-02.eml +72 -0
  364. data/set-of-emails/maildir/bsd/us-outlook-03.eml +72 -0
  365. data/set-of-emails/maildir/bsd/us-outlook-04.eml +79 -0
  366. data/set-of-emails/maildir/bsd/us-outlook-05.eml +85 -0
  367. data/set-of-emails/maildir/bsd/us-outlook-06.eml +75 -0
  368. data/set-of-emails/maildir/bsd/us-outlook-07.eml +70 -0
  369. data/set-of-emails/maildir/bsd/us-receivingses-01.eml +74 -0
  370. data/set-of-emails/maildir/bsd/us-receivingses-02.eml +74 -0
  371. data/set-of-emails/maildir/bsd/us-receivingses-03.eml +74 -0
  372. data/set-of-emails/maildir/bsd/us-receivingses-04.eml +74 -0
  373. data/set-of-emails/maildir/bsd/us-receivingses-05.eml +74 -0
  374. data/set-of-emails/maildir/bsd/us-receivingses-06.eml +74 -0
  375. data/set-of-emails/maildir/bsd/us-receivingses-07.eml +74 -0
  376. data/set-of-emails/maildir/bsd/us-sendgrid-01.eml +95 -0
  377. data/set-of-emails/maildir/bsd/us-sendgrid-02.eml +98 -0
  378. data/set-of-emails/maildir/bsd/us-sendgrid-03.eml +100 -0
  379. data/set-of-emails/maildir/bsd/us-verizon-01.eml +31 -0
  380. data/set-of-emails/maildir/bsd/us-yahoo-01.eml +78 -0
  381. data/set-of-emails/maildir/bsd/us-yahoo-02.eml +79 -0
  382. data/set-of-emails/maildir/bsd/us-yahoo-03.eml +93 -0
  383. data/set-of-emails/maildir/bsd/us-yahoo-04.eml +94 -0
  384. data/set-of-emails/maildir/bsd/us-yahoo-05.eml +94 -0
  385. data/set-of-emails/maildir/bsd/us-zoho-01.eml +40 -0
  386. data/set-of-emails/maildir/bsd/us-zoho-02.eml +38 -0
  387. data/set-of-emails/maildir/bsd/us-zoho-03.eml +37 -0
  388. data/set-of-emails/maildir/bsd/us-zoho-04.eml +47 -0
  389. data/set-of-emails/maildir/bsd/us-zoho-05.eml +37 -0
  390. data/set-of-emails/maildir/bsd/v5sendmail-01.eml +24 -0
  391. data/set-of-emails/maildir/bsd/v5sendmail-02.eml +26 -0
  392. data/set-of-emails/maildir/bsd/v5sendmail-03.eml +29 -0
  393. data/set-of-emails/maildir/bsd/v5sendmail-04.eml +29 -0
  394. data/set-of-emails/maildir/bsd/v5sendmail-05.eml +42 -0
  395. data/set-of-emails/maildir/bsd/v5sendmail-06.eml +28 -0
  396. data/set-of-emails/maildir/bsd/v5sendmail-07.eml +35 -0
  397. data/set-of-emails/maildir/bsd/x1-01.eml +61 -0
  398. data/set-of-emails/maildir/bsd/x1-02.eml +62 -0
  399. data/set-of-emails/maildir/bsd/x2-01.eml +41 -0
  400. data/set-of-emails/maildir/bsd/x2-02.eml +46 -0
  401. data/set-of-emails/maildir/bsd/x2-03.eml +34 -0
  402. data/set-of-emails/maildir/bsd/x2-04.eml +0 -0
  403. data/set-of-emails/maildir/bsd/x2-05.eml +98 -0
  404. data/set-of-emails/maildir/bsd/x3-01.eml +61 -0
  405. data/set-of-emails/maildir/bsd/x3-02.eml +64 -0
  406. data/set-of-emails/maildir/bsd/x3-03.eml +59 -0
  407. data/set-of-emails/maildir/bsd/x3-04.eml +106 -0
  408. data/set-of-emails/maildir/bsd/x4-01.eml +92 -0
  409. data/set-of-emails/maildir/bsd/x4-02.eml +112 -0
  410. data/set-of-emails/maildir/bsd/x4-03.eml +245 -0
  411. data/set-of-emails/maildir/bsd/x4-04.eml +81 -0
  412. data/set-of-emails/maildir/bsd/x4-05.eml +121 -0
  413. data/set-of-emails/maildir/bsd/x4-06.eml +32 -0
  414. data/set-of-emails/maildir/bsd/x4-07.eml +153 -0
  415. data/set-of-emails/maildir/bsd/x5-01.eml +155 -0
  416. data/set-of-emails/maildir/dos/activehunter-01.eml +54 -0
  417. data/set-of-emails/maildir/dos/apachejames-01.eml +46 -0
  418. data/set-of-emails/maildir/dos/arf-01.eml +66 -0
  419. data/set-of-emails/maildir/dos/courier-01.eml +79 -0
  420. data/set-of-emails/maildir/dos/de-einsundeins-01.eml +38 -0
  421. data/set-of-emails/maildir/dos/de-gmx-01.eml +52 -0
  422. data/set-of-emails/maildir/dos/domino-01.eml +33 -0
  423. data/set-of-emails/maildir/dos/exchange-01.eml +31 -0
  424. data/set-of-emails/maildir/dos/exim-01.eml +46 -0
  425. data/set-of-emails/maildir/dos/google-apps-01.eml +66 -0
  426. data/set-of-emails/maildir/dos/imailserver-01.eml +27 -0
  427. data/set-of-emails/maildir/dos/interscanmss-01.eml +49 -0
  428. data/set-of-emails/maildir/dos/jp-biglobe-01.eml +43 -0
  429. data/set-of-emails/maildir/dos/jp-ezweb-01.eml +36 -0
  430. data/set-of-emails/maildir/dos/jp-kddi-01.eml +49 -0
  431. data/set-of-emails/maildir/dos/mailfoundry-01.eml +50 -0
  432. data/set-of-emails/maildir/dos/mailmarshalsmtp-01.eml +43 -0
  433. data/set-of-emails/maildir/dos/mcafee-01.eml +63 -0
  434. data/set-of-emails/maildir/dos/messagingserver-01.eml +102 -0
  435. data/set-of-emails/maildir/dos/mfilter-01.eml +49 -0
  436. data/set-of-emails/maildir/dos/mxlogic-01.eml +47 -0
  437. data/set-of-emails/maildir/dos/notes-01.eml +42 -0
  438. data/set-of-emails/maildir/dos/opensmtpd-01.eml +33 -0
  439. data/set-of-emails/maildir/dos/postfix-01.eml +60 -0
  440. data/set-of-emails/maildir/dos/qmail-01.eml +40 -0
  441. data/set-of-emails/maildir/dos/rfc3464-01.eml +59 -0
  442. data/set-of-emails/maildir/dos/rfc3834-01.eml +37 -0
  443. data/set-of-emails/maildir/dos/ru-mailru-01.eml +54 -0
  444. data/set-of-emails/maildir/dos/ru-yandex-01.eml +102 -0
  445. data/set-of-emails/maildir/dos/sendmail-01.eml +69 -0
  446. data/set-of-emails/maildir/dos/surfcontrol-01.eml +79 -0
  447. data/set-of-emails/maildir/dos/uk-messagelabs-01.eml +76 -0
  448. data/set-of-emails/maildir/dos/us-amazonses-01.eml +59 -0
  449. data/set-of-emails/maildir/dos/us-aol-01.eml +1258 -0
  450. data/set-of-emails/maildir/dos/us-bigfoot-01.eml +64 -0
  451. data/set-of-emails/maildir/dos/us-facebook-01.eml +40 -0
  452. data/set-of-emails/maildir/dos/us-google-01.eml +70 -0
  453. data/set-of-emails/maildir/dos/us-outlook-01.eml +72 -0
  454. data/set-of-emails/maildir/dos/us-receivingses-01.eml +74 -0
  455. data/set-of-emails/maildir/dos/us-sendgrid-01.eml +95 -0
  456. data/set-of-emails/maildir/dos/us-verizon-01.eml +31 -0
  457. data/set-of-emails/maildir/dos/us-yahoo-01.eml +78 -0
  458. data/set-of-emails/maildir/dos/us-zoho-01.eml +40 -0
  459. data/set-of-emails/maildir/dos/v5sendmail-01.eml +24 -0
  460. data/set-of-emails/maildir/dos/x1-01.eml +61 -0
  461. data/set-of-emails/maildir/dos/x2-01.eml +41 -0
  462. data/set-of-emails/maildir/dos/x3-01.eml +61 -0
  463. data/set-of-emails/maildir/dos/x4-01.eml +90 -0
  464. data/set-of-emails/maildir/dos/x5-01.eml +155 -0
  465. data/set-of-emails/maildir/err/make-test-01.eml +70 -0
  466. data/set-of-emails/maildir/err/make-test-02.eml +70 -0
  467. data/set-of-emails/maildir/err/make-test-03.eml +64 -0
  468. data/set-of-emails/maildir/err/make-test-04.eml +64 -0
  469. data/set-of-emails/maildir/err/make-test-05.eml +66 -0
  470. data/set-of-emails/maildir/err/make-test-06.eml +118 -0
  471. data/set-of-emails/maildir/err/make-test-07.eml +26 -0
  472. data/set-of-emails/maildir/err/make-test-08.eml +67 -0
  473. data/set-of-emails/maildir/err/make-test-09.eml +55 -0
  474. data/set-of-emails/maildir/err/make-test-10.eml +69 -0
  475. data/set-of-emails/maildir/err/make-test-11.eml +64 -0
  476. data/set-of-emails/maildir/err/make-test-12.eml +66 -0
  477. data/set-of-emails/maildir/err/make-test-13.eml +67 -0
  478. data/set-of-emails/maildir/err/make-test-14.eml +66 -0
  479. data/set-of-emails/maildir/err/make-test-15.eml +70 -0
  480. data/set-of-emails/maildir/err/make-test-16.eml +68 -0
  481. data/set-of-emails/maildir/err/make-test-17.eml +68 -0
  482. data/set-of-emails/maildir/err/make-test-18.eml +68 -0
  483. data/set-of-emails/maildir/err/make-test-19.eml +69 -0
  484. data/set-of-emails/maildir/err/make-test-20.eml +67 -0
  485. data/set-of-emails/maildir/err/make-test-21.eml +69 -0
  486. data/set-of-emails/maildir/err/make-test-22.eml +66 -0
  487. data/set-of-emails/maildir/err/make-test-23.eml +70 -0
  488. data/set-of-emails/maildir/err/make-test-24.eml +69 -0
  489. data/set-of-emails/maildir/err/make-test-25.eml +67 -0
  490. data/set-of-emails/maildir/err/make-test-26.eml +69 -0
  491. data/set-of-emails/maildir/err/make-test-27.eml +69 -0
  492. data/set-of-emails/maildir/err/make-test-28.eml +66 -0
  493. data/set-of-emails/maildir/err/make-test-29.eml +68 -0
  494. data/set-of-emails/maildir/err/make-test-30.eml +68 -0
  495. data/set-of-emails/maildir/err/make-test-31.eml +80 -0
  496. data/set-of-emails/maildir/err/make-test-32.eml +66 -0
  497. data/set-of-emails/maildir/err/make-test-33.eml +68 -0
  498. data/set-of-emails/maildir/err/make-test-34.eml +56 -0
  499. data/set-of-emails/maildir/err/make-test-35.eml +59 -0
  500. data/set-of-emails/maildir/err/make-test-36.eml +53 -0
  501. data/set-of-emails/maildir/err/make-test-37.eml +62 -0
  502. data/set-of-emails/maildir/mac/activehunter-01.eml +1 -2
  503. data/set-of-emails/maildir/mac/apachejames-01.eml +1 -4
  504. data/set-of-emails/maildir/mac/arf-01.eml +1 -3
  505. data/set-of-emails/maildir/mac/courier-01.eml +1 -6
  506. data/set-of-emails/maildir/mac/de-einsundeins-01.eml +1 -1
  507. data/set-of-emails/maildir/mac/de-gmx-01.eml +1 -1
  508. data/set-of-emails/maildir/mac/domino-01.eml +1 -0
  509. data/set-of-emails/maildir/mac/exchange-01.eml +1 -0
  510. data/set-of-emails/maildir/mac/exim-01.eml +1 -1
  511. data/set-of-emails/maildir/mac/google-apps-01.eml +1 -4
  512. data/set-of-emails/maildir/mac/imailserver-01.eml +1 -0
  513. data/set-of-emails/maildir/mac/interscanmss-01.eml +1 -2
  514. data/set-of-emails/maildir/mac/jp-biglobe-01.eml +1 -2
  515. data/set-of-emails/maildir/mac/jp-ezweb-01.eml +1 -1
  516. data/set-of-emails/maildir/mac/jp-kddi-01.eml +1 -2
  517. data/set-of-emails/maildir/mac/mailfoundry-01.eml +1 -2
  518. data/set-of-emails/maildir/mac/mailmarshalsmtp-01.eml +1 -2
  519. data/set-of-emails/maildir/mac/mcafee-01.eml +1 -4
  520. data/set-of-emails/maildir/mac/messagingserver-01.eml +1 -4
  521. data/set-of-emails/maildir/mac/mfilter-01.eml +1 -3
  522. data/set-of-emails/maildir/mac/mxlogic-01.eml +1 -1
  523. data/set-of-emails/maildir/mac/notes-01.eml +1 -2
  524. data/set-of-emails/maildir/mac/opensmtpd-01.eml +1 -0
  525. data/set-of-emails/maildir/mac/postfix-01.eml +1 -3
  526. data/set-of-emails/maildir/mac/qmail-01.eml +1 -1
  527. data/set-of-emails/maildir/mac/rfc3464-01.eml +1 -4
  528. data/set-of-emails/maildir/mac/rfc3834-01.eml +1 -0
  529. data/set-of-emails/maildir/mac/ru-mailru-01.eml +1 -1
  530. data/set-of-emails/maildir/mac/ru-yandex-01.eml +1 -4
  531. data/set-of-emails/maildir/mac/sendmail-01.eml +1 -4
  532. data/set-of-emails/maildir/mac/surfcontrol-01.eml +1 -5
  533. data/set-of-emails/maildir/mac/uk-messagelabs-01.eml +1 -4
  534. data/set-of-emails/maildir/mac/us-amazonses-01.eml +1 -4
  535. data/set-of-emails/maildir/mac/us-aol-01.eml +1 -15
  536. data/set-of-emails/maildir/mac/us-bigfoot-01.eml +1 -4
  537. data/set-of-emails/maildir/mac/us-facebook-01.eml +1 -4
  538. data/set-of-emails/maildir/mac/us-google-01.eml +1 -1
  539. data/set-of-emails/maildir/mac/us-outlook-01.eml +1 -4
  540. data/set-of-emails/maildir/mac/us-receivingses-01.eml +1 -4
  541. data/set-of-emails/maildir/mac/us-sendgrid-01.eml +1 -3
  542. data/set-of-emails/maildir/mac/us-verizon-01.eml +1 -2
  543. data/set-of-emails/maildir/mac/us-yahoo-01.eml +1 -1
  544. data/set-of-emails/maildir/mac/us-zoho-01.eml +1 -2
  545. data/set-of-emails/maildir/mac/v5sendmail-01.eml +1 -0
  546. data/set-of-emails/maildir/mac/x1-01.eml +1 -4
  547. data/set-of-emails/maildir/mac/x2-01.eml +1 -1
  548. data/set-of-emails/maildir/mac/x3-01.eml +1 -3
  549. data/set-of-emails/maildir/mac/x4-01.eml +1 -2
  550. data/set-of-emails/maildir/mac/x5-01.eml +1 -8
  551. data/set-of-emails/maildir/not/is-not-bounce-01.eml +25 -0
  552. data/set-of-emails/to-be-debugged-because/reason-is-onhold/onhold-0001.eml +85 -0
  553. data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0002.eml +27 -0
  554. data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0003.eml +78 -0
  555. data/set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet/cannot-parse-this-email-0002.eml +25 -0
  556. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-01.eml +79 -0
  557. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-02.eml +72 -0
  558. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-03.eml +68 -0
  559. data/set-of-emails/to-be-debugged-because/something-is-wrong/no-message-id-from-pr-150.eml +75 -0
  560. data/set-of-emails/to-be-parsed-for-test/README.md +20 -0
  561. data/sisimai.gemspec +25 -0
  562. metadata +647 -0
@@ -0,0 +1,413 @@
1
+ module Sisimai
2
+ # Sisimai::Data generate parsed data from Sisimai::Message object.
3
+ class Data
4
+ # Imported from p5-Sisimail/lib/Sisimai/Data.pm
5
+ require 'sisimai/address'
6
+ require 'sisimai/rfc5322'
7
+ require 'sisimai/smtp/reply'
8
+ require 'sisimai/smtp/status'
9
+ require 'sisimai/string'
10
+ require 'sisimai/reason'
11
+ require 'sisimai/rhost'
12
+ require 'sisimai/time'
13
+ require 'sisimai/datetime'
14
+
15
+ @@rwaccessors = [
16
+ 'token', # [String] Message token/MD5 Hex digest value
17
+ 'lhost', # [String] local host name/Local MTA
18
+ 'rhost', # [String] Remote host name/Remote MTA
19
+ 'alias', # [String] Alias of the recipient address
20
+ 'listid', # [String] List-Id header of each ML
21
+ 'reason', # [String] Bounce reason
22
+ 'action', # [String] The value of Action: header
23
+ 'subject', # [String] UTF-8 Subject text
24
+ 'timestamp', # [Sisimai::Time] Date: header in the original message
25
+ 'addresser', # [Sisimai::Address] From address
26
+ 'recipient', # [Sisimai::Address] Recipient address which bounced
27
+ 'messageid', # [String] Message-Id: header
28
+ 'replycode', # [String] SMTP Reply Code
29
+ 'smtpagent', # [String] MTA name
30
+ 'softbounce', # [Integer] 1 = Soft bounce, 0 = Hard bounce, -1 = ?
31
+ 'smtpcommand', # [String] The last SMTP command
32
+ 'destination', # [String] The domain part of the "recipinet"
33
+ 'senderdomain', # [String] The domain part of the "addresser"
34
+ 'feedbacktype', # [String] Feedback Type
35
+ 'diagnosticcode', # [String] Diagnostic-Code: Header
36
+ 'diagnostictype', # [String] The 1st part of Diagnostic-Code: Header
37
+ 'deliverystatus', # [String] Delivery Status(DSN)
38
+ 'timezoneoffset', # [Integer] Time zone offset(seconds)
39
+ ]
40
+ @@rwaccessors.each { |e| attr_accessor e }
41
+
42
+ EndOfEmail = Sisimai::String.EOM
43
+ RetryIndex = Sisimai::Reason.retry
44
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS('all')
45
+ AddrHeader = {
46
+ 'addresser' => RFC822Head['addresser'],
47
+ 'recipient' => RFC822Head['recipient'],
48
+ }
49
+
50
+ # Constructor of Sisimai::Data
51
+ # @param [Hash] argvs Data
52
+ # @return [Sisimai::Data] Structured email data
53
+ def initialize(argvs)
54
+ thing = {}
55
+
56
+ # Create email address object
57
+ x0 = Sisimai::Address.parse([argvs['addresser']])
58
+ y0 = Sisimai::Address.parse([argvs['recipient']])
59
+ v0 = nil
60
+
61
+ if x0.is_a? Array
62
+ v0 = Sisimai::Address.new(x0.shift)
63
+ if v0.is_a? Sisimai::Address
64
+ thing['addresser'] = v0
65
+ thing['senderdomain'] = v0.host
66
+ end
67
+ end
68
+
69
+ if y0.is_a? Array
70
+ v0 = Sisimai::Address.new(y0.shift)
71
+ if v0.is_a? Sisimai::Address
72
+ thing['recipient'] = v0
73
+ thing['destination'] = v0.host
74
+ thing['alias'] = argvs['alias'] || ''
75
+ end
76
+ end
77
+ return nil unless thing['recipient'].is_a? Sisimai::Address
78
+ return nil unless thing['addresser'].is_a? Sisimai::Address
79
+ return nil if thing['recipient'].void
80
+ return nil if thing['addresser'].void
81
+
82
+ @addresser = thing['addresser']
83
+ @senderdomain = thing['senderdomain']
84
+ @recipient = thing['recipient']
85
+ @destination = thing['destination']
86
+ @alias = thing['alias']
87
+
88
+ @token = Sisimai::String.token(@addresser.address, @recipient.address, argvs['timestamp'])
89
+ @timestamp = Sisimai::Time.parse(::Time.at(argvs['timestamp']).to_s)
90
+ @timezoneoffset = argvs['timezoneoffset'] || '+0000'
91
+ @lhost = argvs['lhost'] || ''
92
+ @rhost = argvs['rhost'] || ''
93
+ @reason = argvs['reason'] || ''
94
+ @listid = argvs['listid'] || ''
95
+ @subject = argvs['subject'] || ''
96
+ @messageid = argvs['messageid'] || ''
97
+ @smtpagent = argvs['smtpagent'] || ''
98
+ @diagnosticcode = argvs['diagnosticcode'] || ''
99
+ @diagnostictype = argvs['diagnostictype'] || ''
100
+ @deliverystatus = argvs['deliverystatus'] || ''
101
+ @smtpcommand = argvs['smtpcommand'] || ''
102
+ @feedbacktype = argvs['feedbacktype'] || ''
103
+ @action = argvs['action'] || ''
104
+ @replycode = Sisimai::SMTP::Reply.find(argvs['diagnosticcode'])
105
+ @softbounce = argvs['softbounce'] || ''
106
+ @softbounce = 1 if @replycode =~ /\A4/
107
+ end
108
+
109
+ # Another constructor of Sisimai::Data
110
+ # @param [Hash] argvs Data and orders
111
+ # @option argvs [Sisimai::Message] Data Object
112
+ # @return [Array, Undef] List of Sisimai::Data or Undef if the
113
+ # argument is not Sisimai::Message object
114
+ def self.make(data: nil, **argvs)
115
+ return nil unless data
116
+ return nil unless data.is_a? Sisimai::Message
117
+
118
+ messageobj = data
119
+ rfc822data = messageobj.rfc822
120
+ fieldorder = { 'recipient' => [], 'addresser' => [] }
121
+ objectlist = []
122
+ rxcommands = %r/\A(?:EHLO|HELO|MAIL|RCPT|DATA|QUIT)\z/
123
+ givenorder = argvs['order'] || {}
124
+
125
+ return nil unless messageobj.ds
126
+ return nil unless messageobj.rfc822
127
+ require 'sisimai/smtp'
128
+
129
+ # Decide the order of email headers: user specified or system default.
130
+ if givenorder.is_a?(Hash) && givenorder.keys.size > 0
131
+ # If the order of headers for searching is specified, use the order
132
+ # for detecting an email address.
133
+ fieldorder.each_key do |e|
134
+ # The order should be "Array Reference".
135
+ next unless givenorder[e]
136
+ next unless givenorder[e].is_a? Array
137
+ next unless givenorder[e].size > 0
138
+ fieldorder[e].concat(givenorder[e])
139
+ end
140
+ end
141
+
142
+ fieldorder.each_key do |e|
143
+ # If the order is empty, use default order.
144
+ if fieldorder[e].empty?
145
+ # Load default order of each accessor.
146
+ fieldorder[e] = AddrHeader[e]
147
+ end
148
+ end
149
+
150
+ messageobj.ds.each do |e|
151
+ # Create parameters for new() constructor.
152
+ o = nil # Sisimai::Data Object
153
+ r = nil # Reason text
154
+ p = {
155
+ 'lhost' => e['lhost'] || '',
156
+ 'rhost' => e['rhost'] || '',
157
+ 'alias' => e['alias'] || '',
158
+ 'action' => e['action'] || '',
159
+ 'reason' => e['reason'] || '',
160
+ 'smtpagent' => e['agent'] || '',
161
+ 'recipient' => e['recipient'] || '',
162
+ 'softbounce' => e['softbounce'] || '',
163
+ 'smtpcommand' => e['command'] || '',
164
+ 'feedbacktype' => e['feedbacktype'] || '',
165
+ 'diagnosticcode' => e['diagnosis'] || '',
166
+ 'diagnostictype' => e['spec'] || '',
167
+ 'deliverystatus' => e['status'] || '',
168
+ }
169
+ next if p['deliverystatus'] =~ /\A2[.]/
170
+
171
+ # EMAIL_ADDRESS:
172
+ # Detect email address from message/rfc822 part
173
+ fieldorder['addresser'].each do |f|
174
+ # Check each header in message/rfc822 part
175
+ h = f.downcase
176
+ next unless rfc822data.key?(h)
177
+ next unless rfc822data[h].size > 0
178
+ next unless Sisimai::RFC5322.is_emailaddress(rfc822data[h])
179
+ p['addresser'] = rfc822data[h]
180
+ break
181
+ end
182
+
183
+ # Fallback: Get the sender address from the header of the bounced
184
+ # email if the address is not set at loop above.
185
+ p['addresser'] ||= ''
186
+ p['addresser'] = messageobj.header['to'] if p['addresser'].empty?
187
+
188
+ if p['alias'] && Sisimai::RFC5322.is_emailaddress(p['alias'])
189
+ # Alias address should be the value of "recipient", Replace the
190
+ # value of recipient with the value of "alias".
191
+ w = p['recipient']
192
+ p['recipient'] = p['alias']
193
+ p['alias'] = w
194
+ end
195
+ next unless p['addresser']
196
+ next unless p['recipient']
197
+
198
+ # TIMESTAMP:
199
+ # Convert from a time stamp or a date string to a machine time.
200
+ datestring = nil
201
+ zoneoffset = 0
202
+ datevalues = []
203
+ if e['date'] && e['date'].size > 0
204
+ datevalues << e['date']
205
+ end
206
+
207
+ # Date information did not exist in message/delivery-status part,...
208
+ RFC822Head['date'].each do |f|
209
+ # Get the value of Date header or other date related header.
210
+ next unless rfc822data[f.downcase]
211
+ datevalues << rfc822data[f.downcase]
212
+ end
213
+
214
+ if datevalues.size < 2
215
+ # Set "date" getting from the value of "Date" in the bounce message
216
+ datevalues << messageobj.header['date']
217
+ end
218
+
219
+ datevalues.each do |v|
220
+ # Parse each date value in the array
221
+ datestring = Sisimai::DateTime.parse(v)
222
+ break if datestring
223
+ end
224
+
225
+ if datestring
226
+ # Get the value of timezone offset from $datestring
227
+ if cv = datestring.match(/\A(.+)[ ]+([-+]\d{4})\z/)
228
+ # Wed, 26 Feb 2014 06:05:48 -0500
229
+ datestring = cv[1]
230
+ zoneoffset = Sisimai::DateTime.tz2second(cv[2])
231
+ p['timezoneoffset'] = cv[2]
232
+ end
233
+ end
234
+
235
+ begin
236
+ # Convert from the date string to an object then calculate time
237
+ # zone offset.
238
+ t = Sisimai::Time.strptime(datestring, '%a, %d %b %Y %T')
239
+ p['timestamp'] = ( t.to_time.to_i - zoneoffset ) || nil
240
+ rescue
241
+ warn ' ***warning: Failed to strptime ' + datestring.to_s
242
+ end
243
+ next unless p['timestamp']
244
+
245
+ # OTHER_TEXT_HEADERS:
246
+ # Remove square brackets and curly brackets from the host variable
247
+ ['rhost', 'lhost'].each do |v|
248
+ p[v] = p[v].delete('[]()') # Remove square brackets and curly brackets from the host variable
249
+ p[v] = p[v].sub(/\A.+=/, '') # Remove string before "="
250
+ p[v] = p[v].gsub(/\r\z/, '') # Remove CR at the end of the value
251
+
252
+ # Check space character in each value
253
+ if p[v] =~ / /
254
+ # Get the first element
255
+ p[v] = p[v].split(' ', 2).shift
256
+ end
257
+ end
258
+
259
+ # Subject: header of the original message
260
+ p['subject'] = rfc822data['subject'] || ''
261
+ p['subject'] = p['subject'].gsub(/\r\z/, '')
262
+
263
+ # The value of "List-Id" header
264
+ p['listid'] = rfc822data['list-id'] || ''
265
+ if p['listid'].size > 0
266
+ # Get the value of List-Id header
267
+ if cv = p['listid'].match(/\A.*([<].+[>]).*\z/)
268
+ # List name <list-id@example.org>
269
+ p['listid'] = cv[1]
270
+ end
271
+ p['listid'] = p['listid'].delete('<>')
272
+ p['listid'] = p['listid'].gsub(/\r\z/, '')
273
+ p['listid'] = '' if p['listid'] =~ / /
274
+ end
275
+
276
+ # The value of "Message-Id" header
277
+ p['messageid'] = rfc822data['message-id'] || ''
278
+ if p['messageid'].size > 0
279
+ # Remove angle brackets
280
+ if cv = p['messageid'].match(/\A([^ ]+)[ ].*/)
281
+ p['messageid'] = cv[1]
282
+ end
283
+ p['messageid'] = p['messageid'].delete('<>')
284
+ p['messageid'] = p['messageid'].gsub(/\r\z/, '')
285
+ end
286
+
287
+ # CHECK_DELIVERY_STATUS_VALUE:
288
+ # Cleanup the value of "Diagnostic-Code:" header
289
+ p['diagnosticcode'] = p['diagnosticcode'].sub(/[ \t]+#{EndOfEmail}/, '')
290
+ d = Sisimai::SMTP::Status.find(p['diagnosticcode'])
291
+ if d =~ /\A[45][.][1-9][.][1-9]\z/
292
+ # Use the DSN value in Diagnostic-Code:
293
+ p['deliverystatus'] = d
294
+ end
295
+
296
+ # Check the value of SMTP command
297
+ p['smtpcommand'] = '' unless p['smtpcommand'] =~ rxcommands
298
+
299
+ o = Sisimai::Data.new(p)
300
+ next unless o.recipient
301
+
302
+ if o.reason.empty? || RetryIndex.index(o.reason)
303
+ # Decide the reason of email bounce
304
+ r = ''
305
+ if Sisimai::Rhost.match(o.rhost)
306
+ # Remote host dependent error
307
+ r = Sisimai::Rhost.get(o)
308
+ end
309
+ r = Sisimai::Reason.get(o) if r.empty?
310
+ r = 'undefined' if r.empty?
311
+ o.reason = r
312
+ end
313
+
314
+ if o.reason != 'feedback' && o.reason != 'vacation'
315
+ # Bounce message which reason is "feedback" or "vacation" does
316
+ # not have the value of "deliverystatus".
317
+ if o.softbounce.to_s.empty?
318
+ # The value is not set yet
319
+ ['deliverystatus', 'diagnosticcode'].each do |v|
320
+ # Set the value of softbounce
321
+ next unless p[v].size > 0
322
+ r = Sisimai::SMTP.is_softbounce(p[v])
323
+ if r.nil?
324
+ o.softbounce = -1
325
+ else
326
+ o.softbounce = r ? 1 : 0
327
+ end
328
+ break if o.softbounce > -1
329
+ end
330
+ o.softbounce = -1 if o.softbounce.to_s.empty?
331
+ end
332
+
333
+ if o.deliverystatus.empty?
334
+ # Set pseudo status code
335
+ torp = o.softbounce == 1 ? true : false
336
+ pdsv = Sisimai::SMTP::Status.code(o.reason, torp)
337
+
338
+ if pdsv.size > 0
339
+ # Set the value of "deliverystatus" and "softbounce".
340
+ o.deliverystatus = pdsv
341
+ if o.softbounce == -1
342
+ # Check the value of "softbounce" again
343
+ torp = Sisimai::SMTP.is_softbounce(pdsv)
344
+ if torp.nil?
345
+ o.softbounce = -1
346
+ else
347
+ o.softbounce = torp ? 1 : 0
348
+ end
349
+ end
350
+ end
351
+ end
352
+ else
353
+ # The value of reason is "vacation" or "feedback"
354
+ o.softbounce = -1
355
+ end
356
+ objectlist << o
357
+ end
358
+ return objectlist
359
+ end
360
+
361
+ # Convert from object to hash reference
362
+ # @return [Hash] Data in Hash reference
363
+ def damn
364
+ data = nil
365
+ begin
366
+ v = {}
367
+ stringdata = %w[
368
+ token lhost rhost listid alias reason subject messageid smtpagent
369
+ smtpcommand destination diagnosticcode senderdomain deliverystatus
370
+ timezoneoffset feedbacktype diagnostictype action replycode softbounce
371
+ ]
372
+
373
+ stringdata.each do |e|
374
+ # Copy string data
375
+ v[e] = self.send(e) || ''
376
+ end
377
+ v['addresser'] = self.addresser.address
378
+ v['recipient'] = self.recipient.address
379
+ v['timestamp'] = self.timestamp.to_time.to_i
380
+ data = v
381
+ rescue
382
+ warn '***warning: Failed to damn()'
383
+ end
384
+ return data
385
+ end
386
+
387
+ # Data dumper
388
+ # @param [String] type Data format: json, yaml
389
+ # @return [String, Undef] Dumped data or Undef if the value of first
390
+ # argument is neither "json" nor "yaml"
391
+ def dump(type = 'json')
392
+ return nil unless ['json', 'yaml'].index(type)
393
+ referclass = sprintf('Sisimai::Data::%s', type.upcase)
394
+
395
+ begin
396
+ require referclass.downcase.gsub('::', '/')
397
+ rescue
398
+ warn '***warning: Failed to load' + referclass
399
+ end
400
+
401
+ dumpeddata = Module.const_get(referclass).dump(self)
402
+ return dumpeddata
403
+ end
404
+
405
+ # JSON handler
406
+ # @param [JSON::State] argv JSON::Ext::Generator::State object
407
+ # @return [String] JSON string converted from Sisimai::Data
408
+ def to_json(*)
409
+ return self.dump('json')
410
+ end
411
+
412
+ end
413
+ end
@@ -0,0 +1,36 @@
1
+ module Sisimai
2
+ class Data
3
+ # Sisimai::Data::JSON dumps parsed data object as a JSON format. This class
4
+ # and method should be called from the parent object "Sisimai::Data".
5
+ module JSON
6
+ # Imported from p5-Sisimail/lib/Sisimai/Data/JSON.pm
7
+ class << self
8
+ require 'json'
9
+
10
+ # Data dumper(JSON)
11
+ # @param [Sisimai::Data] argvs Object
12
+ # @return [String, Nil] Dumped data or Undef if the argument
13
+ # is missing
14
+ def dump(argvs)
15
+ return nil unless argvs
16
+ return nil unless argvs.is_a? Sisimai::Data
17
+
18
+ damneddata = argvs.damn
19
+ jsonstring = nil
20
+ jsonoption = ::JSON::state.new
21
+
22
+ begin
23
+ jsonoption.space = ' '
24
+ jsonoption.object_nl = ' '
25
+ jsonstring = ::JSON.generate(damneddata, jsonoption)
26
+ rescue
27
+ warn '***warning: Failed to JSON.generate'
28
+ end
29
+
30
+ return jsonstring
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ module Sisimai
2
+ class Data
3
+ # Sisimai::Data::YAML dumps parsed data object as a YAML format. This class
4
+ # and method should be called from the parent object "Sisimai::Data".
5
+ module YAML
6
+ # Imported from p5-Sisimail/lib/Sisimai/Data/YAML.pm
7
+ class << self
8
+ require 'yaml'
9
+
10
+ # Data dumper(YAML)
11
+ # @param [Sisimai::Data] argvs Object
12
+ # @return [String, Undef] Dumped data or Undef if the argument
13
+ # is missing
14
+ def dump(argvs)
15
+ return nil unless argvs
16
+ return nil unless argvs.is_a? Sisimai::Data
17
+
18
+ damneddata = argvs.damn
19
+ yamlstring = nil
20
+
21
+ begin
22
+ yamlstring = ::YAML.dump(damneddata)
23
+ rescue
24
+ warn '***warning: Failed to YAML.dump'
25
+ end
26
+
27
+ return yamlstring
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end