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,357 @@
1
+ module Sisimai
2
+ module MSP::US
3
+ # Sisimai::MSP::US::Google parses a bounce email which created by Gmail.
4
+ # Methods in the module are called from only Sisimai::Message.
5
+ module Google
6
+ # Imported from p5-Sisimail/lib/Sisimai/MSP/US/Google.pm
7
+ class << self
8
+ require 'sisimai/msp'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :from => %r/[@]googlemail[.]com[>]?\z/,
13
+ :subject => %r/Delivery[ ]Status[ ]Notification/,
14
+ }
15
+ Re1 = {
16
+ :begin => %r/Delivery to the following recipient/,
17
+ :start => %r/Technical details of (?:permanent|temporary) failure:/,
18
+ :error => %r/The error that the other server returned was:/,
19
+ :rfc822 => %r{\A(?:
20
+ -----[ ]Original[ ]message[ ]-----
21
+ |[ \t]*-----[ ]Message[ ]header[ ]follows[ ]-----
22
+ )\z
23
+ }x,
24
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
25
+ }
26
+ ReFailure = {
27
+ 'expired' => %r{(?:
28
+ DNS[ ]Error:[ ]Could[ ]not[ ]contact[ ]DNS[ ]servers
29
+ |Delivery[ ]to[ ]the[ ]following[ ]recipient[ ]has[ ]been[ ]delayed
30
+ |The[ ]recipient[ ]server[ ]did[ ]not[ ]accept[ ]our[ ]requests[ ]to[ ]connect
31
+ )
32
+ }x,
33
+ 'hostunknown' => %r{DNS[ ]Error:[ ](?:
34
+ Domain[ ]name[ ]not[ ]found
35
+ |DNS[ ]server[ ]returned[ ]answer[ ]with[ ]no[ ]data
36
+ )
37
+ }x,
38
+ }
39
+ StateTable = {
40
+ # Technical details of permanent failure:
41
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
42
+ # We recommend contacting the other email provider for further information about the
43
+ # cause of this error. The error that the other server returned was:
44
+ # 500 Remote server does not support TLS (state 6).
45
+ '6' => { 'command' => 'MAIL', 'reason' => 'systemerror' },
46
+
47
+ # http://www.google.td/support/forum/p/gmail/thread?tid=08a60ebf5db24f7b&hl=en
48
+ # Technical details of permanent failure:
49
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
50
+ # We recommend contacting the other email provider for further information about the
51
+ # cause of this error. The error that the other server returned was:
52
+ # 535 SMTP AUTH failed with the remote server. (state 8).
53
+ '8' => { 'command' => 'AUTH', 'reason' => 'systemerror' },
54
+
55
+ # http://www.google.co.nz/support/forum/p/gmail/thread?tid=45208164dbca9d24&hl=en
56
+ # Technical details of temporary failure:
57
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
58
+ # We recommend contacting the other email provider for further information about the
59
+ # cause of this error. The error that the other server returned was:
60
+ # 454 454 TLS missing certificate: error:0200100D:system library:fopen:Permission denied (#4.3.0) (state 9).
61
+ '9' => { 'command' => 'AUTH', 'reason' => 'systemerror' },
62
+
63
+ # http://www.google.com/support/forum/p/gmail/thread?tid=5cfab8c76ec88638&hl=en
64
+ # Technical details of permanent failure:
65
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
66
+ # We recommend contacting the other email provider for further information about the
67
+ # cause of this error. The error that the other server returned was:
68
+ # 500 Remote server does not support SMTP Authenticated Relay (state 12).
69
+ '12' => { 'command' => 'AUTH', 'reason' => 'relayingdenied' },
70
+
71
+ # Technical details of permanent failure:
72
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
73
+ # We recommend contacting the other email provider for further information about the
74
+ # cause of this error. The error that the other server returned was:
75
+ # 550 550 5.7.1 <****@gmail.com>... Access denied (state 13).
76
+ '13' => { 'command' => 'EHLO', 'reason' => 'blocked' },
77
+
78
+ # Technical details of permanent failure:
79
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
80
+ # We recommend contacting the other email provider for further information about the
81
+ # cause of this error. The error that the other server returned was:
82
+ # 550 550 5.1.1 <******@*********.**>... User Unknown (state 14).
83
+ # 550 550 5.2.2 <*****@****.**>... Mailbox Full (state 14).
84
+ #
85
+ '14' => { 'command' => 'RCPT', 'reason' => 'userunknown' },
86
+
87
+ # http://www.google.cz/support/forum/p/gmail/thread?tid=7090cbfd111a24f9&hl=en
88
+ # Technical details of permanent failure:
89
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
90
+ # We recommend contacting the other email provider for further information about the
91
+ # cause of this error. The error that the other server returned was:
92
+ # 550 550 5.7.1 SPF unauthorized mail is prohibited. (state 15).
93
+ # 554 554 Error: no valid recipients (state 15).
94
+ '15' => { 'command' => 'DATA', 'reason' => 'filtered' },
95
+
96
+ # http://www.google.com/support/forum/p/Google%20Apps/thread?tid=0aac163bc9c65d8e&hl=en
97
+ # Technical details of permanent failure:
98
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
99
+ # We recommend contacting the other email provider for further information about the
100
+ # cause of this error. The error that the other server returned was:
101
+ # 550 550 <****@***.**> No such user here (state 17).
102
+ # 550 550 #5.1.0 Address rejected ***@***.*** (state 17).
103
+ '17' => { 'command' => 'DATA', 'reason' => 'filtered' },
104
+
105
+ # Technical details of permanent failure:
106
+ # Google tried to deliver your message, but it was rejected by the recipient domain.
107
+ # We recommend contacting the other email provider for further information about the
108
+ # cause of this error. The error that the other server returned was:
109
+ # 550 550 Unknown user *****@***.**.*** (state 18).
110
+ '18' => { 'command' => 'DATA', 'reason' => 'filtered' },
111
+ }
112
+ Indicators = Sisimai::MSP.INDICATORS
113
+ LongFields = Sisimai::RFC5322.LONGFIELDS
114
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
115
+
116
+ def description; return 'Google Gmail: https://mail.google.com'; end
117
+ def smtpagent; return 'US::Google'; end
118
+ def headerlist; return ['X-Failed-Recipients']; end
119
+ def pattern; return Re0; end
120
+
121
+ # Parse bounce messages from Google Gmail
122
+ # @param [Hash] mhead Message header of a bounce email
123
+ # @options mhead [String] from From header
124
+ # @options mhead [String] date Date header
125
+ # @options mhead [String] subject Subject header
126
+ # @options mhead [Array] received Received headers
127
+ # @options mhead [String] others Other required headers
128
+ # @param [String] mbody Message body of a bounce email
129
+ # @return [Hash, Nil] Bounce data list and message/rfc822
130
+ # part or nil if it failed to parse or
131
+ # the arguments are missing
132
+ def scan(mhead, mbody)
133
+ return nil unless mhead
134
+ return nil unless mbody
135
+
136
+ # Google Mail
137
+ # From: Mail Delivery Subsystem <mailer-daemon@googlemail.com>
138
+ # Received: from vw-in-f109.1e100.net [74.125.113.109] by ...
139
+ #
140
+ # * Check the body part
141
+ # This is an automatically generated Delivery Status Notification
142
+ # Delivery to the following recipient failed permanently:
143
+ #
144
+ # recipient-address-here@example.jp
145
+ #
146
+ # Technical details of permanent failure:
147
+ # Google tried to deliver your message, but it was rejected by the
148
+ # recipient domain. We recommend contacting the other email provider
149
+ # for further information about the cause of this error. The error
150
+ # that the other server returned was:
151
+ # 550 550 <recipient-address-heare@example.jp>: User unknown (state 14).
152
+ #
153
+ # -- OR --
154
+ # THIS IS A WARNING MESSAGE ONLY.
155
+ #
156
+ # YOU DO NOT NEED TO RESEND YOUR MESSAGE.
157
+ #
158
+ # Delivery to the following recipient has been delayed:
159
+ #
160
+ # mailboxfull@example.jp
161
+ #
162
+ # Message will be retried for 2 more day(s)
163
+ #
164
+ # Technical details of temporary failure:
165
+ # Google tried to deliver your message, but it was rejected by the recipient
166
+ # domain. We recommend contacting the other email provider for further infor-
167
+ # mation about the cause of this error. The error that the other server re-
168
+ # turned was: 450 450 4.2.2 <mailboxfull@example.jp>... Mailbox Full (state 14).
169
+ #
170
+ # -- OR --
171
+ #
172
+ # Delivery to the following recipient failed permanently:
173
+ #
174
+ # userunknown@example.jp
175
+ #
176
+ # Technical details of permanent failure:=20
177
+ # Google tried to deliver your message, but it was rejected by the server for=
178
+ # the recipient domain example.jp by mx.example.jp. [192.0.2.59].
179
+ #
180
+ # The error that the other server returned was:
181
+ # 550 5.1.1 <userunknown@example.jp>... User Unknown
182
+ #
183
+ return nil unless mhead['from'] =~ Re0[:from]
184
+ return nil unless mhead['subject'] =~ Re0[:subject]
185
+
186
+ require 'sisimai/address'
187
+ dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
188
+ hasdivided = mbody.split("\n")
189
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
190
+ rfc822part = '' # (String) message/rfc822-headers part
191
+ previousfn = '' # (String) Previous field name
192
+ readcursor = 0 # (Integer) Points the current cursor position
193
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
194
+ statecode0 = 0 # (Integer) The value of (state *) in the error message
195
+ v = nil
196
+
197
+ hasdivided.each do |e|
198
+ if readcursor == 0
199
+ # Beginning of the bounce message or delivery status part
200
+ if e =~ Re1[:begin]
201
+ readcursor |= Indicators[:'deliverystatus']
202
+ end
203
+ end
204
+
205
+ if readcursor & Indicators[:'message-rfc822'] == 0
206
+ # Beginning of the original message part
207
+ if e =~ Re1[:rfc822]
208
+ readcursor |= Indicators[:'message-rfc822']
209
+ next
210
+ end
211
+ end
212
+
213
+ if readcursor & Indicators[:'message-rfc822'] > 0
214
+ # After "message/rfc822"
215
+ if cv = e.match(/\A([-0-9A-Za-z]+?)[:][ ]*.+\z/)
216
+ # Skip if DKIM-Signature header
217
+ next if e =~ /\ADKIM-Signature[:]/
218
+
219
+ # Get required headers only
220
+ lhs = cv[1].downcase
221
+ previousfn = ''
222
+ next unless RFC822Head.key?(lhs)
223
+
224
+ previousfn = lhs
225
+ rfc822part += e + "\n"
226
+
227
+ elsif e =~ /\A[ \t]+/
228
+ # Continued line from the previous line
229
+ next if rfc822next[previousfn]
230
+ rfc822part += e + "\n" if LongFields.key?(previousfn)
231
+
232
+ else
233
+ # Check the end of headers in rfc822 part
234
+ next unless LongFields.key?(previousfn)
235
+ next unless e.empty?
236
+ rfc822next[previousfn] = true
237
+ end
238
+
239
+ else
240
+ # Before "message/rfc822"
241
+ next if readcursor & Indicators[:'deliverystatus'] == 0
242
+ next if e.empty?
243
+
244
+ # Technical details of permanent failure:=20
245
+ # Google tried to deliver your message, but it was rejected by the recipient =
246
+ # domain. We recommend contacting the other email provider for further inform=
247
+ # ation about the cause of this error. The error that the other server return=
248
+ # ed was: 554 554 5.7.0 Header error (state 18).
249
+ #
250
+ # -- OR --
251
+ #
252
+ # Technical details of permanent failure:=20
253
+ # Google tried to deliver your message, but it was rejected by the server for=
254
+ # the recipient domain example.jp by mx.example.jp. [192.0.2.49].
255
+ #
256
+ # The error that the other server returned was:
257
+ # 550 5.1.1 <userunknown@example.jp>... User Unknown
258
+ #
259
+ v = dscontents[-1]
260
+
261
+ if cv = e.match(/\A[ \t]+([^ ]+[@][^ ]+)\z/)
262
+ # kijitora@example.jp: 550 5.2.2 <kijitora@example>... Mailbox Full
263
+ if v['recipient']
264
+ # There are multiple recipient addresses in the message body.
265
+ dscontents << Sisimai::MSP.DELIVERYSTATUS
266
+ v = dscontents[-1]
267
+ end
268
+
269
+ addr0 = Sisimai::Address.s3s4(cv[1])
270
+ if Sisimai::RFC5322.is_emailaddress(addr0)
271
+ v['recipient'] = addr0
272
+ recipients += 1
273
+ end
274
+
275
+ else
276
+ if cv = e.match(/Technical details of (.+) failure:/)
277
+ # Technical details of permanent failure:
278
+ # Technical details of temporary failure:
279
+ v['softbounce'] = cv[1] == 'permanent' ? 0 : 1
280
+ end
281
+ v['diagnosis'] ||= ''
282
+ v['diagnosis'] += e + ' '
283
+ end
284
+ end
285
+ end
286
+
287
+ return nil if recipients == 0
288
+ require 'sisimai/string'
289
+ require 'sisimai/smtp/status'
290
+
291
+ dscontents.map do |e|
292
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis'])
293
+
294
+ unless e['rhost']
295
+ # Get the value of remote host
296
+ if cv = e['diagnosis'].match(/[ \t]+by[ \t]+([^ ]+)[.][ \t]+\[(\d+[.]\d+[.]\d+[.]\d+)\][.]/)
297
+ # Google tried to deliver your message, but it was rejected by
298
+ # the server for the recipient domain example.jp by mx.example.jp. [192.0.2.153].
299
+ hostname = cv[1]
300
+ ipv4addr = cv[2]
301
+ if hostname =~ /[-0-9a-zA-Z]+[.][a-zA-Z]+\z/
302
+ # Maybe valid hostname
303
+ e['rhost'] = hostname.downcase
304
+ else
305
+ # Use IP address instead
306
+ e['rhost'] = ipv4addr
307
+ end
308
+ end
309
+ end
310
+
311
+ if mhead['received'].size > 0
312
+ # Get localhost and remote host name from Received header.
313
+ r0 = mhead['received']
314
+ ['lhost', 'rhost'].each { |a| e[a] ||= '' }
315
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
316
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
317
+ end
318
+
319
+ if cv = e['diagnosis'].match(/[(]state[ ](\d+)[)][.]/)
320
+ statecode0 = cv[1]
321
+ end
322
+ if StateTable[statecode0]
323
+ # (state *)
324
+ e['reason'] = StateTable[statecode0]['reason']
325
+ e['command'] = StateTable[statecode0]['command']
326
+
327
+ else
328
+ # No state code
329
+ ReFailure.each_key do |r|
330
+ # Verify each regular expression of session errors
331
+ next unless e['diagnosis'] =~ ReFailure[r]
332
+ e['reason'] = r
333
+ break
334
+ end
335
+ end
336
+ e['status'] = Sisimai::SMTP::Status.find(e['diagnosis'])
337
+
338
+ if e['reason']
339
+ # Set pseudo status code
340
+ if e['status'] =~ /\A[45][.][1-7][.][1-9]\z/
341
+ # Override bounce reason
342
+ e['reason'] = Sisimai::SMTP::Status.name(e['status'])
343
+ end
344
+ end
345
+ e['spec'] = e['reason'] == 'mailererror' ? 'X-UNIX' : 'SMTP'
346
+ e['action'] = 'failed' if e['status'] =~ /\A[45]/
347
+ e['agent'] = Sisimai::MSP::US::Google.smtpagent
348
+ end
349
+
350
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
351
+ end
352
+
353
+ end
354
+ end
355
+ end
356
+ end
357
+
@@ -0,0 +1,243 @@
1
+ module Sisimai
2
+ module MSP::US
3
+ # Sisimai::MSP::US::Outlook parses a bounce email which created by Microsoft
4
+ # Outlook.com. Methods in the module are called from only Sisimai::Message.
5
+ module Outlook
6
+ # Imported from p5-Sisimail/lib/Sisimai/MSP/US/Outlook.pm
7
+ class << self
8
+ require 'sisimai/msp'
9
+ require 'sisimai/rfc5322'
10
+
11
+ Re0 = {
12
+ :from => %r/postmaster[@]/,
13
+ :subject => %r/Delivery Status Notification/,
14
+ :received => %r/.+[.]hotmail[.]com\b/,
15
+ }
16
+ Re1 = {
17
+ :begin => %r/\AThis is an automatically generated Delivery Status Notification/,
18
+ :error => %r/\A[.]+ while talking to .+[:]\z/,
19
+ :rfc822 => %r|\AContent-Type: message/rfc822\z|,
20
+ :endof => %r/\A__END_OF_EMAIL_MESSAGE__\z/,
21
+ }
22
+ ReFailure = {
23
+ 'hostunknown' => %r/The mail could not be delivered to the recipient because the domain is not reachable/,
24
+ 'userunknown' => %r/Requested action not taken: mailbox unavailable/,
25
+ }
26
+ Indicators = Sisimai::MSP.INDICATORS
27
+ LongFields = Sisimai::RFC5322.LONGFIELDS
28
+ RFC822Head = Sisimai::RFC5322.HEADERFIELDS
29
+
30
+ def description; return 'Microsoft Outlook.com: https://www.outlook.com/'; end
31
+ def smtpagent; return 'US::Outlook'; end
32
+
33
+ # X-Message-Delivery: Vj0xLjE7RD0wO0dEPTA7U0NMPTk7bD0xO3VzPTE=
34
+ # X-Message-Info: AuEzbeVr9u5fkDpn2vR5iCu5wb6HBeY4iruBjnutBzpStnUabbM...
35
+ def headerlist; return ['X-Message-Delivery', 'X-Message-Info']; end
36
+ def pattern; return Re0; end
37
+
38
+ # Parse bounce messages from Microsoft Outlook.com
39
+ # @param [Hash] mhead Message header of a bounce email
40
+ # @options mhead [String] from From header
41
+ # @options mhead [String] date Date header
42
+ # @options mhead [String] subject Subject header
43
+ # @options mhead [Array] received Received headers
44
+ # @options mhead [String] others Other required headers
45
+ # @param [String] mbody Message body of a bounce email
46
+ # @return [Hash, Nil] Bounce data list and message/rfc822
47
+ # part or nil if it failed to parse or
48
+ # the arguments are missing
49
+ def scan(mhead, mbody)
50
+ return nil unless mhead
51
+ return nil unless mbody
52
+
53
+ match = 0
54
+ match += 1 if mhead['subject'] =~ Re0[:subject]
55
+ match += 1 if mhead['x-message-delivery']
56
+ match += 1 if mhead['x-message-info']
57
+ match += 1 if mhead['received'].find { |a| a =~ Re0[:received] }
58
+ return nil if match < 2
59
+
60
+ require 'sisimai/rfc5322'
61
+ dscontents = []; dscontents << Sisimai::MSP.DELIVERYSTATUS
62
+ hasdivided = mbody.split("\n")
63
+ havepassed = [''];
64
+ rfc822next = { 'from' => false, 'to' => false, 'subject' => false }
65
+ rfc822part = '' # (String) message/rfc822-headers part
66
+ previousfn = '' # (String) Previous field name
67
+ readcursor = 0 # (Integer) Points the current cursor position
68
+ recipients = 0 # (Integer) The number of 'Final-Recipient' header
69
+ connvalues = 0 # (Integer) Flag, 1 if all the value of $connheader have been set
70
+ connheader = {
71
+ 'date' => '', # The value of Arrival-Date header
72
+ 'lhost' => '', # The value of Reporting-MTA header
73
+ }
74
+ v = nil
75
+
76
+ hasdivided.each do |e|
77
+ # Save the current line for the next loop
78
+ havepassed << e; p = havepassed[-2]
79
+
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
+ if connvalues == connheader.keys.size
125
+ # This is an automatically generated Delivery Status Notification.
126
+ #
127
+ # Delivery to the following recipients failed.
128
+ #
129
+ # kijitora@example.jp
130
+ #
131
+ # Final-Recipient: rfc822;kijitora@example.jp
132
+ # Action: failed
133
+ # Status: 5.2.2
134
+ # Diagnostic-Code: smtp;550 5.2.2 <kijitora@example.jp>... Mailbox Full
135
+ v = dscontents[-1]
136
+
137
+ if cv = e.match(/\A[Ff]inal-[Rr]ecipient:[ ]*(?:RFC|rfc)822;[ ]*([^ ]+)\z/)
138
+ # Final-Recipient: rfc822;kijitora@example.jp
139
+ if v['recipient']
140
+ # There are multiple recipient addresses in the message body.
141
+ dscontents << Sisimai::MSP.DELIVERYSTATUS
142
+ v = dscontents[-1]
143
+ end
144
+ v['recipient'] = cv[1]
145
+ recipients += 1
146
+
147
+ elsif cv = e.match(/\A[Aa]ction:[ ]*(.+)\z/)
148
+ # Action: failed
149
+ v['action'] = cv[1].downcase
150
+
151
+ elsif cv = e.match(/\A[Ss]tatus:[ ]*(\d[.]\d+[.]\d+)/)
152
+ # Status:5.2.0
153
+ v['status'] = cv[1]
154
+
155
+ else
156
+ if cv = e.match(/\A[Dd]iagnostic-[Cc]ode:[ ]*(.+?);[ ]*(.+)\z/)
157
+ # Diagnostic-Code: SMTP; 550 5.1.1 <userunknown@example.jp>... User Unknown
158
+ v['spec'] = cv[1].upcase
159
+ v['diagnosis'] = cv[2]
160
+
161
+ elsif p =~ /\A[Dd]iagnostic-[Cc]ode:[ ]*/ && cv = e.match(/\A[ \t]+(.+)\z/)
162
+ # Continued line of the value of Diagnostic-Code header
163
+ v['diagnosis'] ||= ''
164
+ v['diagnosis'] += ' ' + cv[1]
165
+ havepassed[-1] = 'Diagnostic-Code: ' + e
166
+ end
167
+
168
+ end
169
+ else
170
+ # Reporting-MTA: dns;BLU004-OMC3S13.hotmail.example.com
171
+ # Received-From-MTA: dns;BLU436-SMTP66
172
+ # Arrival-Date: Fri, 21 Nov 2014 14:17:34 -0800
173
+ if cv = e.match(/\A[Rr]eporting-MTA:[ ]*(?:DNS|dns);[ ]*(.+)\z/)
174
+ # Reporting-MTA: dns;BLU004-OMC3S13.hotmail.example.com
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
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ return nil if recipients == 0
190
+ require 'sisimai/string'
191
+ require 'sisimai/smtp/status'
192
+
193
+ dscontents.map do |e|
194
+ # Set default values if each value is empty.
195
+ connheader.each_key { |a| e[a] ||= connheader[a] || '' }
196
+
197
+ if mhead['received'].size > 0
198
+ # Get localhost and remote host name from Received header.
199
+ r0 = mhead['received']
200
+ ['lhost', 'rhost'].each { |a| e[a] ||= '' }
201
+ e['lhost'] = Sisimai::RFC5322.received(r0[0]).shift if e['lhost'].empty?
202
+ e['rhost'] = Sisimai::RFC5322.received(r0[-1]).pop if e['rhost'].empty?
203
+ end
204
+
205
+ e['spec'] ||= 'SMTP'
206
+ e['agent'] = Sisimai::MSP::US::Outlook.smtpagent
207
+ e['diagnosis'] = Sisimai::String.sweep(e['diagnosis']) || ''
208
+
209
+ if e['diagnosis'].empty?
210
+ # No message in 'diagnosis'
211
+ if e['action'] == 'delayed'
212
+ # Set pseudo diagnostic code message for delaying
213
+ e['diagnosis'] = 'Delivery to the following recipients has been delayed.'
214
+
215
+ else
216
+ # Set pseudo diagnostic code message
217
+ e['diagnosis'] = 'Unable to deliver message to the following recipients, '
218
+ e['diagnosis'] += 'due to being unable to connect successfully to the destination mail server.'
219
+ end
220
+ end
221
+
222
+ ReFailure.each_key do |r|
223
+ # Verify each regular expression of session errors
224
+ next unless e['diagnosis'] =~ ReFailure[r]
225
+ e['reason'] = r
226
+ break
227
+ end
228
+
229
+ if e['status'].empty? || e['status'] =~ /\A\d[.]0[.]0\z/
230
+ # There is no value of Status header or the value is 5.0.0, 4.0.0
231
+ pseudostatus = Sisimai::SMTP::Status.find(e['diagnosis'])
232
+ e['status'] = pseudostatus if pseudostatus.size > 0
233
+ end
234
+ end
235
+
236
+ return { 'ds' => dscontents, 'rfc822' => rfc822part }
237
+ end
238
+
239
+ end
240
+ end
241
+ end
242
+ end
243
+