mail_engine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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