sisimai 4.16.0-java

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sisimai might be problematic. Click here for more details.

Files changed (574) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +182 -0
  5. data/.travis.yml +18 -0
  6. data/ANALYTICAL-PRECISION +56 -0
  7. data/Changes +36 -0
  8. data/Developers.mk +129 -0
  9. data/Gemfile +15 -0
  10. data/LICENSE +25 -0
  11. data/Makefile +70 -0
  12. data/README.md +361 -0
  13. data/Rakefile +12 -0
  14. data/Repository.mk +69 -0
  15. data/appveyor.yml +23 -0
  16. data/bin/console +14 -0
  17. data/bin/setup +7 -0
  18. data/lib/sisimai.rb +95 -0
  19. data/lib/sisimai/address.rb +224 -0
  20. data/lib/sisimai/arf.rb +338 -0
  21. data/lib/sisimai/data.rb +409 -0
  22. data/lib/sisimai/data/json.rb +40 -0
  23. data/lib/sisimai/data/yaml.rb +32 -0
  24. data/lib/sisimai/datetime.rb +511 -0
  25. data/lib/sisimai/mail.rb +82 -0
  26. data/lib/sisimai/mail/maildir.rb +82 -0
  27. data/lib/sisimai/mail/mbox.rb +69 -0
  28. data/lib/sisimai/mail/stdin.rb +53 -0
  29. data/lib/sisimai/mda.rb +152 -0
  30. data/lib/sisimai/message.rb +525 -0
  31. data/lib/sisimai/mime.rb +127 -0
  32. data/lib/sisimai/msp.rb +54 -0
  33. data/lib/sisimai/msp/de/einsundeins.rb +174 -0
  34. data/lib/sisimai/msp/de/gmx.rb +197 -0
  35. data/lib/sisimai/msp/jp/biglobe.rb +179 -0
  36. data/lib/sisimai/msp/jp/ezweb.rb +292 -0
  37. data/lib/sisimai/msp/jp/kddi.rb +195 -0
  38. data/lib/sisimai/msp/ru/mailru.rb +306 -0
  39. data/lib/sisimai/msp/ru/yandex.rb +241 -0
  40. data/lib/sisimai/msp/uk/messagelabs.rb +250 -0
  41. data/lib/sisimai/msp/us/amazonses.rb +248 -0
  42. data/lib/sisimai/msp/us/amazonworkmail.rb +224 -0
  43. data/lib/sisimai/msp/us/aol.rb +234 -0
  44. data/lib/sisimai/msp/us/bigfoot.rb +243 -0
  45. data/lib/sisimai/msp/us/facebook.rb +306 -0
  46. data/lib/sisimai/msp/us/google.rb +357 -0
  47. data/lib/sisimai/msp/us/office365.rb +273 -0
  48. data/lib/sisimai/msp/us/outlook.rb +242 -0
  49. data/lib/sisimai/msp/us/receivingses.rb +247 -0
  50. data/lib/sisimai/msp/us/sendgrid.rb +257 -0
  51. data/lib/sisimai/msp/us/verizon.rb +311 -0
  52. data/lib/sisimai/msp/us/yahoo.rb +178 -0
  53. data/lib/sisimai/msp/us/zoho.rb +198 -0
  54. data/lib/sisimai/mta.rb +54 -0
  55. data/lib/sisimai/mta/activehunter.rb +155 -0
  56. data/lib/sisimai/mta/apachejames.rb +194 -0
  57. data/lib/sisimai/mta/courier.rb +307 -0
  58. data/lib/sisimai/mta/domino.rb +209 -0
  59. data/lib/sisimai/mta/exchange.rb +314 -0
  60. data/lib/sisimai/mta/exim.rb +549 -0
  61. data/lib/sisimai/mta/imailserver.rb +227 -0
  62. data/lib/sisimai/mta/interscanmss.rb +167 -0
  63. data/lib/sisimai/mta/mailfoundry.rb +173 -0
  64. data/lib/sisimai/mta/mailmarshalsmtp.rb +206 -0
  65. data/lib/sisimai/mta/mcafee.rb +201 -0
  66. data/lib/sisimai/mta/messagingserver.rb +241 -0
  67. data/lib/sisimai/mta/mfilter.rb +190 -0
  68. data/lib/sisimai/mta/mxlogic.rb +283 -0
  69. data/lib/sisimai/mta/notes.rb +206 -0
  70. data/lib/sisimai/mta/opensmtpd.rb +225 -0
  71. data/lib/sisimai/mta/postfix.rb +306 -0
  72. data/lib/sisimai/mta/qmail.rb +335 -0
  73. data/lib/sisimai/mta/sendmail.rb +317 -0
  74. data/lib/sisimai/mta/surfcontrol.rb +193 -0
  75. data/lib/sisimai/mta/userdefined.rb +148 -0
  76. data/lib/sisimai/mta/v5sendmail.rb +232 -0
  77. data/lib/sisimai/mta/x1.rb +156 -0
  78. data/lib/sisimai/mta/x2.rb +157 -0
  79. data/lib/sisimai/mta/x3.rb +171 -0
  80. data/lib/sisimai/mta/x4.rb +365 -0
  81. data/lib/sisimai/mta/x5.rb +208 -0
  82. data/lib/sisimai/order.rb +220 -0
  83. data/lib/sisimai/reason.rb +234 -0
  84. data/lib/sisimai/reason/blocked.rb +105 -0
  85. data/lib/sisimai/reason/contenterror.rb +53 -0
  86. data/lib/sisimai/reason/exceedlimit.rb +60 -0
  87. data/lib/sisimai/reason/expired.rb +53 -0
  88. data/lib/sisimai/reason/filtered.rb +98 -0
  89. data/lib/sisimai/reason/hasmoved.rb +45 -0
  90. data/lib/sisimai/reason/hostunknown.rb +79 -0
  91. data/lib/sisimai/reason/mailboxfull.rb +118 -0
  92. data/lib/sisimai/reason/mailererror.rb +55 -0
  93. data/lib/sisimai/reason/mesgtoobig.rb +82 -0
  94. data/lib/sisimai/reason/networkerror.rb +58 -0
  95. data/lib/sisimai/reason/norelaying.rb +71 -0
  96. data/lib/sisimai/reason/notaccept.rb +63 -0
  97. data/lib/sisimai/reason/onhold.rb +45 -0
  98. data/lib/sisimai/reason/rejected.rb +101 -0
  99. data/lib/sisimai/reason/securityerror.rb +72 -0
  100. data/lib/sisimai/reason/spamdetected.rb +172 -0
  101. data/lib/sisimai/reason/suspend.rb +58 -0
  102. data/lib/sisimai/reason/systemerror.rb +69 -0
  103. data/lib/sisimai/reason/systemfull.rb +45 -0
  104. data/lib/sisimai/reason/toomanyconn.rb +73 -0
  105. data/lib/sisimai/reason/userunknown.rb +194 -0
  106. data/lib/sisimai/rfc2606.rb +24 -0
  107. data/lib/sisimai/rfc3464.rb +497 -0
  108. data/lib/sisimai/rfc3834.rb +150 -0
  109. data/lib/sisimai/rfc5322.rb +204 -0
  110. data/lib/sisimai/rhost.rb +47 -0
  111. data/lib/sisimai/rhost/googleapps.rb +237 -0
  112. data/lib/sisimai/smtp.rb +58 -0
  113. data/lib/sisimai/smtp/reply.rb +84 -0
  114. data/lib/sisimai/smtp/status.rb +758 -0
  115. data/lib/sisimai/string.rb +65 -0
  116. data/lib/sisimai/time.rb +11 -0
  117. data/lib/sisimai/version.rb +4 -0
  118. data/set-of-emails/README.md +35 -0
  119. data/set-of-emails/mailbox/mbox-0 +2467 -0
  120. data/set-of-emails/mailbox/mbox-1 +71 -0
  121. data/set-of-emails/maildir/bsd/README.md +261 -0
  122. data/set-of-emails/maildir/bsd/activehunter-01.eml +54 -0
  123. data/set-of-emails/maildir/bsd/activehunter-02.eml +53 -0
  124. data/set-of-emails/maildir/bsd/apachejames-01.eml +46 -0
  125. data/set-of-emails/maildir/bsd/arf-01.eml +66 -0
  126. data/set-of-emails/maildir/bsd/arf-02.eml +68 -0
  127. data/set-of-emails/maildir/bsd/arf-03.eml +56 -0
  128. data/set-of-emails/maildir/bsd/arf-04.eml +89 -0
  129. data/set-of-emails/maildir/bsd/arf-05.eml +82 -0
  130. data/set-of-emails/maildir/bsd/arf-06.eml +166 -0
  131. data/set-of-emails/maildir/bsd/arf-07.eml +59 -0
  132. data/set-of-emails/maildir/bsd/arf-08.eml +103 -0
  133. data/set-of-emails/maildir/bsd/arf-09.eml +104 -0
  134. data/set-of-emails/maildir/bsd/arf-10.eml +56 -0
  135. data/set-of-emails/maildir/bsd/arf-11.eml +37 -0
  136. data/set-of-emails/maildir/bsd/arf-12.eml +40 -0
  137. data/set-of-emails/maildir/bsd/arf-13.eml +76 -0
  138. data/set-of-emails/maildir/bsd/arf-14.eml +333 -0
  139. data/set-of-emails/maildir/bsd/arf-15.eml +66 -0
  140. data/set-of-emails/maildir/bsd/courier-01.eml +79 -0
  141. data/set-of-emails/maildir/bsd/courier-02.eml +83 -0
  142. data/set-of-emails/maildir/bsd/courier-03.eml +85 -0
  143. data/set-of-emails/maildir/bsd/courier-04.eml +87 -0
  144. data/set-of-emails/maildir/bsd/de-einsundeins-01.eml +38 -0
  145. data/set-of-emails/maildir/bsd/de-gmx-01.eml +52 -0
  146. data/set-of-emails/maildir/bsd/de-gmx-02.eml +51 -0
  147. data/set-of-emails/maildir/bsd/de-gmx-03.eml +56 -0
  148. data/set-of-emails/maildir/bsd/de-gmx-04.eml +51 -0
  149. data/set-of-emails/maildir/bsd/domino-01.eml +33 -0
  150. data/set-of-emails/maildir/bsd/domino-02.eml +83 -0
  151. data/set-of-emails/maildir/bsd/exchange-01.eml +31 -0
  152. data/set-of-emails/maildir/bsd/exchange-02.eml +67 -0
  153. data/set-of-emails/maildir/bsd/exchange-03.eml +52 -0
  154. data/set-of-emails/maildir/bsd/exchange-04.eml +28 -0
  155. data/set-of-emails/maildir/bsd/exchange-05.eml +56 -0
  156. data/set-of-emails/maildir/bsd/exchange-06.eml +151 -0
  157. data/set-of-emails/maildir/bsd/exim-01.eml +46 -0
  158. data/set-of-emails/maildir/bsd/exim-02.eml +41 -0
  159. data/set-of-emails/maildir/bsd/exim-03.eml +42 -0
  160. data/set-of-emails/maildir/bsd/exim-04.eml +46 -0
  161. data/set-of-emails/maildir/bsd/exim-05.eml +49 -0
  162. data/set-of-emails/maildir/bsd/exim-06.eml +44 -0
  163. data/set-of-emails/maildir/bsd/exim-07.eml +28 -0
  164. data/set-of-emails/maildir/bsd/exim-08.eml +42 -0
  165. data/set-of-emails/maildir/bsd/exim-09.eml +169 -0
  166. data/set-of-emails/maildir/bsd/exim-10.eml +718 -0
  167. data/set-of-emails/maildir/bsd/exim-11.eml +718 -0
  168. data/set-of-emails/maildir/bsd/exim-12.eml +75 -0
  169. data/set-of-emails/maildir/bsd/exim-13.eml +145 -0
  170. data/set-of-emails/maildir/bsd/exim-14.eml +32 -0
  171. data/set-of-emails/maildir/bsd/exim-15.eml +49 -0
  172. data/set-of-emails/maildir/bsd/exim-16.eml +98 -0
  173. data/set-of-emails/maildir/bsd/exim-17.eml +50 -0
  174. data/set-of-emails/maildir/bsd/exim-18.eml +96 -0
  175. data/set-of-emails/maildir/bsd/exim-19.eml +52 -0
  176. data/set-of-emails/maildir/bsd/exim-20.eml +159 -0
  177. data/set-of-emails/maildir/bsd/exim-21.eml +150 -0
  178. data/set-of-emails/maildir/bsd/exim-22.eml +50 -0
  179. data/set-of-emails/maildir/bsd/exim-23.eml +57 -0
  180. data/set-of-emails/maildir/bsd/exim-24.eml +107 -0
  181. data/set-of-emails/maildir/bsd/exim-25.eml +18 -0
  182. data/set-of-emails/maildir/bsd/exim-26.eml +111 -0
  183. data/set-of-emails/maildir/bsd/exim-27.eml +120 -0
  184. data/set-of-emails/maildir/bsd/exim-28.eml +148 -0
  185. data/set-of-emails/maildir/bsd/google-apps-01.eml +66 -0
  186. data/set-of-emails/maildir/bsd/imailserver-01.eml +27 -0
  187. data/set-of-emails/maildir/bsd/imailserver-02.eml +36 -0
  188. data/set-of-emails/maildir/bsd/imailserver-03.eml +28 -0
  189. data/set-of-emails/maildir/bsd/imailserver-04.eml +15 -0
  190. data/set-of-emails/maildir/bsd/imailserver-05.eml +92 -0
  191. data/set-of-emails/maildir/bsd/imailserver-06.eml +29 -0
  192. data/set-of-emails/maildir/bsd/interscanmss-01.eml +49 -0
  193. data/set-of-emails/maildir/bsd/interscanmss-02.eml +259 -0
  194. data/set-of-emails/maildir/bsd/jp-biglobe-01.eml +43 -0
  195. data/set-of-emails/maildir/bsd/jp-ezweb-01.eml +36 -0
  196. data/set-of-emails/maildir/bsd/jp-ezweb-02.eml +65 -0
  197. data/set-of-emails/maildir/bsd/jp-ezweb-03.eml +35 -0
  198. data/set-of-emails/maildir/bsd/jp-ezweb-04.eml +38 -0
  199. data/set-of-emails/maildir/bsd/jp-ezweb-05.eml +38 -0
  200. data/set-of-emails/maildir/bsd/jp-ezweb-06.eml +33 -0
  201. data/set-of-emails/maildir/bsd/jp-kddi-01.eml +49 -0
  202. data/set-of-emails/maildir/bsd/jp-kddi-02.eml +54 -0
  203. data/set-of-emails/maildir/bsd/jp-kddi-03.eml +54 -0
  204. data/set-of-emails/maildir/bsd/mailfoundry-01.eml +50 -0
  205. data/set-of-emails/maildir/bsd/mailfoundry-02.eml +49 -0
  206. data/set-of-emails/maildir/bsd/mailmarshalsmtp-01.eml +43 -0
  207. data/set-of-emails/maildir/bsd/mcafee-01.eml +63 -0
  208. data/set-of-emails/maildir/bsd/mcafee-02.eml +65 -0
  209. data/set-of-emails/maildir/bsd/mcafee-03.eml +59 -0
  210. data/set-of-emails/maildir/bsd/messagingserver-01.eml +102 -0
  211. data/set-of-emails/maildir/bsd/messagingserver-02.eml +72 -0
  212. data/set-of-emails/maildir/bsd/messagingserver-03.eml +70 -0
  213. data/set-of-emails/maildir/bsd/messagingserver-04.eml +102 -0
  214. data/set-of-emails/maildir/bsd/messagingserver-05.eml +98 -0
  215. data/set-of-emails/maildir/bsd/messagingserver-06.eml +101 -0
  216. data/set-of-emails/maildir/bsd/messagingserver-07.eml +129 -0
  217. data/set-of-emails/maildir/bsd/mfilter-01.eml +49 -0
  218. data/set-of-emails/maildir/bsd/mfilter-02.eml +48 -0
  219. data/set-of-emails/maildir/bsd/mfilter-03.eml +43 -0
  220. data/set-of-emails/maildir/bsd/mxlogic-01.eml +47 -0
  221. data/set-of-emails/maildir/bsd/mxlogic-02.eml +44 -0
  222. data/set-of-emails/maildir/bsd/mxlogic-03.eml +46 -0
  223. data/set-of-emails/maildir/bsd/notes-01.eml +42 -0
  224. data/set-of-emails/maildir/bsd/notes-02.eml +42 -0
  225. data/set-of-emails/maildir/bsd/notes-03.eml +38 -0
  226. data/set-of-emails/maildir/bsd/notes-04.eml +181 -0
  227. data/set-of-emails/maildir/bsd/opensmtpd-01.eml +33 -0
  228. data/set-of-emails/maildir/bsd/opensmtpd-02.eml +33 -0
  229. data/set-of-emails/maildir/bsd/opensmtpd-03.eml +36 -0
  230. data/set-of-emails/maildir/bsd/opensmtpd-04.eml +40 -0
  231. data/set-of-emails/maildir/bsd/opensmtpd-05.eml +36 -0
  232. data/set-of-emails/maildir/bsd/postfix-01.eml +60 -0
  233. data/set-of-emails/maildir/bsd/postfix-02.eml +78 -0
  234. data/set-of-emails/maildir/bsd/postfix-03.eml +71 -0
  235. data/set-of-emails/maildir/bsd/postfix-04.eml +89 -0
  236. data/set-of-emails/maildir/bsd/postfix-05.eml +78 -0
  237. data/set-of-emails/maildir/bsd/postfix-06.eml +72 -0
  238. data/set-of-emails/maildir/bsd/postfix-07.eml +74 -0
  239. data/set-of-emails/maildir/bsd/postfix-08.eml +78 -0
  240. data/set-of-emails/maildir/bsd/postfix-09.eml +76 -0
  241. data/set-of-emails/maildir/bsd/postfix-10.eml +73 -0
  242. data/set-of-emails/maildir/bsd/postfix-11.eml +86 -0
  243. data/set-of-emails/maildir/bsd/postfix-12.eml +71 -0
  244. data/set-of-emails/maildir/bsd/postfix-13.eml +81 -0
  245. data/set-of-emails/maildir/bsd/postfix-14.eml +68 -0
  246. data/set-of-emails/maildir/bsd/postfix-15.eml +69 -0
  247. data/set-of-emails/maildir/bsd/postfix-16.eml +73 -0
  248. data/set-of-emails/maildir/bsd/postfix-17.eml +68 -0
  249. data/set-of-emails/maildir/bsd/postfix-18.eml +121 -0
  250. data/set-of-emails/maildir/bsd/postfix-19.eml +105 -0
  251. data/set-of-emails/maildir/bsd/postfix-20.eml +231 -0
  252. data/set-of-emails/maildir/bsd/postfix-21.eml +60 -0
  253. data/set-of-emails/maildir/bsd/qmail-01.eml +40 -0
  254. data/set-of-emails/maildir/bsd/qmail-02.eml +35 -0
  255. data/set-of-emails/maildir/bsd/qmail-03.eml +22 -0
  256. data/set-of-emails/maildir/bsd/qmail-04.eml +31 -0
  257. data/set-of-emails/maildir/bsd/qmail-05.eml +31 -0
  258. data/set-of-emails/maildir/bsd/qmail-06.eml +39 -0
  259. data/set-of-emails/maildir/bsd/qmail-07.eml +22 -0
  260. data/set-of-emails/maildir/bsd/qmail-08.eml +23 -0
  261. data/set-of-emails/maildir/bsd/qmail-09.eml +103 -0
  262. data/set-of-emails/maildir/bsd/rfc3464-01.eml +60 -0
  263. data/set-of-emails/maildir/bsd/rfc3464-02.eml +43 -0
  264. data/set-of-emails/maildir/bsd/rfc3464-03.eml +40 -0
  265. data/set-of-emails/maildir/bsd/rfc3464-04.eml +50 -0
  266. data/set-of-emails/maildir/bsd/rfc3464-05.eml +63 -0
  267. data/set-of-emails/maildir/bsd/rfc3464-06.eml +48 -0
  268. data/set-of-emails/maildir/bsd/rfc3464-07.eml +88 -0
  269. data/set-of-emails/maildir/bsd/rfc3464-08.eml +70 -0
  270. data/set-of-emails/maildir/bsd/rfc3464-09.eml +93 -0
  271. data/set-of-emails/maildir/bsd/rfc3464-10.eml +467 -0
  272. data/set-of-emails/maildir/bsd/rfc3464-11.eml +1171 -0
  273. data/set-of-emails/maildir/bsd/rfc3464-12.eml +101 -0
  274. data/set-of-emails/maildir/bsd/rfc3464-13.eml +131 -0
  275. data/set-of-emails/maildir/bsd/rfc3464-14.eml +121 -0
  276. data/set-of-emails/maildir/bsd/rfc3464-15.eml +144 -0
  277. data/set-of-emails/maildir/bsd/rfc3464-16.eml +36 -0
  278. data/set-of-emails/maildir/bsd/rfc3464-17.eml +109 -0
  279. data/set-of-emails/maildir/bsd/rfc3464-18.eml +149 -0
  280. data/set-of-emails/maildir/bsd/rfc3464-19.eml +65 -0
  281. data/set-of-emails/maildir/bsd/rfc3464-20.eml +145 -0
  282. data/set-of-emails/maildir/bsd/rfc3464-21.eml +146 -0
  283. data/set-of-emails/maildir/bsd/rfc3464-22.eml +105 -0
  284. data/set-of-emails/maildir/bsd/rfc3464-23.eml +21 -0
  285. data/set-of-emails/maildir/bsd/rfc3464-24.eml +27 -0
  286. data/set-of-emails/maildir/bsd/rfc3464-25.eml +33 -0
  287. data/set-of-emails/maildir/bsd/rfc3464-26.eml +98 -0
  288. data/set-of-emails/maildir/bsd/rfc3464-27.eml +180 -0
  289. data/set-of-emails/maildir/bsd/rfc3464-28.eml +122 -0
  290. data/set-of-emails/maildir/bsd/rfc3834-01.eml +37 -0
  291. data/set-of-emails/maildir/bsd/rfc3834-02.eml +51 -0
  292. data/set-of-emails/maildir/bsd/rfc3834-03.eml +33 -0
  293. data/set-of-emails/maildir/bsd/ru-mailru-01.eml +54 -0
  294. data/set-of-emails/maildir/bsd/ru-mailru-02.eml +54 -0
  295. data/set-of-emails/maildir/bsd/ru-mailru-03.eml +62 -0
  296. data/set-of-emails/maildir/bsd/ru-mailru-04.eml +54 -0
  297. data/set-of-emails/maildir/bsd/ru-yandex-01.eml +102 -0
  298. data/set-of-emails/maildir/bsd/ru-yandex-02.eml +113 -0
  299. data/set-of-emails/maildir/bsd/ru-yandex-03.eml +101 -0
  300. data/set-of-emails/maildir/bsd/sendmail-01.eml +70 -0
  301. data/set-of-emails/maildir/bsd/sendmail-02.eml +82 -0
  302. data/set-of-emails/maildir/bsd/sendmail-03.eml +76 -0
  303. data/set-of-emails/maildir/bsd/sendmail-04.eml +63 -0
  304. data/set-of-emails/maildir/bsd/sendmail-05.eml +64 -0
  305. data/set-of-emails/maildir/bsd/sendmail-06.eml +67 -0
  306. data/set-of-emails/maildir/bsd/sendmail-07.eml +65 -0
  307. data/set-of-emails/maildir/bsd/sendmail-08.eml +62 -0
  308. data/set-of-emails/maildir/bsd/sendmail-09.eml +60 -0
  309. data/set-of-emails/maildir/bsd/sendmail-10.eml +82 -0
  310. data/set-of-emails/maildir/bsd/sendmail-11.eml +60 -0
  311. data/set-of-emails/maildir/bsd/sendmail-12.eml +62 -0
  312. data/set-of-emails/maildir/bsd/sendmail-13.eml +66 -0
  313. data/set-of-emails/maildir/bsd/sendmail-14.eml +64 -0
  314. data/set-of-emails/maildir/bsd/sendmail-15.eml +60 -0
  315. data/set-of-emails/maildir/bsd/sendmail-16.eml +69 -0
  316. data/set-of-emails/maildir/bsd/sendmail-17.eml +68 -0
  317. data/set-of-emails/maildir/bsd/sendmail-18.eml +64 -0
  318. data/set-of-emails/maildir/bsd/sendmail-19.eml +71 -0
  319. data/set-of-emails/maildir/bsd/sendmail-20.eml +120 -0
  320. data/set-of-emails/maildir/bsd/sendmail-21.eml +69 -0
  321. data/set-of-emails/maildir/bsd/sendmail-22.eml +73 -0
  322. data/set-of-emails/maildir/bsd/sendmail-23.eml +137 -0
  323. data/set-of-emails/maildir/bsd/sendmail-24.eml +66 -0
  324. data/set-of-emails/maildir/bsd/sendmail-25.eml +70 -0
  325. data/set-of-emails/maildir/bsd/sendmail-26.eml +71 -0
  326. data/set-of-emails/maildir/bsd/sendmail-27.eml +69 -0
  327. data/set-of-emails/maildir/bsd/sendmail-28.eml +69 -0
  328. data/set-of-emails/maildir/bsd/sendmail-29.eml +70 -0
  329. data/set-of-emails/maildir/bsd/sendmail-30.eml +68 -0
  330. data/set-of-emails/maildir/bsd/sendmail-31.eml +80 -0
  331. data/set-of-emails/maildir/bsd/sendmail-32.eml +71 -0
  332. data/set-of-emails/maildir/bsd/sendmail-33.eml +71 -0
  333. data/set-of-emails/maildir/bsd/sendmail-34.eml +75 -0
  334. data/set-of-emails/maildir/bsd/sendmail-35.eml +70 -0
  335. data/set-of-emails/maildir/bsd/sendmail-36.eml +71 -0
  336. data/set-of-emails/maildir/bsd/sendmail-37.eml +71 -0
  337. data/set-of-emails/maildir/bsd/sendmail-38.eml +167 -0
  338. data/set-of-emails/maildir/bsd/surfcontrol-01.eml +79 -0
  339. data/set-of-emails/maildir/bsd/surfcontrol-02.eml +70 -0
  340. data/set-of-emails/maildir/bsd/surfcontrol-03.eml +70 -0
  341. data/set-of-emails/maildir/bsd/uk-messagelabs-01.eml +76 -0
  342. data/set-of-emails/maildir/bsd/us-amazonses-01.eml +59 -0
  343. data/set-of-emails/maildir/bsd/us-amazonses-02.eml +177 -0
  344. data/set-of-emails/maildir/bsd/us-amazonses-03.eml +55 -0
  345. data/set-of-emails/maildir/bsd/us-amazonses-04.eml +55 -0
  346. data/set-of-emails/maildir/bsd/us-amazonworkmail-01.eml +156 -0
  347. data/set-of-emails/maildir/bsd/us-amazonworkmail-02.eml +160 -0
  348. data/set-of-emails/maildir/bsd/us-amazonworkmail-03.eml +161 -0
  349. data/set-of-emails/maildir/bsd/us-amazonworkmail-04.eml +156 -0
  350. data/set-of-emails/maildir/bsd/us-amazonworkmail-05.eml +157 -0
  351. data/set-of-emails/maildir/bsd/us-aol-01.eml +1258 -0
  352. data/set-of-emails/maildir/bsd/us-aol-02.eml +1257 -0
  353. data/set-of-emails/maildir/bsd/us-aol-03.eml +1264 -0
  354. data/set-of-emails/maildir/bsd/us-aol-04.eml +1260 -0
  355. data/set-of-emails/maildir/bsd/us-bigfoot-01.eml +64 -0
  356. data/set-of-emails/maildir/bsd/us-facebook-01.eml +40 -0
  357. data/set-of-emails/maildir/bsd/us-facebook-02.eml +42 -0
  358. data/set-of-emails/maildir/bsd/us-google-01.eml +70 -0
  359. data/set-of-emails/maildir/bsd/us-google-02.eml +50 -0
  360. data/set-of-emails/maildir/bsd/us-google-03.eml +51 -0
  361. data/set-of-emails/maildir/bsd/us-google-04.eml +82 -0
  362. data/set-of-emails/maildir/bsd/us-google-05.eml +50 -0
  363. data/set-of-emails/maildir/bsd/us-google-06.eml +56 -0
  364. data/set-of-emails/maildir/bsd/us-google-07.eml +42 -0
  365. data/set-of-emails/maildir/bsd/us-google-08.eml +59 -0
  366. data/set-of-emails/maildir/bsd/us-google-09.eml +76 -0
  367. data/set-of-emails/maildir/bsd/us-google-10.eml +69 -0
  368. data/set-of-emails/maildir/bsd/us-google-11.eml +68 -0
  369. data/set-of-emails/maildir/bsd/us-google-12.eml +76 -0
  370. data/set-of-emails/maildir/bsd/us-google-13.eml +79 -0
  371. data/set-of-emails/maildir/bsd/us-google-14.eml +304 -0
  372. data/set-of-emails/maildir/bsd/us-office365-01.eml +102 -0
  373. data/set-of-emails/maildir/bsd/us-outlook-01.eml +72 -0
  374. data/set-of-emails/maildir/bsd/us-outlook-02.eml +72 -0
  375. data/set-of-emails/maildir/bsd/us-outlook-03.eml +72 -0
  376. data/set-of-emails/maildir/bsd/us-outlook-04.eml +79 -0
  377. data/set-of-emails/maildir/bsd/us-outlook-05.eml +85 -0
  378. data/set-of-emails/maildir/bsd/us-outlook-06.eml +75 -0
  379. data/set-of-emails/maildir/bsd/us-outlook-07.eml +70 -0
  380. data/set-of-emails/maildir/bsd/us-receivingses-01.eml +74 -0
  381. data/set-of-emails/maildir/bsd/us-receivingses-02.eml +74 -0
  382. data/set-of-emails/maildir/bsd/us-receivingses-03.eml +74 -0
  383. data/set-of-emails/maildir/bsd/us-receivingses-04.eml +74 -0
  384. data/set-of-emails/maildir/bsd/us-receivingses-05.eml +74 -0
  385. data/set-of-emails/maildir/bsd/us-receivingses-06.eml +74 -0
  386. data/set-of-emails/maildir/bsd/us-receivingses-07.eml +74 -0
  387. data/set-of-emails/maildir/bsd/us-sendgrid-01.eml +95 -0
  388. data/set-of-emails/maildir/bsd/us-sendgrid-02.eml +98 -0
  389. data/set-of-emails/maildir/bsd/us-sendgrid-03.eml +100 -0
  390. data/set-of-emails/maildir/bsd/us-verizon-01.eml +31 -0
  391. data/set-of-emails/maildir/bsd/us-yahoo-01.eml +78 -0
  392. data/set-of-emails/maildir/bsd/us-yahoo-02.eml +79 -0
  393. data/set-of-emails/maildir/bsd/us-yahoo-03.eml +93 -0
  394. data/set-of-emails/maildir/bsd/us-yahoo-04.eml +94 -0
  395. data/set-of-emails/maildir/bsd/us-yahoo-05.eml +94 -0
  396. data/set-of-emails/maildir/bsd/us-zoho-01.eml +40 -0
  397. data/set-of-emails/maildir/bsd/us-zoho-02.eml +38 -0
  398. data/set-of-emails/maildir/bsd/us-zoho-03.eml +37 -0
  399. data/set-of-emails/maildir/bsd/us-zoho-04.eml +47 -0
  400. data/set-of-emails/maildir/bsd/us-zoho-05.eml +37 -0
  401. data/set-of-emails/maildir/bsd/v5sendmail-01.eml +24 -0
  402. data/set-of-emails/maildir/bsd/v5sendmail-02.eml +26 -0
  403. data/set-of-emails/maildir/bsd/v5sendmail-03.eml +29 -0
  404. data/set-of-emails/maildir/bsd/v5sendmail-04.eml +29 -0
  405. data/set-of-emails/maildir/bsd/v5sendmail-05.eml +42 -0
  406. data/set-of-emails/maildir/bsd/v5sendmail-06.eml +28 -0
  407. data/set-of-emails/maildir/bsd/v5sendmail-07.eml +35 -0
  408. data/set-of-emails/maildir/bsd/x1-01.eml +61 -0
  409. data/set-of-emails/maildir/bsd/x1-02.eml +62 -0
  410. data/set-of-emails/maildir/bsd/x2-01.eml +41 -0
  411. data/set-of-emails/maildir/bsd/x2-02.eml +46 -0
  412. data/set-of-emails/maildir/bsd/x2-03.eml +34 -0
  413. data/set-of-emails/maildir/bsd/x2-04.eml +0 -0
  414. data/set-of-emails/maildir/bsd/x2-05.eml +98 -0
  415. data/set-of-emails/maildir/bsd/x3-01.eml +61 -0
  416. data/set-of-emails/maildir/bsd/x3-02.eml +64 -0
  417. data/set-of-emails/maildir/bsd/x3-03.eml +59 -0
  418. data/set-of-emails/maildir/bsd/x3-04.eml +106 -0
  419. data/set-of-emails/maildir/bsd/x4-01.eml +92 -0
  420. data/set-of-emails/maildir/bsd/x4-02.eml +112 -0
  421. data/set-of-emails/maildir/bsd/x4-03.eml +245 -0
  422. data/set-of-emails/maildir/bsd/x4-04.eml +81 -0
  423. data/set-of-emails/maildir/bsd/x4-05.eml +121 -0
  424. data/set-of-emails/maildir/bsd/x4-06.eml +32 -0
  425. data/set-of-emails/maildir/bsd/x4-07.eml +153 -0
  426. data/set-of-emails/maildir/bsd/x5-01.eml +155 -0
  427. data/set-of-emails/maildir/dos/activehunter-01.eml +54 -0
  428. data/set-of-emails/maildir/dos/apachejames-01.eml +46 -0
  429. data/set-of-emails/maildir/dos/arf-01.eml +66 -0
  430. data/set-of-emails/maildir/dos/courier-01.eml +79 -0
  431. data/set-of-emails/maildir/dos/de-einsundeins-01.eml +38 -0
  432. data/set-of-emails/maildir/dos/de-gmx-01.eml +52 -0
  433. data/set-of-emails/maildir/dos/domino-01.eml +33 -0
  434. data/set-of-emails/maildir/dos/exchange-01.eml +31 -0
  435. data/set-of-emails/maildir/dos/exim-01.eml +46 -0
  436. data/set-of-emails/maildir/dos/google-apps-01.eml +66 -0
  437. data/set-of-emails/maildir/dos/imailserver-01.eml +27 -0
  438. data/set-of-emails/maildir/dos/interscanmss-01.eml +49 -0
  439. data/set-of-emails/maildir/dos/jp-biglobe-01.eml +43 -0
  440. data/set-of-emails/maildir/dos/jp-ezweb-01.eml +36 -0
  441. data/set-of-emails/maildir/dos/jp-kddi-01.eml +49 -0
  442. data/set-of-emails/maildir/dos/mailfoundry-01.eml +50 -0
  443. data/set-of-emails/maildir/dos/mailmarshalsmtp-01.eml +43 -0
  444. data/set-of-emails/maildir/dos/mcafee-01.eml +63 -0
  445. data/set-of-emails/maildir/dos/messagingserver-01.eml +102 -0
  446. data/set-of-emails/maildir/dos/mfilter-01.eml +49 -0
  447. data/set-of-emails/maildir/dos/mxlogic-01.eml +47 -0
  448. data/set-of-emails/maildir/dos/notes-01.eml +42 -0
  449. data/set-of-emails/maildir/dos/opensmtpd-01.eml +33 -0
  450. data/set-of-emails/maildir/dos/postfix-01.eml +60 -0
  451. data/set-of-emails/maildir/dos/qmail-01.eml +40 -0
  452. data/set-of-emails/maildir/dos/rfc3464-01.eml +59 -0
  453. data/set-of-emails/maildir/dos/rfc3834-01.eml +37 -0
  454. data/set-of-emails/maildir/dos/ru-mailru-01.eml +54 -0
  455. data/set-of-emails/maildir/dos/ru-yandex-01.eml +102 -0
  456. data/set-of-emails/maildir/dos/sendmail-01.eml +69 -0
  457. data/set-of-emails/maildir/dos/surfcontrol-01.eml +79 -0
  458. data/set-of-emails/maildir/dos/uk-messagelabs-01.eml +76 -0
  459. data/set-of-emails/maildir/dos/us-amazonses-01.eml +59 -0
  460. data/set-of-emails/maildir/dos/us-aol-01.eml +1258 -0
  461. data/set-of-emails/maildir/dos/us-bigfoot-01.eml +64 -0
  462. data/set-of-emails/maildir/dos/us-facebook-01.eml +40 -0
  463. data/set-of-emails/maildir/dos/us-google-01.eml +70 -0
  464. data/set-of-emails/maildir/dos/us-outlook-01.eml +72 -0
  465. data/set-of-emails/maildir/dos/us-receivingses-01.eml +74 -0
  466. data/set-of-emails/maildir/dos/us-sendgrid-01.eml +95 -0
  467. data/set-of-emails/maildir/dos/us-verizon-01.eml +31 -0
  468. data/set-of-emails/maildir/dos/us-yahoo-01.eml +78 -0
  469. data/set-of-emails/maildir/dos/us-zoho-01.eml +40 -0
  470. data/set-of-emails/maildir/dos/v5sendmail-01.eml +24 -0
  471. data/set-of-emails/maildir/dos/x1-01.eml +61 -0
  472. data/set-of-emails/maildir/dos/x2-01.eml +41 -0
  473. data/set-of-emails/maildir/dos/x3-01.eml +61 -0
  474. data/set-of-emails/maildir/dos/x4-01.eml +90 -0
  475. data/set-of-emails/maildir/dos/x5-01.eml +155 -0
  476. data/set-of-emails/maildir/err/make-test-01.eml +70 -0
  477. data/set-of-emails/maildir/err/make-test-02.eml +70 -0
  478. data/set-of-emails/maildir/err/make-test-03.eml +64 -0
  479. data/set-of-emails/maildir/err/make-test-04.eml +64 -0
  480. data/set-of-emails/maildir/err/make-test-05.eml +66 -0
  481. data/set-of-emails/maildir/err/make-test-06.eml +118 -0
  482. data/set-of-emails/maildir/err/make-test-07.eml +26 -0
  483. data/set-of-emails/maildir/err/make-test-08.eml +67 -0
  484. data/set-of-emails/maildir/err/make-test-09.eml +55 -0
  485. data/set-of-emails/maildir/err/make-test-10.eml +69 -0
  486. data/set-of-emails/maildir/err/make-test-11.eml +64 -0
  487. data/set-of-emails/maildir/err/make-test-12.eml +66 -0
  488. data/set-of-emails/maildir/err/make-test-13.eml +67 -0
  489. data/set-of-emails/maildir/err/make-test-14.eml +66 -0
  490. data/set-of-emails/maildir/err/make-test-15.eml +70 -0
  491. data/set-of-emails/maildir/err/make-test-16.eml +68 -0
  492. data/set-of-emails/maildir/err/make-test-17.eml +68 -0
  493. data/set-of-emails/maildir/err/make-test-18.eml +68 -0
  494. data/set-of-emails/maildir/err/make-test-19.eml +69 -0
  495. data/set-of-emails/maildir/err/make-test-20.eml +67 -0
  496. data/set-of-emails/maildir/err/make-test-21.eml +69 -0
  497. data/set-of-emails/maildir/err/make-test-22.eml +66 -0
  498. data/set-of-emails/maildir/err/make-test-23.eml +70 -0
  499. data/set-of-emails/maildir/err/make-test-24.eml +69 -0
  500. data/set-of-emails/maildir/err/make-test-25.eml +67 -0
  501. data/set-of-emails/maildir/err/make-test-26.eml +69 -0
  502. data/set-of-emails/maildir/err/make-test-27.eml +69 -0
  503. data/set-of-emails/maildir/err/make-test-28.eml +66 -0
  504. data/set-of-emails/maildir/err/make-test-29.eml +68 -0
  505. data/set-of-emails/maildir/err/make-test-30.eml +68 -0
  506. data/set-of-emails/maildir/err/make-test-31.eml +80 -0
  507. data/set-of-emails/maildir/err/make-test-32.eml +66 -0
  508. data/set-of-emails/maildir/err/make-test-33.eml +68 -0
  509. data/set-of-emails/maildir/err/make-test-34.eml +56 -0
  510. data/set-of-emails/maildir/err/make-test-35.eml +59 -0
  511. data/set-of-emails/maildir/err/make-test-36.eml +53 -0
  512. data/set-of-emails/maildir/err/make-test-37.eml +62 -0
  513. data/set-of-emails/maildir/mac/activehunter-01.eml +1 -2
  514. data/set-of-emails/maildir/mac/apachejames-01.eml +1 -4
  515. data/set-of-emails/maildir/mac/arf-01.eml +1 -3
  516. data/set-of-emails/maildir/mac/courier-01.eml +1 -6
  517. data/set-of-emails/maildir/mac/de-einsundeins-01.eml +1 -1
  518. data/set-of-emails/maildir/mac/de-gmx-01.eml +1 -1
  519. data/set-of-emails/maildir/mac/domino-01.eml +1 -0
  520. data/set-of-emails/maildir/mac/exchange-01.eml +1 -0
  521. data/set-of-emails/maildir/mac/exim-01.eml +1 -1
  522. data/set-of-emails/maildir/mac/google-apps-01.eml +1 -4
  523. data/set-of-emails/maildir/mac/imailserver-01.eml +1 -0
  524. data/set-of-emails/maildir/mac/interscanmss-01.eml +1 -2
  525. data/set-of-emails/maildir/mac/jp-biglobe-01.eml +1 -2
  526. data/set-of-emails/maildir/mac/jp-ezweb-01.eml +1 -1
  527. data/set-of-emails/maildir/mac/jp-kddi-01.eml +1 -2
  528. data/set-of-emails/maildir/mac/mailfoundry-01.eml +1 -2
  529. data/set-of-emails/maildir/mac/mailmarshalsmtp-01.eml +1 -2
  530. data/set-of-emails/maildir/mac/mcafee-01.eml +1 -4
  531. data/set-of-emails/maildir/mac/messagingserver-01.eml +1 -4
  532. data/set-of-emails/maildir/mac/mfilter-01.eml +1 -3
  533. data/set-of-emails/maildir/mac/mxlogic-01.eml +1 -1
  534. data/set-of-emails/maildir/mac/notes-01.eml +1 -2
  535. data/set-of-emails/maildir/mac/opensmtpd-01.eml +1 -0
  536. data/set-of-emails/maildir/mac/postfix-01.eml +1 -3
  537. data/set-of-emails/maildir/mac/qmail-01.eml +1 -1
  538. data/set-of-emails/maildir/mac/rfc3464-01.eml +1 -4
  539. data/set-of-emails/maildir/mac/rfc3834-01.eml +1 -0
  540. data/set-of-emails/maildir/mac/ru-mailru-01.eml +1 -1
  541. data/set-of-emails/maildir/mac/ru-yandex-01.eml +1 -4
  542. data/set-of-emails/maildir/mac/sendmail-01.eml +1 -4
  543. data/set-of-emails/maildir/mac/surfcontrol-01.eml +1 -5
  544. data/set-of-emails/maildir/mac/uk-messagelabs-01.eml +1 -4
  545. data/set-of-emails/maildir/mac/us-amazonses-01.eml +1 -4
  546. data/set-of-emails/maildir/mac/us-aol-01.eml +1 -15
  547. data/set-of-emails/maildir/mac/us-bigfoot-01.eml +1 -4
  548. data/set-of-emails/maildir/mac/us-facebook-01.eml +1 -4
  549. data/set-of-emails/maildir/mac/us-google-01.eml +1 -1
  550. data/set-of-emails/maildir/mac/us-outlook-01.eml +1 -4
  551. data/set-of-emails/maildir/mac/us-receivingses-01.eml +1 -4
  552. data/set-of-emails/maildir/mac/us-sendgrid-01.eml +1 -3
  553. data/set-of-emails/maildir/mac/us-verizon-01.eml +1 -2
  554. data/set-of-emails/maildir/mac/us-yahoo-01.eml +1 -1
  555. data/set-of-emails/maildir/mac/us-zoho-01.eml +1 -2
  556. data/set-of-emails/maildir/mac/v5sendmail-01.eml +1 -0
  557. data/set-of-emails/maildir/mac/x1-01.eml +1 -4
  558. data/set-of-emails/maildir/mac/x2-01.eml +1 -1
  559. data/set-of-emails/maildir/mac/x3-01.eml +1 -3
  560. data/set-of-emails/maildir/mac/x4-01.eml +1 -2
  561. data/set-of-emails/maildir/mac/x5-01.eml +1 -8
  562. data/set-of-emails/maildir/not/is-not-bounce-01.eml +25 -0
  563. data/set-of-emails/to-be-debugged-because/reason-is-onhold/onhold-0001.eml +85 -0
  564. data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0002.eml +27 -0
  565. data/set-of-emails/to-be-debugged-because/reason-is-undefined/undefined-0003.eml +78 -0
  566. data/set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yet/cannot-parse-this-email-0002.eml +25 -0
  567. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-01.eml +79 -0
  568. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-02.eml +72 -0
  569. data/set-of-emails/to-be-debugged-because/something-is-wrong/issue-106-03.eml +68 -0
  570. data/set-of-emails/to-be-debugged-because/something-is-wrong/no-message-id-from-pr-150.eml +75 -0
  571. data/set-of-emails/to-be-parsed-for-test/README.md +20 -0
  572. data/sisimai-java.gemspec +29 -0
  573. data/sisimai.gemspec +28 -0
  574. metadata +680 -0
@@ -0,0 +1,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
+ %w|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
+
@@ -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
+ %w|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
+