mail_engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. data/.yardoc/checksums +17 -0
  2. data/.yardoc/objects/ActionMailer/Base/collect_responses_and_parts_order_i.dat +0 -0
  3. data/.yardoc/objects/ActionMailer/Base/mail_i.dat +0 -0
  4. data/.yardoc/objects/ActionMailer/Base/origin_mail_i.dat +0 -0
  5. data/.yardoc/objects/ActionMailer/Base/set_layout_and_partials_i.dat +0 -0
  6. data/.yardoc/objects/ActionMailer/Base.dat +0 -0
  7. data/.yardoc/objects/ActionMailer/Collector/custom_i.dat +0 -0
  8. data/.yardoc/objects/ActionMailer/Collector.dat +0 -0
  9. data/.yardoc/objects/ActionMailer.dat +0 -0
  10. data/.yardoc/objects/MailEngine/ActsAsMailReceiver/ClassMethods/acts_as_mail_receiver_i.dat +0 -0
  11. data/.yardoc/objects/MailEngine/ActsAsMailReceiver/ClassMethods.dat +0 -0
  12. data/.yardoc/objects/MailEngine/ActsAsMailReceiver.dat +0 -0
  13. data/.yardoc/objects/MailEngine/Base/_40_40configurations.dat +0 -0
  14. data/.yardoc/objects/MailEngine/Base/current_config_c.dat +0 -0
  15. data/.yardoc/objects/MailEngine/Base/send_mail_c.dat +0 -0
  16. data/.yardoc/objects/MailEngine/Base.dat +0 -0
  17. data/.yardoc/objects/MailEngine/Configuration/load_c.dat +0 -0
  18. data/.yardoc/objects/MailEngine/Configuration.dat +0 -0
  19. data/.yardoc/objects/MailEngine/CreateConfig/create_config_file_i.dat +0 -0
  20. data/.yardoc/objects/MailEngine/CreateConfig.dat +0 -0
  21. data/.yardoc/objects/MailEngine/CreateMigration/create_migrations_i.dat +0 -0
  22. data/.yardoc/objects/MailEngine/CreateMigration.dat +0 -0
  23. data/.yardoc/objects/MailEngine/Engine.dat +0 -0
  24. data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/check_21_c.dat +0 -0
  25. data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/process_c.dat +0 -0
  26. data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/replace_resource_filename_in_html_c.dat +0 -0
  27. data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/replace_resource_url_in_html_c.dat +0 -0
  28. data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer.dat +0 -0
  29. data/.yardoc/objects/MailEngine/MailLogSubscriber/deliver_i.dat +0 -0
  30. data/.yardoc/objects/MailEngine/MailLogSubscriber.dat +0 -0
  31. data/.yardoc/objects/MailEngine/Sendgrid/Base/ClassMethods/sendgrid_header_i.dat +0 -0
  32. data/.yardoc/objects/MailEngine/Sendgrid/Base/ClassMethods.dat +0 -0
  33. data/.yardoc/objects/MailEngine/Sendgrid/Base/InstanceMethods.dat +0 -0
  34. data/.yardoc/objects/MailEngine/Sendgrid/Base.dat +0 -0
  35. data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/data_3D_i.dat +0 -0
  36. data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/data_i.dat +0 -0
  37. data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/initialize_i.dat +0 -0
  38. data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/validate_config_21_i.dat +0 -0
  39. data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting.dat +0 -0
  40. data/.yardoc/objects/MailEngine/Sendgrid/RestApi/blocks_c.dat +0 -0
  41. data/.yardoc/objects/MailEngine/Sendgrid/RestApi/bounces_c.dat +0 -0
  42. data/.yardoc/objects/MailEngine/Sendgrid/RestApi/invalidemails_c.dat +0 -0
  43. data/.yardoc/objects/MailEngine/Sendgrid/RestApi/spamreports_c.dat +0 -0
  44. data/.yardoc/objects/MailEngine/Sendgrid/RestApi/stats_c.dat +0 -0
  45. data/.yardoc/objects/MailEngine/Sendgrid/RestApi.dat +0 -0
  46. data/.yardoc/objects/MailEngine/Sendgrid/RestApiError.dat +0 -0
  47. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/add_sub_val_i.dat +0 -0
  48. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/add_to_i.dat +0 -0
  49. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/category_i.dat +0 -0
  50. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/filters_i.dat +0 -0
  51. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/initialize_i.dat +0 -0
  52. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/set_unique_args_i.dat +0 -0
  53. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/to_hash_i.dat +0 -0
  54. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/to_json_i.dat +0 -0
  55. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/to_s_i.dat +0 -0
  56. data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi.dat +0 -0
  57. data/.yardoc/objects/MailEngine/Sendgrid.dat +0 -0
  58. data/.yardoc/objects/MailEngine/VERSION.dat +0 -0
  59. data/.yardoc/objects/MailEngine/ZipProcessor/extract_all_files_c.dat +0 -0
  60. data/.yardoc/objects/MailEngine/ZipProcessor.dat +0 -0
  61. data/.yardoc/objects/MailEngine.dat +0 -0
  62. data/.yardoc/objects/PLACEHOLDERS_IN_LAYOUT.dat +0 -0
  63. data/.yardoc/objects/root.dat +0 -0
  64. data/.yardoc/proxy_types +0 -0
  65. data/Gemfile +36 -0
  66. data/Gemfile.lock +159 -0
  67. data/MIT-LICENSE +20 -0
  68. data/README.mkd +152 -0
  69. data/Rakefile +57 -0
  70. data/VERSION +1 -0
  71. data/app/controllers/mail_engine/application_controller.rb +7 -0
  72. data/app/controllers/mail_engine/dashboard_controller.rb +9 -0
  73. data/app/controllers/mail_engine/mail_logs_controller.rb +20 -0
  74. data/app/controllers/mail_engine/mail_schedules_controller.rb +56 -0
  75. data/app/controllers/mail_engine/mail_template_files_controller.rb +46 -0
  76. data/app/controllers/mail_engine/mail_templates_controller.rb +141 -0
  77. data/app/controllers/mail_engine/reports_controller.rb +34 -0
  78. data/app/helpers/mail_engine/mail_engine_helper.rb +30 -0
  79. data/app/mailers/mail_engine/mail_dispatcher.rb +59 -0
  80. data/app/models/mail_engine/mail_log.rb +36 -0
  81. data/app/models/mail_engine/mail_schedule.rb +70 -0
  82. data/app/models/mail_engine/mail_template.rb +270 -0
  83. data/app/models/mail_engine/mail_template_file.rb +31 -0
  84. data/app/models/mail_engine/template_partial.rb +9 -0
  85. data/app/uploaders/mail_engine/template_file_uploader.rb +47 -0
  86. data/app/uploaders/mail_engine/zip_file_uploader.rb +47 -0
  87. data/app/views/layouts/mail_engine/mail_engine.html.erb +112 -0
  88. data/app/views/layouts/mail_engine/mail_template_layouts/header_and_footer.html.erb +10 -0
  89. data/app/views/layouts/mail_engine/mail_template_layouts/header_and_footer.text.erb +3 -0
  90. data/app/views/layouts/mail_engine/mail_template_layouts/none.html.erb +8 -0
  91. data/app/views/layouts/mail_engine/mail_template_layouts/none.text.erb +1 -0
  92. data/app/views/layouts/mail_engine/mail_template_layouts/only_footer.html.erb +9 -0
  93. data/app/views/layouts/mail_engine/mail_template_layouts/only_footer.text.erb +2 -0
  94. data/app/views/mail_engine/dashboard/index.html.erb +64 -0
  95. data/app/views/mail_engine/mail_logs/index.html.erb +34 -0
  96. data/app/views/mail_engine/mail_logs/show.html.erb +38 -0
  97. data/app/views/mail_engine/mail_schedules/_form.html.erb +45 -0
  98. data/app/views/mail_engine/mail_schedules/edit.html.erb +16 -0
  99. data/app/views/mail_engine/mail_schedules/index.html.erb +50 -0
  100. data/app/views/mail_engine/mail_schedules/new.html.erb +13 -0
  101. data/app/views/mail_engine/mail_schedules/show.html.erb +44 -0
  102. data/app/views/mail_engine/mail_template_files/_form.html.erb +28 -0
  103. data/app/views/mail_engine/mail_template_files/edit.html.erb +9 -0
  104. data/app/views/mail_engine/mail_template_files/new.html.erb +9 -0
  105. data/app/views/mail_engine/mail_templates/_form.html.erb +97 -0
  106. data/app/views/mail_engine/mail_templates/_layout_selector.html.erb +50 -0
  107. data/app/views/mail_engine/mail_templates/duplicate.html.erb +41 -0
  108. data/app/views/mail_engine/mail_templates/edit.html.erb +16 -0
  109. data/app/views/mail_engine/mail_templates/index.html.erb +69 -0
  110. data/app/views/mail_engine/mail_templates/new.html.erb +12 -0
  111. data/app/views/mail_engine/mail_templates/new_by_upload.html.erb +63 -0
  112. data/app/views/mail_engine/mail_templates/partial_options.html.erb +28 -0
  113. data/app/views/mail_engine/mail_templates/preview.html.erb +1 -0
  114. data/app/views/mail_engine/mail_templates/preview.text.erb +1 -0
  115. data/app/views/mail_engine/mail_templates/show.html.erb +64 -0
  116. data/app/views/mail_engine/reports/charts/blocks.html.erb +21 -0
  117. data/app/views/mail_engine/reports/charts/bounces.html.erb +21 -0
  118. data/app/views/mail_engine/reports/charts/invalidemails.html.erb +19 -0
  119. data/app/views/mail_engine/reports/charts/spamreports.html.erb +17 -0
  120. data/app/views/mail_engine/reports/index.html.erb +67 -0
  121. data/config/routes.rb +48 -0
  122. data/db/migrate/20110114030841_create_table_mail_template.rb +22 -0
  123. data/db/migrate/20110126030525_create_mail_schedules.rb +21 -0
  124. data/db/migrate/20110204114145_create_template_partials.rb +13 -0
  125. data/db/migrate/20110206025002_create_mail_logs.rb +17 -0
  126. data/db/migrate/20110217062316_create_mail_template_files.rb +14 -0
  127. data/doc/_index.html +322 -0
  128. data/doc/class_list.html +36 -0
  129. data/doc/css/common.css +1 -0
  130. data/doc/css/full_list.css +53 -0
  131. data/doc/css/style.css +310 -0
  132. data/doc/file_list.html +38 -0
  133. data/doc/frames.html +13 -0
  134. data/doc/js/app.js +203 -0
  135. data/doc/js/full_list.js +149 -0
  136. data/doc/js/jquery.js +154 -0
  137. data/doc/method_list.html +283 -0
  138. data/lib/mail_engine/action_mailer_patch.rb +104 -0
  139. data/lib/mail_engine/acts_as_mail_receiver.rb +22 -0
  140. data/lib/mail_engine/base.rb +26 -0
  141. data/lib/mail_engine/configuration.rb +11 -0
  142. data/lib/mail_engine/engine.rb +42 -0
  143. data/lib/mail_engine/generators/create_config.rb +20 -0
  144. data/lib/mail_engine/generators/create_migration.rb +20 -0
  145. data/lib/mail_engine/generators/templates/mail_engine_config.yml +14 -0
  146. data/lib/mail_engine/html_document_assets_replacer.rb +86 -0
  147. data/lib/mail_engine/mail_log_subscriber.rb +30 -0
  148. data/lib/mail_engine/placeholders_in_layout.rb +5 -0
  149. data/lib/mail_engine/sendgrid/base.rb +45 -0
  150. data/lib/mail_engine/sendgrid/rest_api.rb +85 -0
  151. data/lib/mail_engine/sendgrid/smtp_api.rb +85 -0
  152. data/lib/mail_engine/sendgrid.rb +9 -0
  153. data/lib/mail_engine/tasks/sendmail.rake +8 -0
  154. data/lib/mail_engine/version.rb +3 -0
  155. data/lib/mail_engine/zip_processor.rb +51 -0
  156. data/lib/mail_engine.rb +17 -0
  157. data/mail_engine.gemspec +422 -0
  158. data/screenshots/bounce_report.png +0 -0
  159. data/screenshots/dashboard.png +0 -0
  160. data/screenshots/editing_mail_template.png +0 -0
  161. data/screenshots/logs.png +0 -0
  162. data/screenshots/new_by_upload.png +0 -0
  163. data/screenshots/reports.png +0 -0
  164. data/screenshots/schedule.png +0 -0
  165. data/screenshots/select_layout_partial.png +0 -0
  166. data/screenshots/templates.png +0 -0
  167. data/test/dummy/Rakefile +7 -0
  168. data/test/dummy/app/controllers/application_controller.rb +11 -0
  169. data/test/dummy/app/helpers/application_helper.rb +2 -0
  170. data/test/dummy/app/mailers/user_mailer.rb +36 -0
  171. data/test/dummy/app/models/user.rb +10 -0
  172. data/test/dummy/config/application.rb +52 -0
  173. data/test/dummy/config/boot.rb +10 -0
  174. data/test/dummy/config/database.yml +52 -0
  175. data/test/dummy/config/environment.rb +5 -0
  176. data/test/dummy/config/environments/development.rb +47 -0
  177. data/test/dummy/config/environments/production.rb +49 -0
  178. data/test/dummy/config/environments/test.rb +43 -0
  179. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  180. data/test/dummy/config/initializers/inflections.rb +10 -0
  181. data/test/dummy/config/initializers/mime_types.rb +5 -0
  182. data/test/dummy/config/initializers/secret_token.rb +7 -0
  183. data/test/dummy/config/initializers/session_store.rb +8 -0
  184. data/test/dummy/config/locales/en.yml +5 -0
  185. data/test/dummy/config/locales/zh.yml +2 -0
  186. data/test/dummy/config/routes.rb +58 -0
  187. data/test/dummy/config.ru +4 -0
  188. data/test/dummy/db/migrate/20110114030841_create_table_mail_template.rb +22 -0
  189. data/test/dummy/db/migrate/20110125094530_create_users.rb +16 -0
  190. data/test/dummy/db/migrate/20110126030525_create_mail_schedules.rb +21 -0
  191. data/test/dummy/db/migrate/20110204114145_create_template_partials.rb +13 -0
  192. data/test/dummy/db/migrate/20110206025002_create_mail_logs.rb +17 -0
  193. data/test/dummy/db/migrate/20110217062316_create_mail_template_files.rb +14 -0
  194. data/test/dummy/db/schema.rb +78 -0
  195. data/test/dummy/public/404.html +26 -0
  196. data/test/dummy/public/422.html +26 -0
  197. data/test/dummy/public/500.html +26 -0
  198. data/test/dummy/public/favicon.ico +0 -0
  199. data/test/dummy/public/images/mail_engine/header_and_footer_layout.png +0 -0
  200. data/test/dummy/public/images/mail_engine/logo.gif +0 -0
  201. data/test/dummy/public/images/mail_engine/logo.png +0 -0
  202. data/test/dummy/public/images/mail_engine/none_layout.png +0 -0
  203. data/test/dummy/public/images/mail_engine/only_footer_layout.png +0 -0
  204. data/test/dummy/public/images/mail_engine/unselect_header_and_footer_layout.png +0 -0
  205. data/test/dummy/public/images/mail_engine/unselect_none_layout.png +0 -0
  206. data/test/dummy/public/images/mail_engine/unselect_only_footer_layout.png +0 -0
  207. data/test/dummy/public/javascripts/jquery.iframe-auto-height.plugin.js +50 -0
  208. data/test/dummy/public/javascripts/jquery.js +16 -0
  209. data/test/dummy/public/javascripts/jquery.nyroModal/img/ajaxLoader.gif +0 -0
  210. data/test/dummy/public/javascripts/jquery.nyroModal/img/close.gif +0 -0
  211. data/test/dummy/public/javascripts/jquery.nyroModal/img/next.gif +0 -0
  212. data/test/dummy/public/javascripts/jquery.nyroModal/img/prev.gif +0 -0
  213. data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal-ie6.js +186 -0
  214. data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal-ie6.min.js +9 -0
  215. data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal.custom.js +1599 -0
  216. data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal.custom.min.js +34 -0
  217. data/test/dummy/public/javascripts/jquery.nyroModal/styles/nyroModal.css +102 -0
  218. data/test/dummy/public/javascripts/jquery.string.js +425 -0
  219. data/test/dummy/public/javascripts/mail_engine_application.js +2 -0
  220. data/test/dummy/public/javascripts/markitup/jquery.markitup.js +564 -0
  221. data/test/dummy/public/javascripts/markitup/sets/css/images/bold.png +0 -0
  222. data/test/dummy/public/javascripts/markitup/sets/css/images/css.png +0 -0
  223. data/test/dummy/public/javascripts/markitup/sets/css/images/italic.png +0 -0
  224. data/test/dummy/public/javascripts/markitup/sets/css/images/picture.png +0 -0
  225. data/test/dummy/public/javascripts/markitup/sets/css/images/stroke.png +0 -0
  226. data/test/dummy/public/javascripts/markitup/sets/css/images/tag.png +0 -0
  227. data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_center.png +0 -0
  228. data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_justify.png +0 -0
  229. data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_left.png +0 -0
  230. data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_right.png +0 -0
  231. data/test/dummy/public/javascripts/markitup/sets/css/images/text_indent.png +0 -0
  232. data/test/dummy/public/javascripts/markitup/sets/css/images/text_letterspacing.png +0 -0
  233. data/test/dummy/public/javascripts/markitup/sets/css/images/text_linespacing.png +0 -0
  234. data/test/dummy/public/javascripts/markitup/sets/css/images/text_lowercase.png +0 -0
  235. data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_bottom.png +0 -0
  236. data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_left.png +0 -0
  237. data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_right.png +0 -0
  238. data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_top.png +0 -0
  239. data/test/dummy/public/javascripts/markitup/sets/css/images/text_uppercase.png +0 -0
  240. data/test/dummy/public/javascripts/markitup/sets/css/readme.txt +28 -0
  241. data/test/dummy/public/javascripts/markitup/sets/css/set.js +52 -0
  242. data/test/dummy/public/javascripts/markitup/sets/css/style.css +72 -0
  243. data/test/dummy/public/javascripts/markitup/sets/default/images/bold.png +0 -0
  244. data/test/dummy/public/javascripts/markitup/sets/default/images/clean.png +0 -0
  245. data/test/dummy/public/javascripts/markitup/sets/default/images/image.png +0 -0
  246. data/test/dummy/public/javascripts/markitup/sets/default/images/italic.png +0 -0
  247. data/test/dummy/public/javascripts/markitup/sets/default/images/link.png +0 -0
  248. data/test/dummy/public/javascripts/markitup/sets/default/images/picture.png +0 -0
  249. data/test/dummy/public/javascripts/markitup/sets/default/images/preview.png +0 -0
  250. data/test/dummy/public/javascripts/markitup/sets/default/images/stroke.png +0 -0
  251. data/test/dummy/public/javascripts/markitup/sets/default/set.js +27 -0
  252. data/test/dummy/public/javascripts/markitup/sets/default/style.css +27 -0
  253. data/test/dummy/public/javascripts/markitup/sets/html/images/bold.png +0 -0
  254. data/test/dummy/public/javascripts/markitup/sets/html/images/clean.png +0 -0
  255. data/test/dummy/public/javascripts/markitup/sets/html/images/h1.png +0 -0
  256. data/test/dummy/public/javascripts/markitup/sets/html/images/h2.png +0 -0
  257. data/test/dummy/public/javascripts/markitup/sets/html/images/h3.png +0 -0
  258. data/test/dummy/public/javascripts/markitup/sets/html/images/h4.png +0 -0
  259. data/test/dummy/public/javascripts/markitup/sets/html/images/h5.png +0 -0
  260. data/test/dummy/public/javascripts/markitup/sets/html/images/h6.png +0 -0
  261. data/test/dummy/public/javascripts/markitup/sets/html/images/image.png +0 -0
  262. data/test/dummy/public/javascripts/markitup/sets/html/images/italic.png +0 -0
  263. data/test/dummy/public/javascripts/markitup/sets/html/images/link.png +0 -0
  264. data/test/dummy/public/javascripts/markitup/sets/html/images/list-bullet.png +0 -0
  265. data/test/dummy/public/javascripts/markitup/sets/html/images/list-item.png +0 -0
  266. data/test/dummy/public/javascripts/markitup/sets/html/images/list-numeric.png +0 -0
  267. data/test/dummy/public/javascripts/markitup/sets/html/images/paragraph.png +0 -0
  268. data/test/dummy/public/javascripts/markitup/sets/html/images/picture.png +0 -0
  269. data/test/dummy/public/javascripts/markitup/sets/html/images/preview.png +0 -0
  270. data/test/dummy/public/javascripts/markitup/sets/html/images/stroke.png +0 -0
  271. data/test/dummy/public/javascripts/markitup/sets/html/readme.txt +11 -0
  272. data/test/dummy/public/javascripts/markitup/sets/html/set.js +40 -0
  273. data/test/dummy/public/javascripts/markitup/sets/html/style.css +59 -0
  274. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-container.png +0 -0
  275. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-bbcode.png +0 -0
  276. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-dotclear.png +0 -0
  277. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-html.png +0 -0
  278. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-json.png +0 -0
  279. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-markdown.png +0 -0
  280. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-textile.png +0 -0
  281. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-wiki.png +0 -0
  282. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-xml.png +0 -0
  283. data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor.png +0 -0
  284. data/test/dummy/public/javascripts/markitup/skins/markitup/images/handle.png +0 -0
  285. data/test/dummy/public/javascripts/markitup/skins/markitup/images/menu.png +0 -0
  286. data/test/dummy/public/javascripts/markitup/skins/markitup/images/submenu.png +0 -0
  287. data/test/dummy/public/javascripts/markitup/skins/markitup/style.css +147 -0
  288. data/test/dummy/public/javascripts/markitup/skins/simple/images/handle.png +0 -0
  289. data/test/dummy/public/javascripts/markitup/skins/simple/images/menu.png +0 -0
  290. data/test/dummy/public/javascripts/markitup/skins/simple/images/submenu.png +0 -0
  291. data/test/dummy/public/javascripts/markitup/skins/simple/style.css +118 -0
  292. data/test/dummy/public/javascripts/markitup/templates/preview.css +5 -0
  293. data/test/dummy/public/javascripts/markitup/templates/preview.html +11 -0
  294. data/test/dummy/public/javascripts/rails.js +132 -0
  295. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  296. data/test/dummy/public/stylesheets/application.css +0 -0
  297. data/test/dummy/public/stylesheets/style.css +681 -0
  298. data/test/dummy/script/rails +6 -0
  299. data/test/factories.rb +88 -0
  300. data/test/fixtures/files/compress_by_dir.zip +0 -0
  301. data/test/fixtures/files/compress_by_file.zip +0 -0
  302. data/test/fixtures/files/image.png +0 -0
  303. data/test/functional/mail_engine/mail_dispatcher_test.rb +8 -0
  304. data/test/functional/mail_engine/mail_schedules_controller_controller_test.rb +8 -0
  305. data/test/functional/mail_engine/mail_templates_controller_controller_test.rb +8 -0
  306. data/test/support/integration_case.rb +5 -0
  307. data/test/test_helper.rb +35 -0
  308. data/test/unit/mail_engine/mail_log_test.rb +8 -0
  309. data/test/unit/mail_engine/mail_schedule_test.rb +40 -0
  310. data/test/unit/mail_engine/mail_template_file_test.rb +21 -0
  311. data/test/unit/mail_engine/mail_template_test.rb +77 -0
  312. data/test/unit/mail_engine/template_partial_test.rb +8 -0
  313. metadata +597 -0
@@ -0,0 +1,56 @@
1
+ class MailEngine::MailSchedulesController < MailEngine::ApplicationController
2
+ before_filter :find_model
3
+
4
+ def index
5
+ @mail_schedules = MailSchedule.paginate :page => params[:page], :per_page => 20
6
+ end
7
+
8
+ def show
9
+ end
10
+
11
+ def destroy
12
+ @mail_schedule.destroy
13
+ redirect_to mail_schedules_path
14
+ end
15
+
16
+ def create
17
+ @mail_schedule = MailSchedule.new(params[:mail_engine_mail_schedule].merge(:payload => params[:mail_engine_mail_schedule][:payload].try(:join, ',')))
18
+
19
+ if @mail_schedule.save
20
+ redirect_to mail_schedule_path(@mail_schedule), :notice => 'Mail schedule was successfully created.'
21
+ else
22
+ render "new"
23
+ end
24
+ end
25
+
26
+ def new
27
+ if MailTemplate.for_marketing.count == 0
28
+ flash[:notice] = "Add Marketing mail template first."
29
+ redirect_to :action => :index
30
+ end
31
+ @mail_schedule = MailSchedule.new
32
+ end
33
+
34
+ def update
35
+ if @mail_schedule.update_attributes(params[:mail_engine_mail_schedule].merge(:payload => params[:mail_engine_mail_schedule][:payload].join(',')))
36
+ redirect_to mail_schedule_path(@mail_schedule), :notice => 'Mail schedule was successfully updated.'
37
+ else
38
+ render "new"
39
+ end
40
+ end
41
+
42
+ def edit
43
+ end
44
+
45
+ def send_test_mail
46
+ @mail_schedule.send_test_mail_to!(params[:recipient])
47
+ render :text => "alert('Test Mail sent to #{params[:recipient]}'); $('#recipient').val('');"
48
+ rescue => e
49
+ render :text => "alert('Test Mail failed to send to #{params[:recipient]}, due to #{e.to_s}'); $('#recipient').val('');"
50
+ end
51
+
52
+ private
53
+ def find_model
54
+ @mail_schedule = MailSchedule.find(params[:id]) if params[:id]
55
+ end
56
+ end
@@ -0,0 +1,46 @@
1
+ class MailEngine::MailTemplateFilesController < MailEngine::ApplicationController
2
+ layout :false
3
+ before_filter :find_model
4
+
5
+ def index
6
+ end
7
+
8
+ def new
9
+ @mail_template_file = @mail_template.mail_template_files.new
10
+ end
11
+
12
+ def create
13
+ @mail_template_file = @mail_template.mail_template_files.new(params[:mail_engine_mail_template_file])
14
+ if @mail_template_file.save
15
+ redirect_to edit_mail_template_path(@mail_template)
16
+ else
17
+ render :new
18
+ end
19
+ end
20
+
21
+ def edit
22
+ end
23
+
24
+ def update
25
+ if @mail_template_file.update_attributes(params[:mail_engine_mail_template_file])
26
+ redirect_to edit_mail_template_path(@mail_template)
27
+ else
28
+ render :edit
29
+ end
30
+ end
31
+
32
+ def destroy
33
+ @mail_template_file.destroy
34
+ render :text => "window.location.reload()"
35
+ end
36
+
37
+ def show
38
+ end
39
+
40
+ private
41
+
42
+ def find_model
43
+ @mail_template = MailTemplate.find(params[:mail_template_id]) if params[:mail_template_id].present?
44
+ @mail_template_file = MailTemplateFile.find(params[:id]) if params[:id].present?
45
+ end
46
+ end
@@ -0,0 +1,141 @@
1
+ class MailEngine::MailTemplatesController < MailEngine::ApplicationController
2
+ before_filter :find_model
3
+
4
+ def index
5
+ @mail_templates = case params[:type]
6
+ when "marketing"
7
+ MailEngine::MailTemplate.for_marketing
8
+ when "system"
9
+ MailEngine::MailTemplate.for_system
10
+ when "partial"
11
+ MailEngine::MailTemplate.partial
12
+ else
13
+ redirect_to mail_templates_path(:type => "system")
14
+ return
15
+ end
16
+
17
+ @mail_templates = @mail_templates.group("path").paginate :page => params[:page], :per_page => 20
18
+ end
19
+
20
+ def show
21
+ end
22
+
23
+ def preview
24
+ @mail_template = MailEngine::MailTemplate.new if @mail_template.blank?
25
+ @mail_template.body = params[:new_body] if params[:new_body]
26
+ render :layout => false
27
+ end
28
+
29
+ def body
30
+ I18n.with_locale(@mail_template.locale) {
31
+ if @mail_template.partial?
32
+ render :partial => @mail_template.path,
33
+ :layout => false,
34
+ :content_type => Mime[@mail_template.format].to_s
35
+ else
36
+ # set @footer or @header
37
+ related_partial_paths = {}
38
+ @mail_template.template_partials.each { |tmp| related_partial_paths["#{tmp.placeholder_name}_path".to_sym] = tmp.partial.path }
39
+ render :template => @mail_template.path,
40
+ :layout => "layouts/mail_engine/mail_template_layouts/#{@mail_template.layout}",
41
+ :locals => related_partial_paths
42
+ end
43
+ }
44
+ end
45
+
46
+ def duplicate
47
+ if request.put?
48
+ @duplicated_mail_template = @mail_template.duplicate(params[:mail_engine_mail_template])
49
+ if @duplicated_mail_template.errors.blank?
50
+ redirect_to mail_templates_path(:type => params[:type])
51
+ return
52
+ end
53
+ else
54
+ @duplicated_mail_template = @mail_template
55
+ end
56
+
57
+ render :layout => false
58
+ end
59
+
60
+ def destroy
61
+ if @mail_template.partial_in_use?
62
+ flash[:notice] = "Partial##{@mail_template.id} is in use, so can't be destroyed."
63
+ else
64
+ @mail_template.destroy
65
+ end
66
+ redirect_to mail_templates_path(:type => params[:type])
67
+ end
68
+
69
+ def create
70
+ @mail_template = MailTemplate.new(params[:mail_engine_mail_template])
71
+ if @mail_template.save
72
+ redirect_to mail_template_path(@mail_template), :notice => 'Mail template was successfully created.'
73
+ else
74
+ render "new"
75
+ end
76
+ end
77
+
78
+ def new
79
+ @mail_template = MailTemplate.new :layout => 'none'
80
+ end
81
+
82
+ def new_by_upload
83
+ @mail_template = MailTemplate.new :layout => 'none', :format => 'html'
84
+ end
85
+
86
+ def create_by_upload
87
+ @mail_template = MailTemplate.new(params[:mail_engine_mail_template])
88
+ if @mail_template.save
89
+ redirect_to mail_template_path(@mail_template), :notice => 'Mail template was successfully created.'
90
+ else
91
+ render "new_by_upload"
92
+ end
93
+ end
94
+
95
+ def partial_options
96
+ @tmp_mail_template = MailTemplate.new
97
+
98
+ if @mail_template and @mail_template.persisted?
99
+ @tmp_mail_template.layout = @mail_template.try(:layout)
100
+ @tmp_mail_template.template_partials = @mail_template.try(:template_partials)
101
+ end
102
+
103
+ if params[:layout] != @tmp_mail_template.layout || @tmp_mail_template.template_partials.blank?
104
+ @tmp_mail_template.template_partials.delete_if {|tmp| tmp.persisted?}
105
+ case params[:layout]
106
+ when 'none'
107
+ when 'only_footer'
108
+ @tmp_mail_template.template_partials.build :placeholder_name => 'footer'
109
+ when 'header_and_footer'
110
+ @tmp_mail_template.template_partials.build :placeholder_name => 'header'
111
+ @tmp_mail_template.template_partials.build :placeholder_name => 'footer'
112
+ else
113
+ end
114
+ end
115
+
116
+ render :layout => false
117
+ end
118
+
119
+ def update
120
+ if @mail_template.update_attributes(params[:mail_engine_mail_template])
121
+ redirect_to mail_template_path(@mail_template), :notice => 'Mail template was successfully created.'
122
+ else
123
+ render "edit"
124
+ end
125
+ end
126
+
127
+ def edit
128
+ end
129
+
130
+ def send_test_mail
131
+ @mail_template.send_test_mail_to!(params[:recipient])
132
+ render :text => "alert('Test Mail sent to #{params[:recipient]}'); $('#recipient').val('');"
133
+ rescue => e
134
+ render :text => "alert(\"Test Mail failed to send to #{params[:recipient]}, due to #{e.to_s}\"); $('#recipient').val('');"
135
+ end
136
+
137
+ private
138
+ def find_model
139
+ @mail_template = MailTemplate.find(params[:id]) if params[:id].present?
140
+ end
141
+ end
@@ -0,0 +1,34 @@
1
+ class MailEngine::ReportsController < MailEngine::ApplicationController
2
+ def index
3
+ @pie_chart_columns = ["bounces", "unique_opens", "spamreports", "blocks", "unopened"]
4
+ @stat_columns = [
5
+ "requests",
6
+ "delivered",
7
+ "blocks",
8
+ "invalid_email",
9
+ "clicks",
10
+ "unique_clicks",
11
+ "opens",
12
+ "unique_opens",
13
+ "bounces",
14
+ "repeat_bounces",
15
+ "spamreports",
16
+ "repeat_spamreports",
17
+ "unsubscribes",
18
+ "repeat_unsubscribes"
19
+ ]
20
+
21
+ @stats_data = MailEngine::Sendgrid::RestApi.stats(:days => 6)
22
+ @data_of_today = @stats_data.last
23
+ end
24
+
25
+ def chart
26
+ if ['bounces', 'blocks', 'spamreports', 'invalidemails'].include?(params[:type])
27
+ @result = Array.wrap(MailEngine::Sendgrid::RestApi.send(params[:type], :date => 1)) || []
28
+ render "mail_engine/reports/charts/#{params[:type]}"
29
+ else
30
+ flash[:notice] = "Error chart type."
31
+ redirect_to :back
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,30 @@
1
+ module MailEngine
2
+ module MailEngineHelper
3
+
4
+ def show_no_record collection, &block
5
+ if collection.blank?
6
+ return raw("<div class='notice' style='margin-top:10px'>No Record</div>")
7
+ else
8
+ block.call
9
+ return ""
10
+ end
11
+ end
12
+
13
+ def show_percentage reality, total
14
+ return "-" if total <= 0
15
+ percentage = (reality / total) * 100
16
+ return "#{percentage.round(2)}%"
17
+ end
18
+
19
+ def mail_template_list_title type
20
+ case type
21
+ when "partial"
22
+ "Mail Template Partial"
23
+ when "system", "marketing"
24
+ "#{type.try(:capitalize)} Mail Template"
25
+ else
26
+ "Mail Template"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,59 @@
1
+ class MailEngine::MailDispatcher < ActionMailer::Base
2
+ default :from => "info@itjob.fm"
3
+ sendgrid_header do
4
+ category "itjob_test"
5
+
6
+ filters {
7
+ opentrack "enable" => 1
8
+ clicktrack "enable" => 1
9
+ subscriptiontrack "enable" => 0
10
+ template "enable" => 0
11
+ footer "enable" => 0
12
+ }
13
+ end
14
+
15
+ protected
16
+
17
+ def self.method_missing(method, *args)
18
+ return super if respond_to?(method) # basically it won't unless subclass
19
+
20
+ # TODO if template file exists, don't need to exam the db.
21
+ templates = MailEngine::MailTemplate.where(:path => method).order('format desc').all
22
+ raise "No Template added." if templates.blank?
23
+
24
+ formats = templates.map {|t| "format.#{t.format}" }.sort.reverse
25
+
26
+ ###
27
+ # MailEngine::MailDispatcher.{any template name}(
28
+ # :subject => 'hello',
29
+ # :to => 'm@theplant.jp',
30
+ # :values => {:username => @user.name}
31
+ # ).deliver
32
+ #
33
+ class_eval <<-METHOD
34
+ def #{method} options
35
+ ### extract mail options, used for mail method.
36
+ mail_options = {}
37
+ options.delete_if {|key, value|
38
+ if [:subject, :to, :from, :cc, :bcc, :reply_to, :date].include?(key.to_sym)
39
+ mail_options[key] = value
40
+ true
41
+ else
42
+ false
43
+ end
44
+ }
45
+
46
+ ### store :values to instance value
47
+ (options[:values]||[]).each do |key, value|
48
+ instance_variable_set "@" + key.to_s, value
49
+ end
50
+
51
+ mail mail_options do |format|
52
+ #{formats.join(';')}
53
+ end
54
+ end
55
+ METHOD
56
+
57
+ new(method, *args).message
58
+ end
59
+ end
@@ -0,0 +1,36 @@
1
+ class MailEngine::MailLog < ActiveRecord::Base
2
+ validates_presence_of :mail_template_path
3
+
4
+ # Callback of Mail gem when delivering mails
5
+ def self.delivering_email mail
6
+ # pp email.body.raw_source
7
+ # pp email.to
8
+ # pp email.from
9
+ # pp email.subject
10
+ # pp email.mime_type
11
+
12
+ ##################
13
+ # pp mail.mime_type
14
+ # pp mail.content_type
15
+ # pp mail.from #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
16
+ # pp mail.to #=> 'bob@test.lindsaar.net'
17
+ # pp mail.subject #=> "This is the subject"
18
+ # pp mail.body.decoded #=> 'This is the body of the email...
19
+ ###################
20
+
21
+ # pp mail.parts.map { |p| p.content_type } #=> ['text/plain', 'application/pdf']
22
+ # pp mail.parts.map { |p| p.class } #=> [Mail::Message, Mail::Message]
23
+ # pp mail.parts[0].content_type_parameters #=> {'charset' => 'ISO-8859-1'}
24
+ # pp mail.parts[1].content_type_parameters #=> {'name' => 'my.pdf'}
25
+
26
+ # mail_type = email.header["X-mail-type"].value
27
+ # record = create! :recipient => email.to.join(","), :mail_type => mail_type
28
+ # email.encoded # kick email to set content_transfer_encoding
29
+ # # The new body needs to be already encoded, as Mail expects the body to be encoded already (after calling #encoded)
30
+ # encoding = Mail::Encodings.get_encoding email.content_transfer_encoding
31
+ # new_body = encoding.encode email.body.to_s.sub("/t/id.gif", "/t/#{record.open_token}.gif")
32
+ # email.body(new_body)
33
+ #
34
+ # record.update_attributes! :body => email.body.to_s, :raw_text => email.encoded
35
+ end
36
+ end
@@ -0,0 +1,70 @@
1
+ class MailEngine::MailSchedule < ActiveRecord::Base
2
+ validates_presence_of :name, :user_group, :mail_template_id, :period, :count, :first_send_at
3
+ belongs_to :mail_template
4
+
5
+ scope :available, where("sent_count < count OR count = 0")
6
+
7
+ def load_payload user
8
+ payload_hash = {}
9
+ self.payload.split(",").each do |col|
10
+ payload_hash[col] = user.send(col)
11
+ end
12
+ payload_hash
13
+ end
14
+
15
+ def send_test_mail_to!(recipient)
16
+ # raise "Wrong email format." if recipient.blank? or recipient !~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
17
+ sample_user = User.send(self.user_group.to_sym).first
18
+ raise "Can not find any user in group #{self.user_group}" if sample_user.blank?
19
+
20
+ I18n.with_locale(mail_template.locale) do
21
+ MailEngine::MailDispatcher.send(
22
+ mail_template.template_name.to_sym,
23
+ :to => recipient,
24
+ :values => self.load_payload(sample_user)
25
+ ).deliver
26
+ end
27
+ end
28
+
29
+ # If execute sendmail twice very soon(within 14 minutes), it should not be able to send mail again.
30
+ def ready_to_send?
31
+ # check if send count reached the total count.
32
+ return false if (sent_count >= count and count != 0)
33
+ # only send once.
34
+ return sent_count < 1 if period == 'once'
35
+
36
+ # why 15 minutes? for tolerance.
37
+ not_sent_mail_within_15_minutes = last_sent_at.nil? || ((Time.now.to_i - last_sent_at.to_i).abs >= 60*15)
38
+ ready_to_send = not_sent_mail_within_15_minutes and (Time.now.to_i - first_send_at.to_i).abs < 60*15
39
+ result_by_period = case period
40
+ when 'daily'
41
+ 1.days.ago.to_i <= last_sent_at.to_i
42
+ when 'weekly'
43
+ 1.week.ago.to_i <= last_sent_at.to_i
44
+ when 'monthly'
45
+ 1.month.ago.to_i <= last_sent_at.to_i
46
+ else
47
+ false
48
+ end
49
+
50
+ ready_to_send or (not_sent_mail_within_15_minutes and result_by_period)
51
+ end
52
+
53
+ def sendmail
54
+ puts "---> Schedule: '#{self.name}'"
55
+
56
+ unless ready_to_send?
57
+ puts "---> not ready"
58
+ return false
59
+ end
60
+
61
+ User.send(self.user_group.to_sym).each do |user|
62
+ puts "-> sending mail to #{user.email}"
63
+ MailEngine::MailDispatcher.send(mail_template.template_name.to_sym, :to => user.email, :values => self.load_payload(user) ).deliver
64
+ end
65
+
66
+ self.last_sent_at = Time.now
67
+ self.sent_count += 1
68
+ self.save
69
+ end
70
+ end