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,243 @@
1
+ module Sisimai
2
+ module MSP::US
3
+ # Sisimai::MSP::US::Bigfoot parses a bounce email which created by Bigfoot.
4
+ # Methods in the module are called from only Sisimai::Message.
5
+ module Bigfoot
6
+ # Imported from p5-Sisimail/lib/Sisimai/MSP/US/Bigfoot.pm
7
+ class << self
8
+ require 'sisimai/msp'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :from => %r/[@]bigfoot[.]com[>]/,
13
+ :subject => %r/\AReturned mail: /,
14
+ :received => %r/\w+[.]bigfoot[.]com\b/,
15
+ }
16
+ Re1 = {
17
+ :begin => %r/\A[ \t]+[-]+[ \t]*Transcript of session follows/,
18
+ :rfc822 => %r|\AContent-Type: message/partial|,
19
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
20
+ }
21
+ Indicators = Sisimai::MSP.INDICATORS
22
+ LongFields = Sisimai::RFC5322.LONGFIELDS
23
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
24
+
25
+ def description; return 'Bigfoot: http://www.bigfoot.com'; end
26
+ def smtpagent; return 'US::Bigfoot'; end
27
+ def headerlist; return []; end
28
+ def pattern; return Re0; end
29
+
30
+ # Parse bounce messages from Bigfoot
31
+ # @param [Hash] mhead Message header of a bounce email
32
+ # @options mhead [String] from From header
33
+ # @options mhead [String] date Date header
34
+ # @options mhead [String] subject Subject header
35
+ # @options mhead [Array] received Received headers
36
+ # @options mhead [String] others Other required headers
37
+ # @param [String] mbody Message body of a bounce email
38
+ # @return [Hash, Nil] Bounce data list and message/rfc822
39
+ # part or nil if it failed to parse or
40
+ # the arguments are missing
41
+ def scan(mhead, mbody)
42
+ return nil unless mhead
43
+ return nil unless mbody
44
+
45
+ match = 0
46
+ match += 1 if mhead['from'] =~ Re0[:from]
47
+ match += 1 if mhead['received'].find { |a| a =~ Re0[:received] }
48
+ return nil if match == 0
49
+
50
+ require 'sisimai/address'
51
+ dscontents = []; dscontents << Sisimai::MSP.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
+ commandtxt = '' # (String) SMTP Command name begin with the string '>>>'
60
+ esmtpreply = '' # (String) Reply from remote server on SMTP session
61
+ connvalues = 0 # (Integer) Flag, 1 if all the value of $connheader have been set
62
+ connheader = {
63
+ 'date' => '', # The value of Arrival-Date header
64
+ 'lhost' => '', # The value of Reporting-MTA header
65
+ }
66
+ v = nil
67
+
68
+ hasdivided.each do |e|
69
+ # Save the current line for the next loop
70
+ havepassed << e; p = havepassed[-2]
71
+
72
+ if readcursor == 0
73
+ # Beginning of the bounce message or delivery status part
74
+ if e =~ Re1[:begin]
75
+ readcursor |= Indicators[:'deliverystatus']
76
+ next
77
+ end
78
+ end
79
+
80
+ if readcursor & Indicators[:'message-rfc822'] == 0
81
+ # Beginning of the original message part
82
+ if e =~ Re1[:rfc822]
83
+ readcursor |= Indicators[:'message-rfc822']
84
+ next
85
+ end
86
+ end
87
+
88
+ if readcursor & Indicators[:'message-rfc822'] > 0
89
+ # After "message/rfc822"
90
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
91
+ # Get required headers only
92
+ lhs = cv[1].downcase
93
+ previousfn = ''
94
+ next unless RFC822Head.key?(lhs)
95
+
96
+ previousfn = lhs
97
+ rfc822part += e + "\n"
98
+
99
+ elsif e =~ /\A[ \t]+/
100
+ # Continued line from the previous line
101
+ next if rfc822next[previousfn]
102
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
103
+
104
+ else
105
+ # Check the end of headers in rfc822 part
106
+ next unless LongFields.key?(previousfn)
107
+ next unless e.empty?
108
+ rfc822next[previousfn] = true
109
+ end
110
+
111
+ else
112
+ # Before "message/rfc822"
113
+ next if readcursor & Indicators[:'deliverystatus'] == 0
114
+ next if e.empty?
115
+
116
+ if connvalues == connheader.keys.size
117
+ # Final-Recipient: RFC822; <destinaion@example.net>
118
+ # Action: failed
119
+ # Status: 5.7.1
120
+ # Remote-MTA: DNS; p01c11m075.mx.example.net
121
+ # Diagnostic-Code: SMTP; 553 Invalid recipient destinaion@example.net (Mode: normal)
122
+ # Last-Attempt-Date: Sun, 28 Dec 2014 18:17:16 -0800
123
+ v = dscontents[-1]
124
+
125
+ if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
126
+ # Final-Recipient: RFC822; <destinaion@example.net>
127
+ if v['recipient']
128
+ # There are multiple recipient addresses in the message body.
129
+ dscontents << Sisimai::MSP.DELIVERYSTATUS
130
+ v = dscontents[-1]
131
+ end
132
+ v['recipient'] = Sisimai::Address.s3s4(cv[1])
133
+ recipients += 1
134
+
135
+ elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
136
+ # Action: failed
137
+ v['action'] = cv[1].downcase
138
+
139
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
140
+ # Status: 5.7.1
141
+ v['status'] = cv[1]
142
+
143
+ elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
144
+ # Remote-MTA: DNS; p01c11m075.mx.example.net
145
+ v['rhost'] = cv[1].downcase
146
+
147
+ else
148
+ # Get error message
149
+ if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
150
+ # Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
151
+ v['spec'] = cv[1].upcase
152
+ v['diagnosis'] = cv[2]
153
+
154
+ elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
155
+ # Continued line of the value of Diagnostic-Code header
156
+ v['diagnosis'] ||= ''
157
+ v['diagnosis'] += ' ' + cv[1]
158
+ havepassed[-1] = 'Diagnostic-Code: ' + e
159
+ end
160
+ end
161
+
162
+ else
163
+ # ----- Transcript of session follows -----
164
+ # >>> RCPT TO:<destinaion@example.net>
165
+ # <<< 553 Invalid recipient destinaion@example.net (Mode: normal)
166
+ #
167
+ # --201412281816847
168
+ # Content-Type: message/delivery-status
169
+ #
170
+ # Reporting-MTA: dns; litemail57.bigfoot.com
171
+ # Arrival-Date: Sun, 28 Dec 2014 18:17:16 -0800
172
+ #
173
+ if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
174
+ # Reporting-MTA: dns; mx.example.jp
175
+ next if connheader['lhost'].size > 0
176
+ connheader['lhost'] = cv[1].downcase
177
+ connvalues += 1
178
+
179
+ elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
180
+ # Arrival-Date: Wed, 29 Apr 2009 16:03:18 +0900
181
+ next if connheader['date'].size > 0
182
+ connheader['date'] = cv[1]
183
+ connvalues += 1
184
+
185
+ else
186
+ # ----- Transcript of session follows -----
187
+ # >>> RCPT TO:<destinaion@example.net>
188
+ # <<< 553 Invalid recipient destinaion@example.net (Mode: normal)
189
+ if cv = e.match(/\A[>]{3}[ ]+([A-Z]{4})[ ]?/)
190
+ # >>> DATA
191
+ commandtxt = cv[1]
192
+
193
+ elsif cv = e.match(/\A[<]{3}[ ]+(.+)\z/)
194
+ # <<< Response
195
+ esmtpreply = cv[1]
196
+ end
197
+
198
+ end
199
+
200
+ end
201
+ end
202
+ end
203
+
204
+ return nil if recipients == 0
205
+ require 'sisimai/string'
206
+ require 'sisimai/smtp/status'
207
+
208
+ dscontents.map do |e|
209
+ # Set default values if each value is empty.
210
+ connheader.each_key { |a| e[a] ||= connheader[a] || '' }
211
+
212
+ if mhead['received'].size > 0
213
+ # Get localhost and remote host name from Received header.
214
+ r0 = mhead['received']
215
+ ['lhost', 'rhost'].each { |a| e[a] ||= '' }
216
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
217
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
218
+ end
219
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
220
+
221
+ e['command'] = commandtxt
222
+ if e['command'].empty?
223
+ e['command'] = 'EHLO' if esmtpreply.size > 0
224
+ end
225
+
226
+ if e['status'].empty? || e['status'] =~ /\A\d[.]0[.]0\z/
227
+ # There is no value of Status header or the value is 5.0.0, 4.0.0
228
+ pseudostatus = Sisimai::SMTP::Status.find(e['diagnosis'])
229
+ e['status'] = pseudostatus if pseudostatus.size > 0
230
+ end
231
+
232
+ e['spec'] ||= 'SMTP'
233
+ e['agent'] = Sisimai::MSP::US::Bigfoot.smtpagent
234
+ end
235
+
236
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
237
+ end
238
+
239
+ end
240
+ end
241
+ end
242
+ end
243
+
@@ -0,0 +1,306 @@
1
+ module Sisimai
2
+ module MSP::US
3
+ # Sisimai::MSP::US::Facebook parses a bounce email which created by Facebook.
4
+ # Methods in the module are called from only Sisimai::Message.
5
+ module Facebook
6
+ # Imported from p5-Sisimail/lib/Sisimai/MSP/US/Facebook.pm
7
+ class << self
8
+ require 'sisimai/msp'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :from => %r/\AFacebook [<]mailer-daemon[@]mx[.]facebook[.]com[>]\z/,
13
+ :subject => %r/\ASorry, your message could not be delivered\z/,
14
+ }
15
+ Re1 = {
16
+ :begin => %r/\AThis message was created automatically by Facebook[.]\z/,
17
+ :rfc822 => %r/\AContent-Disposition: inline\z/,
18
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
19
+ }
20
+
21
+ # http://postmaster.facebook.com/response_codes
22
+ # NOT TESTD EXCEPT RCP-P2
23
+ ReFailure = {
24
+ 'userunknown' => [
25
+ 'RCP-P1', # The attempted recipient address does not exist.
26
+ 'INT-P1', # The attempted recipient address does not exist.
27
+ 'INT-P3', # The attempted recpient group address does not exist.
28
+ 'INT-P4', # The attempted recipient address does not exist.
29
+ ],
30
+ 'filtered' => [
31
+ 'RCP-P2', # The attempted recipient's preferences prevent messages from being delivered.
32
+ 'RCP-P3', # The attempted recipient's privacy settings blocked the delivery.
33
+ ],
34
+ 'mesgtoobig' => [
35
+ 'MSG-P1', # The message exceeds Facebook's maximum allowed size.
36
+ 'INT-P2', # The message exceeds Facebook's maximum allowed size.
37
+ ],
38
+ 'contenterror' => [
39
+ 'MSG-P2', # The message contains an attachment type that Facebook does not accept.
40
+ 'MSG-P3', # The message contains multiple instances of a header field that can only be present once. Please see RFC 5322, section 3.6 for more information
41
+ 'POL-P6', # The message contains a url that has been blocked by Facebook.
42
+ 'POL-P7', # The message does not comply with Facebook's abuse policies and will not be accepted.
43
+ ],
44
+ 'securityerror' => [
45
+ 'POL-P1', # Your mail server's IP Address is listed on the Spamhaus PBL.
46
+ 'POL-P2', # Facebook will no longer accept mail from your mail server's IP Address.
47
+ 'POL-P5', # The message contains a virus.
48
+ 'POL-P7', # The message does not comply with Facebook's Domain Authentication requirements.
49
+ ],
50
+ 'notaccept' => [
51
+ 'POL-P3', # Facebook is not accepting messages from your mail server. This will persist for 4 to 8 hours.
52
+ 'POL-P4', # Facebook is not accepting messages from your mail server. This will persist for 24 to 48 hours.
53
+ 'POL-T1', # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 1 to 2 hours.
54
+ 'POL-T2', # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 4 to 8 hours.
55
+ 'POL-T3', # Facebook is not accepting messages from your mail server, but they may be retried later. This will persist for 24 to 48 hours.
56
+ ],
57
+ 'rejected' => [
58
+ 'DNS-P1', # Your SMTP MAIL FROM domain does not exist.
59
+ 'DNS-P2', # Your SMTP MAIL FROM domain does not have an MX record.
60
+ 'DNS-T1', # Your SMTP MAIL FROM domain exists but does not currently resolve.
61
+ 'DNS-P3', # Your mail server does not have a reverse DNS record.
62
+ 'DNS-T2', # You mail server's reverse DNS record does not currently resolve.
63
+ ],
64
+ 'systemerror' => [
65
+ 'CON-T1', # Facebook's mail server currently has too many connections open to allow another one.
66
+ ],
67
+ 'undefined' => [
68
+ 'RCP-T1', # The attempted recipient address is not currently available due to an internal system issue. This is a temporary condition.
69
+ 'MSG-T1', # The number of recipients on the message exceeds Facebook's allowed maximum.
70
+ 'CON-T2', # Your mail server currently has too many connections open to Facebook's mail servers.
71
+ 'CON-T3', # Your mail server has opened too many new connections to Facebook's mail servers in a short period of time.
72
+ 'CON-T4', # Your mail server has exceeded the maximum number of recipients for its current connection.
73
+ ],
74
+ 'suspend' => [
75
+ 'RCP-T4', # The attempted recipient address is currently deactivated. The user may or may not reactivate it.
76
+ ],
77
+ }
78
+ Indicators = Sisimai::MSP.INDICATORS
79
+ LongFields = Sisimai::RFC5322.LONGFIELDS
80
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
81
+
82
+ def description; return 'Facebook: https://www.facebook.com'; end
83
+ def smtpagent; return 'US::Facebook'; end
84
+ def headerlist; return []; end
85
+ def pattern; return Re0; end
86
+
87
+ # Parse bounce messages from Facebook
88
+ # @param [Hash] mhead Message header of a bounce email
89
+ # @options mhead [String] from From header
90
+ # @options mhead [String] date Date header
91
+ # @options mhead [String] subject Subject header
92
+ # @options mhead [Array] received Received headers
93
+ # @options mhead [String] others Other required headers
94
+ # @param [String] mbody Message body of a bounce email
95
+ # @return [Hash, Nil] Bounce data list and message/rfc822
96
+ # part or nil if it failed to parse or
97
+ # the arguments are missing
98
+ def scan(mhead, mbody)
99
+ return nil unless mhead
100
+ return nil unless mbody
101
+ return nil unless mhead['from'] =~ Re0[:from]
102
+ return nil unless mhead['subject'] =~ Re0[:subject]
103
+
104
+ dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
105
+ hasdivided = mbody.split("\n")
106
+ havepassed = [''];
107
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
108
+ rfc822part = '' # (String) message/rfc822-headers part
109
+ previousfn = '' # (String) Previous field name
110
+ readcursor = 0 # (Integer) Points the current cursor position
111
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
112
+ fbresponse = '' # (String) Response code from Facebook
113
+ connvalues = 0 # (Integer) Flag, 1 if all the value of $connheader have been set
114
+ connheader = {
115
+ 'date' => '', # The value of Arrival-Date header
116
+ 'lhost' => '', # The value of Reporting-MTA header
117
+ }
118
+ v = nil
119
+
120
+ hasdivided.each do |e|
121
+ # Save the current line for the next loop
122
+ havepassed << e; p = havepassed[-2]
123
+
124
+ if readcursor == 0
125
+ # Beginning of the bounce message or delivery status part
126
+ if e =~ Re1[:begin]
127
+ readcursor |= Indicators[:'deliverystatus']
128
+ next
129
+ end
130
+ end
131
+
132
+ if readcursor & Indicators[:'message-rfc822'] == 0
133
+ # Beginning of the original message part
134
+ if e =~ Re1[:rfc822]
135
+ readcursor |= Indicators[:'message-rfc822']
136
+ next
137
+ end
138
+ end
139
+
140
+ if readcursor & Indicators[:'message-rfc822'] > 0
141
+ # After "message/rfc822"
142
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
143
+ # Get required headers only
144
+ lhs = cv[1].downcase
145
+ previousfn = ''
146
+ next unless RFC822Head.key?(lhs)
147
+
148
+ previousfn = lhs
149
+ rfc822part += e + "\n"
150
+
151
+ elsif e =~ /\A[ \t]+/
152
+ # Continued line from the previous line
153
+ next if rfc822next[previousfn]
154
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
155
+
156
+ else
157
+ # Check the end of headers in rfc822 part
158
+ next unless LongFields.key?(previousfn)
159
+ next unless e.empty?
160
+ rfc822next[previousfn] = true
161
+ end
162
+
163
+ else
164
+ # Before "message/rfc822"
165
+ next if readcursor & Indicators[:'deliverystatus'] == 0
166
+ next if e.empty?
167
+
168
+ if connvalues == connheader.keys.size
169
+ # Reporting-MTA: dns; 10.138.205.200
170
+ # Arrival-Date: Thu, 23 Jun 2011 02:29:43 -0700
171
+ v = dscontents[-1]
172
+
173
+ if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
174
+ # Final-Recipient: RFC822; userunknown@example.jp
175
+ if v['recipient']
176
+ # There are multiple recipient addresses in the message body.
177
+ dscontents << Sisimai::MSP.DELIVERYSTATUS
178
+ v = dscontents[-1]
179
+ end
180
+ v['recipient'] = cv[1]
181
+ recipients += 1
182
+
183
+ elsif cv = e.match(/\A[Xx]-[Aa]ctual-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*(.+)\z/)
184
+ # X-Actual-Recipient: RFC822; kijitora@example.co.jp
185
+ v['alias'] = cv[1]
186
+
187
+ elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
188
+ # Action: failed
189
+ v['action'] = cv[1].downcase
190
+
191
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
192
+ # Status: 5.1.1
193
+ # Status:5.2.0
194
+ # Status: 5.1.0 (permanent failure)
195
+ v['status'] = cv[1]
196
+
197
+ elsif cv = e.match(/\A[Rr]emote-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
198
+ # Remote-MTA: DNS; mx.example.jp
199
+ v['rhost'] = cv[1].downcase
200
+
201
+ elsif cv = e.match(/\A[Ll]ast-[Aa]ttempt-[Dd]ate:[ ]*(.+)\z/)
202
+ # Last-Attempt-Date: Fri, 14 Feb 2014 12:30:08 -0500
203
+ v['date'] = cv[1]
204
+
205
+ else
206
+ if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
207
+ # Diagnostic-Code: smtp; 550 5.1.1 RCP-P2
208
+ # http://postmaster.facebook.com/response_codes?ip=192.0.2.135#rcp Refused due to recipient preferences
209
+ v['spec'] = cv[1].upcase
210
+ v['diagnosis'] = cv[2]
211
+
212
+ elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
213
+ # Continued line of the value of Diagnostic-Code header
214
+ v['diagnosis'] ||= ''
215
+ v['diagnosis'] += ' ' + cv[1]
216
+ havepassed[-1] = 'Diagnostic-Code: ' + e
217
+ end
218
+ end
219
+
220
+ else
221
+ if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
222
+ # Reporting-MTA: dns; mx.example.jp
223
+ next if connheader['lhost'].size > 0
224
+ connheader['lhost'] = cv[1].downcase
225
+ connvalues += 1
226
+
227
+ elsif cv = e.match(/\A[Aa]rrival-[Dd]ate:[ ]*(.+)\z/)
228
+ # Arrival-Date: Wed, 29 Apr 2009 16:03:18 +0900
229
+ next if connheader['date'].size > 0
230
+ connheader['date'] = cv[1]
231
+ connvalues += 1
232
+ end
233
+
234
+ end
235
+ end
236
+ end
237
+
238
+ return nil if recipients == 0
239
+ require 'sisimai/string'
240
+ require 'sisimai/smtp/status'
241
+
242
+ dscontents.map do |e|
243
+ e['lhost'] ||= connheader['lhost']
244
+
245
+ if mhead['received'].size > 0
246
+ # Get localhost and remote host name from Received header.
247
+ r0 = mhead['received']
248
+ ['lhost', 'rhost'].each { |a| e[a] ||= '' }
249
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
250
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
251
+ end
252
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
253
+
254
+ if cv = e['diagnosis'].match(/\b([A-Z]{3})[-]([A-Z])(\d)\b/)
255
+ # Diagnostic-Code: smtp; 550 5.1.1 RCP-P2
256
+ lhs = cv[1]
257
+ rhs = cv[2]
258
+ num = cv[3]
259
+
260
+ fbresponse = sprintf("%s-%s%d", lhs, rhs, num)
261
+ e['softbounce'] = rhs == 'P' ? 0 : 1
262
+ end
263
+
264
+ catch :SESSION do
265
+ ReFailure.each_key do |r|
266
+ # Verify each regular expression of session errors
267
+ ReFailure[r].each do |rr|
268
+ # Check each regular expression
269
+ next unless fbresponse == rr
270
+ e['reason'] = r
271
+ throw :SESSION
272
+ end
273
+ end
274
+ end
275
+
276
+ unless e['reason']
277
+ # http://postmaster.facebook.com/response_codes
278
+ # Facebook System Resource Issues
279
+ # These codes indicate a temporary issue internal to Facebook's
280
+ # system. Administrators observing these issues are not required to
281
+ # take any action to correct them.
282
+ if fbresponse =~ /\AINT-T\d+\z/
283
+ # * INT-Tx
284
+ #
285
+ # https://groups.google.com/forum/#!topic/cdmix/eXfi4ddgYLQ
286
+ # This block has not been tested because we have no email sample
287
+ # including "INT-T?" error code.
288
+ e['reason'] = 'systemerror'
289
+ e['softbounce'] = 1
290
+ end
291
+ end
292
+
293
+ e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
294
+ e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
295
+ e['action'] = 'failed' if e['status'] =~ /\A[45]/
296
+ e['agent'] = Sisimai::MSP::US::Facebook.smtpagent
297
+ end
298
+
299
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
300
+ end
301
+
302
+ end
303
+ end
304
+ end
305
+ end
306
+