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,193 @@
1
+ module Sisimai
2
+ module MTA
3
+ # Sisimai::MTA::SurfControl parses a bounce email which created by WebSense
4
+ # SurfControl. Methods in the module are called from only Sisimai::Message.
5
+ module SurfControl
6
+ # Imported from p5-Sisimail/lib/Sisimai/MTA/SurfControl.pm
7
+ class << self
8
+ require 'sisimai/mta'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :'from' => %r/ [(]Mail Delivery System[)]\z/,
13
+ :'x-mailer' => %r/\ASurfControl E-mail Filter\z/,
14
+ }
15
+ Re1 = {
16
+ :begin => %r/\AYour message could not be sent[.]\z/,
17
+ :error => %r/\AFailed to send to identified host,\z/,
18
+ :rfc822 => %r|\AContent-Type: message/rfc822\z|,
19
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
20
+ }
21
+ Indicators = Sisimai::MTA.INDICATORS
22
+ LongFields = Sisimai::RFC5322.LONGFIELDS
23
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
24
+
25
+ def description; return 'WebSense SurfControl'; end
26
+ def smtpagent; return 'SurfControl'; end
27
+ # X-SEF-ZeroHour-RefID: fgs=000000000
28
+ # X-SEF-Processed: 0_0_0_000__2010_04_29_23_34_45
29
+ # X-Mailer: SurfControl E-mail Filter
30
+ def headerlist; return ['X-SEF-Processed', 'X-Mailer']; end
31
+ def pattern; return Re0; end
32
+
33
+ # Parse bounce messages from SurfControl
34
+ # @param [Hash] mhead Message header of a bounce email
35
+ # @options mhead [String] from From header
36
+ # @options mhead [String] date Date header
37
+ # @options mhead [String] subject Subject header
38
+ # @options mhead [Array] received Received headers
39
+ # @options mhead [String] others Other required headers
40
+ # @param [String] mbody Message body of a bounce email
41
+ # @return [Hash, Nil] Bounce data list and message/rfc822
42
+ # part or nil if it failed to parse or
43
+ # the arguments are missing
44
+ def scan(mhead, mbody)
45
+ return nil unless mhead
46
+ return nil unless mbody
47
+ return nil unless mhead['x-sef-processed']
48
+ return nil unless mhead['x-mailer']
49
+ return nil unless mhead['x-mailer'] =~ Re0[:'x-mailer']
50
+
51
+ dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
52
+ hasdivided = mbody.split("\n")
53
+ havepassed = [''];
54
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
55
+ rfc822part = '' # (String) message/rfc822-headers part
56
+ previousfn = '' # (String) Previous field name
57
+ readcursor = 0 # (Integer) Points the current cursor position
58
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
59
+ v = nil
60
+
61
+ hasdivided.each do |e|
62
+ # Save the current line for the next loop
63
+ havepassed << e; p = havepassed[-2]
64
+
65
+ if readcursor == 0
66
+ # Beginning of the bounce message or delivery status part
67
+ if e =~ Re1[:begin]
68
+ readcursor |= Indicators[:'deliverystatus']
69
+ next
70
+ end
71
+ end
72
+
73
+ if readcursor & Indicators[:'message-rfc822'] == 0
74
+ # Beginning of the original message part
75
+ if e =~ Re1[:rfc822]
76
+ readcursor |= Indicators[:'message-rfc822']
77
+ next
78
+ end
79
+ end
80
+
81
+ if readcursor & Indicators[:'message-rfc822'] > 0
82
+ # After "message/rfc822"
83
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
84
+ # Get required headers only
85
+ lhs = cv[1].downcase
86
+ previousfn = ''
87
+ next unless RFC822Head.key?(lhs)
88
+
89
+ previousfn = lhs
90
+ rfc822part += e + "\n"
91
+
92
+ elsif e =~ /\A[ \t]+/
93
+ # Continued line from the previous line
94
+ next if rfc822next[previousfn]
95
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
96
+
97
+ else
98
+ # Check the end of headers in rfc822 part
99
+ next unless LongFields.key?(previousfn)
100
+ next unless e.empty?
101
+ rfc822next[previousfn] = true
102
+ end
103
+
104
+ else
105
+ # Before "message/rfc822"
106
+ next if readcursor & Indicators[:'deliverystatus'] == 0
107
+ next if e.empty?
108
+
109
+ # Your message could not be sent.
110
+ # A transcript of the attempts to send the message follows.
111
+ # The number of attempts made: 1
112
+ # Addressed To: kijitora@example.com
113
+ #
114
+ # Thu 29 Apr 2010 23:34:45 +0900
115
+ # Failed to send to identified host,
116
+ # kijitora@example.com: [192.0.2.5], 550 kijitora@example.com... No such user
117
+ # --- Message non-deliverable.
118
+ v = dscontents[-1]
119
+
120
+ if cv = e.match(/\AAddressed To:[ ]*([^ ]+?[@][^ ]+?)\z/)
121
+ # Addressed To: kijitora@example.com
122
+ if v['recipient']
123
+ # There are multiple recipient addresses in the message body.
124
+ dscontents << Sisimai::MTA.DELIVERYSTATUS
125
+ v = dscontents[-1]
126
+ end
127
+ v['recipient'] = cv[1]
128
+ recipients += 1
129
+
130
+ elsif e =~ /\A(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[ ,]/
131
+ # Thu 29 Apr 2010 23:34:45 +0900
132
+ v['date'] = e
133
+
134
+ elsif cv = e.match(/\A[^ ]+[@][^ ]+:[ ]*\[(\d+[.]\d+[.]\d+[.]\d)\],[ ]*(.+)\z/)
135
+ # kijitora@example.com: [192.0.2.5], 550 kijitora@example.com... No such user
136
+ v['rhost'] = cv[1]
137
+ v['diagnosis'] = cv[2]
138
+
139
+ else
140
+ # Fallback, parse RFC3464 headers.
141
+ if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
142
+ # Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
143
+ v['spec'] = cv[1].upcase
144
+ v['diagnosis'] = cv[2]
145
+
146
+ elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ ]+(.+)\z/)
147
+ # Continued line of the value of Diagnostic-Code header
148
+ v['diagnosis'] ||= ''
149
+ v['diagnosis'] += ' ' + cv[1]
150
+ havepassed[-1] = 'Diagnostic-Code: ' + e
151
+
152
+ elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
153
+ # Action: failed
154
+ v['action'] = cv[1].downcase
155
+
156
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
157
+ # Status: 5.0.-
158
+ v['status'] = cv[1]
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ return nil if recipients == 0
165
+ require 'sisimai/string'
166
+ require 'sisimai/smtp/status'
167
+
168
+ dscontents.map do |e|
169
+ e['agent'] = Sisimai::MTA::SurfControl.smtpagent
170
+
171
+ if mhead['received'].size > 0
172
+ # Get localhost and remote host name from Received header.
173
+ r0 = mhead['received']
174
+ ['lhost', 'rhost'].each { |a| e[a] ||= '' }
175
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
176
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
177
+ end
178
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
179
+
180
+ e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
181
+ e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
182
+ e['action'] = 'failed' if e['status'] =~ /\A[45]/
183
+ e.each_key { |a| e[a] ||= '' }
184
+ end
185
+
186
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
187
+ end
188
+
189
+ end
190
+ end
191
+ end
192
+ end
193
+
@@ -0,0 +1,148 @@
1
+ module Sisimai
2
+ module MTA
3
+ # Sisimai::MTA::UserDefined is an example module as a template to implement
4
+ # your custom MTA module.
5
+ module UserDefined
6
+ # Imported from p5-Sisimail/lib/Sisimai/MTA/UserDefined.pm
7
+ class << self
8
+ require 'sisimai/mta'
9
+ require 'sisimai/rfc5322'
10
+
11
+ # Re0 is a regular expression to match with message headers which are
12
+ # given as the first argument of scan() method.
13
+ Re0 = {
14
+ :from => %r/\AMail Sysmet/,
15
+ :subject => %r/\AError Mail Report/,
16
+ }
17
+
18
+ # Re1 is delimiter set of these sections:
19
+ # begin: The first line of a bounce message to be parsed.
20
+ # error: The first line of an error message to get an error reason, recipient
21
+ # addresses, or other bounce information.
22
+ # rfc822: The first line of the original message.
23
+ # endof: Fixed string ``__END_OF_EMAIL_MESSAGE__''
24
+ Re1 = {
25
+ :begin => %r/\A[ \t]+[-]+ Transcript of session follows [-]+\z/,
26
+ :error => %r/\A[.]+ while talking to .+[:]\z/,
27
+ :rfc822 => %r{\AContent-Type:[ ]*(?:message/rfc822|text/rfc822-headers)\z},
28
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
29
+ }
30
+ Indicators = Sisimai::MTA.INDICATORS
31
+ LongFields = Sisimai::RFC5322.LONGFIELDS
32
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
33
+
34
+ def description; return 'Module description'; end
35
+ def smtpagent; return 'Module name'; end
36
+ def headerlist; return ['X-Some-UserDefined-Header']; end
37
+ def pattern; return Re0; end
38
+
39
+ # @abstract Template for User-Defined MTA module
40
+ # @param [Hash] mhead Message header of a bounce email
41
+ # @options mhead [String] from From header
42
+ # @options mhead [String] date Date header
43
+ # @options mhead [String] subject Subject header
44
+ # @options mhead [Array] received Received headers
45
+ # @options mhead [String] others Other required headers
46
+ # @param [String] mbody Message body of a bounce email
47
+ # @return [Hash, Nil] Bounce data list and message/rfc822
48
+ # part or nil if it failed to parse or
49
+ # the arguments are missing
50
+ def scan(mhead, mbody)
51
+ return nil unless mhead
52
+ return nil unless mbody
53
+
54
+ match = 0
55
+ # 1. Check some value in mhead using regular expression or "==" operator
56
+ # whether the bounce message should be parsed by this module or not.
57
+ # - Matched 1 or more values: Proceed to the step 2.
58
+ # - Did not matched: return nil
59
+ #
60
+ match += 1 if mhead['subject'] =~ Re0[:subject]
61
+ match += 1 if mhead['from'] =~ Re0[:from]
62
+ match += 1 if mhead['x-some-userdefined-header']
63
+ return nil if match == 0
64
+
65
+ # 2. Parse message body(mbody) of the bounce message. See some modules
66
+ # in lib/sisimai/mta or lib/sisimai/msp directory to implement codes.
67
+ dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
68
+ hasdivided = mbody.split("\n")
69
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
70
+ rfc822part = '' # (String) message/rfc822-headers part
71
+ previousfn = '' # (String) Previous field name
72
+ readcursor = 0 # (Integer) Points the current cursor position
73
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
74
+
75
+ hasdivided.each do |e|
76
+ if readcursor == 0
77
+ # Beginning of the bounce message or delivery status part
78
+ if e =~ Re1[:begin]
79
+ readcursor |= Indicators[:'deliverystatus']
80
+ next
81
+ end
82
+ end
83
+
84
+ if readcursor & Indicators[:'message-rfc822'] == 0
85
+ # Beginning of the original message part
86
+ if e =~ Re1[:rfc822]
87
+ readcursor |= Indicators[:'message-rfc822']
88
+ next
89
+ end
90
+ end
91
+
92
+ if readcursor & Indicators[:'message-rfc822'] > 0
93
+ # After "message/rfc822"
94
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
95
+ # Get required headers only
96
+ lhs = cv[1].downcase
97
+ previousfn = ''
98
+ next unless RFC822Head.key?(lhs)
99
+
100
+ previousfn = lhs
101
+ rfc822part += e + "\n"
102
+
103
+ elsif e =~ /\A[ \t]+/
104
+ # Continued line from the previous line
105
+ next if rfc822next[previousfn]
106
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
107
+
108
+ else
109
+ # Check the end of headers in rfc822 part
110
+ next unless LongFields.key?(previousfn)
111
+ next unless e.empty?
112
+ rfc822next[previousfn] = true
113
+ end
114
+
115
+ else
116
+ # Before "message/rfc822"
117
+ next if readcursor & Indicators[:'deliverystatus'] == 0
118
+ next if e.empty?
119
+
120
+ end
121
+ end
122
+
123
+ # The following code is dummy to be passed "make test".
124
+ dscontents[0]['recipient'] = 'kijitora@example.jp'
125
+ dscontents[0]['diagnosis'] = '550 something wrong'
126
+ dscontents[0]['status'] = '5.1.1'
127
+ dscontents[0]['spec'] = 'SMTP'
128
+ dscontents[0]['date'] = 'Thu 29 Apr 2010 23:34:45 +0900'
129
+ dscontents[0]['agent'] = Sisimai::MTA::UserDefined.smtpagent
130
+ recipients = 1 if dscontents[0]['recipient']
131
+
132
+ rfc822part += 'From: shironeko@example.org' + "\n"
133
+ rfc822part += 'Subject: Nyaaan' + "\n"
134
+ rfc822part += 'Message-Id: 000000000000@example.jp' + "\n"
135
+
136
+ # 3. Return undef when there is no recipient address which is failed to
137
+ # delivery in the bounce message
138
+ return nil if recipients == 0
139
+
140
+ # 4. Return the following variable.
141
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
142
+ end
143
+
144
+ end
145
+ end
146
+ end
147
+ end
148
+
@@ -0,0 +1,232 @@
1
+ module Sisimai
2
+ module MTA
3
+ # Sisimai::MTA::V5sendmail parses a bounce email which created by Sendmail
4
+ # version 5. Methods in the module are called from only Sisimai::Message.
5
+ module V5sendmail
6
+ # Imported from p5-Sisimail/lib/Sisimai/MTA/V5sendmail.pm
7
+ class << self
8
+ require 'sisimai/mta'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :from => %r/\AMail Delivery Subsystem/,
13
+ :subject => %r/\AReturned mail: [A-Z]/,
14
+ }
15
+ # Error text regular expressions which defined in src/savemail.c
16
+ # savemail.c:485| (void) fflush(stdout);
17
+ # savemail.c:486| p = queuename(e->e_parent, 'x');
18
+ # savemail.c:487| if ((xfile = fopen(p, "r")) == NULL)
19
+ # savemail.c:488| {
20
+ # savemail.c:489| syserr("Cannot open %s", p);
21
+ # savemail.c:490| fprintf(fp, " ----- Transcript of session is unavailable -----\n");
22
+ # savemail.c:491| }
23
+ # savemail.c:492| else
24
+ # savemail.c:493| {
25
+ # savemail.c:494| fprintf(fp, " ----- Transcript of session follows -----\n");
26
+ # savemail.c:495| if (e->e_xfp != NULL)
27
+ # savemail.c:496| (void) fflush(e->e_xfp);
28
+ # savemail.c:497| while (fgets(buf, sizeof buf, xfile) != NULL)
29
+ # savemail.c:498| putline(buf, fp, m);
30
+ # savemail.c:499| (void) fclose(xfile);
31
+ Re1 = {
32
+ :begin => %r/\A[ \t]+[-]+ Transcript of session follows [-]+\z/,
33
+ :error => %r/\A[.]+ while talking to .+[:]\z/,
34
+ :rfc822 => %r{\A[ \t]+-----[ ](?:
35
+ Unsent[ ]message[ ]follows
36
+ |No[ ]message[ ]was[ ]collected
37
+ )[ ]-----
38
+ }x,
39
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
40
+ }
41
+ Indicators = Sisimai::MTA.INDICATORS
42
+ LongFields = Sisimai::RFC5322.LONGFIELDS
43
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
44
+
45
+ def description; return 'Sendmail version 5'; end
46
+ def smtpagent; return 'V5sendmail'; end
47
+ def headerlist; return []; end
48
+ def pattern; return Re0; end
49
+
50
+ # Parse bounce messages from Sendmail version 5
51
+ # @param [Hash] mhead Message header of a bounce email
52
+ # @options mhead [String] from From header
53
+ # @options mhead [String] date Date header
54
+ # @options mhead [String] subject Subject header
55
+ # @options mhead [Array] received Received headers
56
+ # @options mhead [String] others Other required headers
57
+ # @param [String] mbody Message body of a bounce email
58
+ # @return [Hash, Nil] Bounce data list and message/rfc822
59
+ # part or nil if it failed to parse or
60
+ # the arguments are missing
61
+ def scan(mhead, mbody)
62
+ return nil unless mhead
63
+ return nil unless mbody
64
+ return nil unless mhead['subject'] =~ Re0[:subject]
65
+
66
+ dscontents = []; dscontents << Sisimai::MTA.DELIVERYSTATUS
67
+ hasdivided = mbody.split("\n")
68
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
69
+ rfc822part = '' # (String) message/rfc822-headers part
70
+ previousfn = '' # (String) Previous field name
71
+ readcursor = 0 # (Integer) Points the current cursor position
72
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
73
+ responding = [] # (Array) Responses from remote server
74
+ commandset = [] # (Array) SMTP command which is sent to remote server
75
+ anotherset = {} # (Hash) Another error information
76
+ errorindex = -1 # (Integer)
77
+ v = nil
78
+
79
+ hasdivided.each do |e|
80
+ if readcursor == 0
81
+ # Beginning of the bounce message or delivery status part
82
+ if e =~ Re1[:begin]
83
+ readcursor |= Indicators[:'deliverystatus']
84
+ next
85
+ end
86
+ end
87
+
88
+ if readcursor & Indicators[:'message-rfc822'] == 0
89
+ # Beginning of the original message part
90
+ if e =~ Re1[:rfc822]
91
+ readcursor |= Indicators[:'message-rfc822']
92
+ next
93
+ end
94
+ end
95
+
96
+ if readcursor & Indicators[:'message-rfc822'] > 0
97
+ # After "message/rfc822"
98
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
99
+ # Get required headers only
100
+ lhs = cv[1].downcase
101
+ previousfn = ''
102
+ next unless RFC822Head.key?(lhs)
103
+
104
+ previousfn = lhs
105
+ rfc822part += e + "\n"
106
+
107
+ elsif e =~ /\A[ \t]+/
108
+ # Continued line from the previous line
109
+ next if rfc822next[previousfn]
110
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
111
+
112
+ else
113
+ # Check the end of headers in rfc822 part
114
+ next unless LongFields.key?(previousfn)
115
+ next unless e.empty?
116
+ rfc822next[previousfn] = true
117
+ end
118
+
119
+ else
120
+ # Before "message/rfc822"
121
+ next if readcursor & Indicators[:'deliverystatus'] == 0
122
+ next if e.empty?
123
+
124
+ # ----- Transcript of session follows -----
125
+ # While talking to smtp.example.com:
126
+ # >>> RCPT To:<kijitora@example.org>
127
+ # <<< 550 <kijitora@example.org>, User Unknown
128
+ # 550 <kijitora@example.org>... User unknown
129
+ # 421 example.org (smtp)... Deferred: Connection timed out during user open with example.org
130
+ v = dscontents[-1]
131
+
132
+ if cv = e.match(/\A\d{3}[ ]+[<]([^ ]+[@][^ ]+)[>][.]{3}[ ]*(.+)\z/)
133
+ # 550 <kijitora@example.org>... User unknown
134
+ if v['recipient']
135
+ # There are multiple recipient addresses in the message body.
136
+ dscontents << Sisimai::MTA.DELIVERYSTATUS
137
+ v = dscontents[-1]
138
+ end
139
+ v['recipient'] = cv[1]
140
+ v['diagnosis'] = cv[2]
141
+
142
+ if responding[recipients]
143
+ # Concatenate the response of the server and error message
144
+ v['diagnosis'] ||= ''
145
+ v['diagnosis'] += ': ' + responding[recipients]
146
+ end
147
+ recipients += 1
148
+
149
+ elsif cv = e.match(/\A[>]{3}[ ]*([A-Z]{4})[ ]*/)
150
+ # >>> RCPT To:<kijitora@example.org>
151
+ commandset[recipients] = cv[1]
152
+
153
+ elsif cv = e.match(/\A[<]{3}[ ]+(.+)\z/)
154
+ # <<< Response
155
+ # <<< 501 <shironeko@example.co.jp>... no access from mail server [192.0.2.55] which is an open relay.
156
+ # <<< 550 Requested User Mailbox not found. No such user here.
157
+ responding[recipients] = cv[1]
158
+
159
+ else
160
+ # Detect SMTP session error or connection error
161
+ next if v['sessionerr']
162
+
163
+ if e =~ Re1[:error]
164
+ # ----- Transcript of session follows -----
165
+ # ... while talking to mta.example.org.:
166
+ v['sessionerr'] = true
167
+ next
168
+ end
169
+
170
+ if cv = e.match(/\A\d{3}[ ]+.+[.]{3}[ \t]*(.+)\z/)
171
+ # 421 example.org (smtp)... Deferred: Connection timed out during user open with example.org
172
+ anotherset['diagnosis'] = cv[1]
173
+ end
174
+ end
175
+ end
176
+ end
177
+ return nil if readcursor & Indicators[:'message-rfc822'] == 0
178
+
179
+ if recipients == 0
180
+ # Get the recipient address from the original message
181
+ if cv = rfc822part.match(/^To: (.+)$/m)
182
+ # The value of To: header in the original message
183
+ dscontents[0]['recipient'] = Sisimai::Address.s3s4(cv[1])
184
+ recipients = 1
185
+ end
186
+ end
187
+ return nil if recipients == 0
188
+ require 'sisimai/string'
189
+
190
+ dscontents.map do |e|
191
+ errorindex += 1
192
+
193
+ if mhead['received'].size > 0
194
+ # Get localhost and remote host name from Received header.
195
+ r0 = mhead['received']
196
+ ['lhost', 'rhost'].each { |a| e[a] ||= '' }
197
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
198
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
199
+ end
200
+ e['spec'] ||= 'SMTP'
201
+ e['agent'] = Sisimai::MTA::V5sendmail.smtpagent
202
+ e['command'] = commandset[errorindex] || ''
203
+
204
+ if anotherset['diagnosis'] && anotherset['diagnosis'].size > 0
205
+ # Copy alternative error message
206
+ e['diagnosis'] ||= anotherset['diagnosis']
207
+
208
+ else
209
+ # Set server response as a error message
210
+ e['diagnosis'] ||= responding[errorindex]
211
+ end
212
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
213
+
214
+ unless e['recipient'] =~ /\A[^ ]+[@][^ ]+\z/
215
+ # @example.jp, no local part
216
+ if cv = e['diagnosis'].match(/[<]([^ ]+[@][^ ]+)[>]/)
217
+ # Get email address from the value of Diagnostic-Code header
218
+ e['recipient'] = cv[1]
219
+ end
220
+ end
221
+ e.delete('sessionerr')
222
+ e.each_key { |a| e[a] ||= '' }
223
+ end
224
+
225
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
226
+ end
227
+
228
+ end
229
+ end
230
+ end
231
+ end
232
+