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,104 @@
1
+ ### override mail method
2
+ module ActionMailer
3
+ class Base
4
+ alias_method :origin_mail, :mail
5
+ def mail(headers={}, &block)
6
+ headers[:message_id] = "#{controller_path}/#{action_name}"
7
+ # Add sendgrid header before sending mail.
8
+ # Why here but not add to default_params of action_mailer? because the receiver email [:to] only can get here.
9
+ if self.sendgrid_config
10
+ self.sendgrid_config.add_to headers[:to]
11
+ origin_mail(headers.merge(self.sendgrid_config.to_hash), &block)
12
+ else
13
+ origin_mail(headers, &block)
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ ###
20
+ # REASON TO OVERRIDE THIS METHOD:
21
+ # need to set layout and pass partial path to each format of mail template.
22
+ #
23
+ # Completed copied from lib/action_mailer/base.rb#665
24
+ # but used revisioned ActionMailer::Collector
25
+ def collect_responses_and_parts_order(headers) #:nodoc:
26
+ responses, parts_order = [], nil
27
+
28
+ if block_given?
29
+ ### modified this like, it's very strange when use resolver.is_a?(MailEngine::MailTemplate::Resolver) it will give false sometime.
30
+ if lookup_context.view_paths.detect {|resolver| resolver.class.to_s == "MailEngine::MailTemplate::Resolver" }
31
+ collector = ActionMailer::Collector.new(lookup_context) { |mime| set_layout_and_partials(mime) }
32
+ else
33
+ collector = ActionMailer::Collector.new(lookup_context) { render(action_name) }
34
+ end
35
+ ######################################################################################
36
+
37
+ yield(collector)
38
+ responses = collector.responses
39
+ elsif headers[:body]
40
+ responses << {
41
+ :body => headers.delete(:body),
42
+ :content_type => self.class.default[:content_type] || "text/plain"
43
+ }
44
+ else
45
+ templates_path = headers.delete(:template_path) || self.class.mailer_name
46
+ templates_name = headers.delete(:template_name) || action_name
47
+
48
+ each_template(templates_path, templates_name) do |template|
49
+ self.formats = template.formats
50
+
51
+ responses << {
52
+ :body => render(:template => template),
53
+ :content_type => template.mime_type.to_s
54
+ }
55
+ end
56
+ end
57
+
58
+ [responses, parts_order]
59
+ end
60
+
61
+
62
+ # set layout and partials
63
+ def set_layout_and_partials(format)
64
+ template = MailEngine::MailTemplate.where(:path => "#{controller_path}/#{action_name}", :format => format, :locale => I18n.locale, :partial => false, :for_marketing => false).first
65
+ template = MailEngine::MailTemplate.where(:path => action_name, :format => format, :locale => I18n.locale, :partial => false, :for_marketing => true).first if template.blank?
66
+
67
+ # if found db template set the layout and partial for it.
68
+ if template
69
+ related_partial_paths = {}
70
+ # set @footer or @header
71
+ template.template_partials.each do |tmp|
72
+ related_partial_paths["#{tmp.placeholder_name}_path".to_sym] = tmp.partial.path
73
+ end
74
+
75
+ # set layout
76
+ render :template => "#{controller_path}/#{action_name}", :layout => "layouts/mail_engine/mail_template_layouts/#{template.layout}", :locals => related_partial_paths
77
+ else
78
+ # if not found db template should render file template
79
+ render(action_name)
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ ###
86
+ # REASON TO OVERRIDE THIS METHOD:
87
+ # pass mime format to renderrer
88
+ #
89
+ # One concern if user provided block, there will be problem. like:
90
+ # format.text { xxxx; render 'xxx' }
91
+ #
92
+ module ActionMailer
93
+ class Collector
94
+ def custom(mime, options={})
95
+ options.reverse_merge!(:content_type => mime.to_s)
96
+ @context.freeze_formats([mime.to_sym])
97
+ ### modified this line
98
+ # change from:
99
+ # options[:body] = block_given? ? yield : @default_render.call
100
+ options[:body] = block_given? ? yield : @default_render.call(mime.to_sym)
101
+ @responses << options
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,22 @@
1
+ require 'active_support/concern'
2
+
3
+ module MailEngine
4
+ module ActsAsMailReceiver
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ cattr_accessor :payload_columns
9
+ cattr_accessor :groups
10
+ end
11
+
12
+ module ClassMethods
13
+ def acts_as_mail_receiver(options)
14
+ self.payload_columns = options[:payload_columns]
15
+ self.groups = options[:groups]
16
+ end
17
+ end
18
+
19
+ # module InstanceMethods
20
+ # end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module MailEngine
2
+ class Base
3
+ cattr_accessor :configurations, :instance_writer => false
4
+ @@configurations = HashWithIndifferentAccess.new
5
+
6
+ class << self
7
+ def current_config
8
+ MailEngine::Base.configurations[Rails.env]
9
+ end
10
+
11
+ ### send mail template with given data.
12
+ # MailEngine::Base.send_mail("gogogo", :to => 'm@theplant.jp', :values => {:users => User.last})
13
+ def send_mail(template, *args)
14
+ options = args.extract_options!
15
+ raise "Should specify :to option" if options[:to].blank?
16
+
17
+ # find if the template was stored in database.
18
+ template_path = File.join("mail_engine", "mail_dispatcher", template)
19
+ raise "Can't find the template: #{template_path}" unless mail_template = MailEngine::MailTemplate.where(:path => template_path).first
20
+
21
+ options[:subject] = mail_template.name
22
+ MailEngine::MailDispatcher.send(template, options).deliver
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ module MailEngine
2
+ class Configuration
3
+ class << self
4
+ def load
5
+ require 'erb'
6
+ config_path = File.join(Rails.root, "config", "mail_engine_config.yml")
7
+ MailEngine::Base.configurations = YAML::load(ERB.new(IO.read(config_path)).result)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,42 @@
1
+ module MailEngine
2
+ class Engine < Rails::Engine
3
+ require 'mail_engine'
4
+
5
+ initializer "mail_engine" do
6
+ ActionMailer::Base.send(:include, MailEngine::Sendgrid::Base)
7
+ require 'mail_engine/action_mailer_patch'
8
+ end
9
+
10
+ initializer "mail_engine.register_liquid_template" do
11
+ require 'liquid'
12
+ require 'extras/liquid_view'
13
+ ActionView::Template.register_template_handler(:liquid, LiquidView)
14
+ end
15
+
16
+ initializer "mail_engine.register_database_template" do
17
+ ActionMailer::Base.layout "layouts/mail_engine/mail_template_layouts/none"
18
+ ActionMailer::Base.send(:prepend_view_path, MailEngine::MailTemplate::Resolver.instance)
19
+ end
20
+
21
+ initializer "mail_engine.add_acts_as_mail_receiver" do
22
+ ActiveRecord::Base.send(:include, MailEngine::ActsAsMailReceiver)
23
+ end
24
+
25
+ # initializer "mail_engine.register_mail_log" do
26
+ # ActionMailer::Base.register_interceptor MailEngine::MailLog
27
+ # end
28
+
29
+ rake_tasks do
30
+ load "mail_engine/tasks/sendmail.rake"
31
+ end
32
+
33
+ generators do
34
+ require 'mail_engine/generators/create_config.rb'
35
+ require 'mail_engine/generators/create_migration.rb'
36
+ end
37
+
38
+ config.to_prepare do
39
+ MailEngine::Configuration.load
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,20 @@
1
+ module MailEngine
2
+ class CreateConfig < Rails::Generators::Base
3
+ desc "Add mail template config file."
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ # def generate_config
7
+ # case backend_type
8
+ # when "amazon"
9
+ # when "sendgrid"
10
+ # when "sendmail"
11
+ # when "smtp"
12
+ # else
13
+ # end
14
+ # end
15
+
16
+ def create_config_file
17
+ template "mail_engine_config.yml", "config/mail_engine_config.yml"
18
+ end
19
+ end
20
+ end # MailEngine
@@ -0,0 +1,20 @@
1
+ module MailEngine
2
+ class CreateMigration < Rails::Generators::Base
3
+ desc "Add mail template model migration to your application."
4
+ source_root File.join(File.dirname(__FILE__))
5
+
6
+ def create_migrations
7
+ [
8
+ "20110114030841_create_table_mail_template",
9
+ "20110126030525_create_mail_schedules",
10
+ "20110204114145_create_template_partials",
11
+ "20110206025002_create_mail_logs",
12
+ "20110217062316_create_mail_template_files"
13
+ ].each do |filename|
14
+ from = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "db", "migrate", "#{filename}.rb"))
15
+ to = File.expand_path(File.join(Rails.root, "db", "migrate", "#{filename}.rb"))
16
+ copy_file from, to
17
+ end
18
+ end
19
+ end # CreateMigration
20
+ end
@@ -0,0 +1,14 @@
1
+ development:
2
+ log_mail: false
3
+ sendgrid_user: "you send grid username"
4
+ sendgrid_key: "password"
5
+
6
+ test:
7
+ log_mail: false
8
+ sendgrid_user: "you send grid username"
9
+ sendgrid_key: "password"
10
+
11
+ production:
12
+ log_mail: false
13
+ sendgrid_user: "you send grid username"
14
+ sendgrid_key: "password"
@@ -0,0 +1,86 @@
1
+ module MailEngine
2
+ class HtmlDocumentAssetsReplacer
3
+
4
+ class << self
5
+ def check! file_paths
6
+ html_file_pathes = file_paths.select { |path| path =~ /\/[^_\/]+\.htm(l)?$/i }
7
+ raise "No html was passed in." if html_file_pathes.blank?
8
+ raise "Please only include one html file in the zip file." if html_file_pathes.size > 1
9
+ html_file_pathes.first
10
+ end
11
+
12
+ # MailEngine::HtmlDocumentAssetsReplacer.process(mail_template, file_paths)
13
+ def process mail_template, file_paths, hostname
14
+ raise "Host should not include http://" if hostname =~ /^http:\/\//i
15
+
16
+ # check if there is a html file
17
+ html_file_path = check! file_paths
18
+
19
+ # persist files into databases.
20
+ other_file_paths = file_paths - Array.wrap(html_file_path)
21
+ stored_file_objects = other_file_paths.map do |path|
22
+ f = File.open(path)
23
+ mail_template.mail_template_files.create :file => f, :size => File.size(f)
24
+ end
25
+
26
+ ### replace images and csses from the html document.
27
+ # possible will use this in the future to take care of encoding problem:
28
+ # doc = Nokogiri.XML('<foo><bar/><foo>', nil, 'EUC-JP')
29
+ doc = Nokogiri::HTML(File.read(html_file_path))
30
+
31
+ doc.css('img, link').each do |element|
32
+ # FIXME seems will have the problem if have duplicated filename in different dir
33
+ case
34
+ when element.name == "link" && substitution_object = stored_file_objects.detect { |file_object| file_object.attributes["file"] == File.basename(element['href']) }
35
+ element['href'] = "http://#{File.join(hostname, substitution_object.file.url)}"
36
+ when element.name == "img" && substitution_object = stored_file_objects.detect { |file_object| file_object.attributes["file"] == File.basename(element['src']) }
37
+ element['src'] = "http://#{File.join(hostname, substitution_object.file.url)}"
38
+ end
39
+ end
40
+
41
+ doc.to_html
42
+ end
43
+
44
+ def replace_resource_filename_in_html html, original_filename, new_filename
45
+ return false if original_filename.blank? or new_filename.blank?
46
+
47
+ doc = Nokogiri::HTML(html)
48
+
49
+ doc.css('img, link').each do |element|
50
+ # FIXME seems will have the problem if have duplicated filename in different dir
51
+ next if element.name == "link" && element['href'].blank?
52
+ next if element.name == "img" && element['src'].blank?
53
+
54
+ case
55
+ when element.name == "link" && File.basename(element['href']) == original_filename
56
+ element['href'] = element['href'].sub(original_filename, new_filename)
57
+ when element.name == "img" && File.basename(element['src']) == original_filename
58
+ element['src'] = element['src'].sub(original_filename, new_filename)
59
+ end
60
+ end
61
+
62
+ doc.to_html
63
+ end
64
+
65
+ def replace_resource_url_in_html html, original_file_url, new_file_url
66
+ return false if original_file_url.blank? or new_file_url.blank?
67
+ doc = Nokogiri::HTML(html)
68
+
69
+ doc.css('img, link').each do |element|
70
+ # FIXME seems will have the problem if have duplicated filename in different dir
71
+ next if element.name == "link" && element['href'].blank?
72
+ next if element.name == "img" && element['src'].blank?
73
+
74
+ case
75
+ when element.name == "link" && element['href'].include?(original_file_url)
76
+ element['href'] = element['href'].sub(original_file_url, new_file_url)
77
+ when element.name == "img" && element['src'].include?(original_file_url)
78
+ element['src'] = element['src'].sub(original_file_url, new_file_url)
79
+ end
80
+ end
81
+
82
+ doc.to_html
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,30 @@
1
+ # {
2
+ # :mailer=>"UserMailer",
3
+ # :subject=>"Notify",
4
+ # :date=>nil,
5
+ # :message_id=>nil,
6
+ # :mail=>
7
+ # "Date: Sun, 06 Feb 2011 11:11:54 +0800\r\nFrom: info@itjob.fm\r\nTo: m@theplant.jp\r\nMessage-ID: <4d4e117a766f9_13db981b0456013966@localhost.mail>\r\nSubject: Notify\r\nMime-Version: 1.0\r\nContent-Type: text/plain;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: 7bit\r\nX-SMTPAPI: {\"category\": \"itjob\", \"to\": [\"m@theplant.jp\"], \"filters\":\r\n {\"opentrack\": {\"settings\": {\"enable\":1}}, \"clicktrack\": {\"settings\":\r\n {\"enable\":1}}, \"template\": {\"settings\": {\"enable\":0}}, \"footer\": {\"settings\":\r\n {\"enable\":0}}, \"subscriptiontrack\": {\"settings\": {\"text/html\": \"Unsubscribe\r\n link.html\", \"landing\": \"http://landing.com\", \"url\": \"http://url.com\",\r\n \"enable\":1,\"text/plain\": \"Unsubscribe link.txt\"}}}}\r\n\r\n",
8
+ # :to=>["m@theplant.jp"],
9
+ # :from=>["info@itjob.fm"]
10
+ # }
11
+
12
+ module MailEngine
13
+ class MailLogSubscriber < ActiveSupport::LogSubscriber
14
+ def deliver(event)
15
+ log_mail_config = MailEngine::Base.current_config["log_mail"]
16
+ return false if log_mail_config.blank? or !log_mail_config
17
+
18
+ MailEngine::MailLog.create!({
19
+ :mail_template_path => event.payload[:message_id],
20
+ :subject => event.payload[:subject],
21
+ :raw_body => event.payload[:mail],
22
+ :recipient => event.payload[:to].inspect,
23
+ :sender => event.payload[:from].inspect,
24
+ :mime_type => event.payload[:mail].scan(/Content-Type: ([^;\r\n]*)/).flatten.inspect
25
+ })
26
+ end
27
+ end
28
+ end
29
+
30
+ MailEngine::MailLogSubscriber.attach_to :action_mailer
@@ -0,0 +1,5 @@
1
+ PLACEHOLDERS_IN_LAYOUT = {
2
+ :none => [],
3
+ :only_footer => ['footer'],
4
+ :header_and_footer => ['header', 'footer']
5
+ }
@@ -0,0 +1,45 @@
1
+ # ### Usage
2
+ # class UserMailer < SendgridMailer
3
+ # sendgrid_header do
4
+ # category "itjob"
5
+ #
6
+ # filters {
7
+ # opentrack "enable" => 1
8
+ # clicktrack "enable" => 1
9
+ # gravatar "enable" => 1
10
+ # template "enable" => 1, "text/html" => "<p>Thanks for your subscription.</p>"
11
+ # footer "enable" => 1, "text/plain" => "Thanks for your subscription.", "text/html" => "<p>Thanks for your subscription.</p>"
12
+ # }
13
+ # end
14
+ #
15
+ # def notification(user)
16
+ # mail :to => "x@x.com" do |format|
17
+ # format.text
18
+ # format.html_from_db
19
+ # end
20
+ # end
21
+ # end
22
+
23
+ require 'active_support/concern'
24
+
25
+ module MailEngine
26
+ module Sendgrid
27
+ module Base
28
+ extend ActiveSupport::Concern
29
+
30
+ included do
31
+ cattr_accessor :sendgrid_config
32
+ end
33
+
34
+ module ClassMethods
35
+ def sendgrid_header(&block)
36
+ self.sendgrid_config = SmtpApi.new
37
+ self.sendgrid_config.instance_eval(&block)
38
+ end
39
+ end
40
+
41
+ module InstanceMethods
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,85 @@
1
+ require 'httparty'
2
+
3
+ ### Usage
4
+ # MailEngine::Sendgrid::RestApi.stats
5
+ module MailEngine
6
+ module Sendgrid
7
+ class RestApiError < StandardError; end
8
+
9
+ class RestApi
10
+ include HTTParty
11
+ base_uri "https://sendgrid.com/api"
12
+ default_params :api_key => MailEngine::Base.current_config["sendgrid_key"], :api_user => MailEngine::Base.current_config["sendgrid_user"]
13
+
14
+ class << self
15
+ # <stats>
16
+ # <day>
17
+ # <date>2009-06-20</date>
18
+ # <requests>12342</requests>
19
+ # <bounces>12</bounces>
20
+ # <clicks>10223</clicks>
21
+ # <opens>9992</opens>
22
+ # <spamreports>5</spamreports>
23
+ # <unique_clicks>3</unique_clicks>
24
+ # <unique_opens>6</unique_opens>
25
+ # <blocked>7</blocked>
26
+ # </day>
27
+ # </stats>
28
+ def stats options = {}
29
+ response = get "/stats.get.xml", :query => options
30
+ response["stats"].try(:send, :[], "day")
31
+ end
32
+
33
+ # <bounces>
34
+ # <bounce>
35
+ # <email>email1@domain.com</email>
36
+ # <status>5.1.1</status>
37
+ # <reason>host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com</reason>
38
+ # <created>2009-06-10 12:40:30</created>
39
+ # </bounce>
40
+ # </bounces>
41
+ def bounces options = {}
42
+ response = get "/bounces.get.xml", :query => options
43
+ response["bounces"].try(:send, :[], "bounce")
44
+ end
45
+
46
+ # <spamreports>
47
+ # <spamreport>
48
+ # <email>email1@domain.com</email>
49
+ # <created>2009-06-10 12:40:30</created>
50
+ # </spamreport>
51
+ # </spamreports>
52
+ def spamreports options = {}
53
+ response = get "/spamreports.get.xml", :query => options
54
+ response["spamreports"].try(:send, :[], "spamreport")
55
+ end
56
+
57
+ # <invalidemails>
58
+ # <invalidemail>
59
+ # <email>isaac@hotmail.comm</email>
60
+ # <reason>Mail domain mentioned in email address is unknown</reason>
61
+ # <created>2009-06-10 12:40:30</created>
62
+ # </invalidemail>
63
+ # </invalidemails>
64
+ def invalidemails options = {}
65
+ response = get "/invalidemails.get.xml", :query => options
66
+ response["invalidemails"].try(:send, :[], "invalidemail")
67
+ end
68
+
69
+ # <blocks>
70
+ # <block>
71
+ # <email>exp_block_0466@sendgrid.com</email>
72
+ # <status></status>
73
+ # <reason>Some random block reason</reason>
74
+ # <created>2010-11-08 20:39:29</created>
75
+ # </block>
76
+ # </blocks>
77
+ def blocks options = {}
78
+ response = get "/blocks.get.xml", :query => options
79
+ response["blocks"].try(:send, :[], "block")
80
+ end
81
+
82
+ end
83
+ end # end of rest api class
84
+ end # end of sendgrid module
85
+ end # end of mail engine module
@@ -0,0 +1,85 @@
1
+ require 'json'
2
+
3
+ module MailEngine
4
+ module Sendgrid
5
+ class FilterSetting
6
+ attr_accessor :data
7
+
8
+ def initialize
9
+ @data = {}
10
+ end
11
+
12
+ ### Please check API: http://sendgrid.com/documentation/apps
13
+ #
14
+ # sendgrid_header do
15
+ # category "itjob"
16
+ #
17
+ # filters {
18
+ # opentrack "enable" => 1
19
+ # clicktrack "enable" => 1
20
+ # subscriptiontrack "enable" => 1, "text/html" => "Unsubscribe link.html", "text/plain" => "Unsubscribe link.txt", "url" => "http://url.com", "landing" => "http://landing.com"
21
+ # template "enable" => 1, "text/html" => "<p>Thanks for your subscription.</p>"
22
+ # footer "enable" => 1, "text/plain" => "Thanks for your subscription.", "text/html" => "<p>Thanks for your subscription.</p>"
23
+ # }
24
+ # end
25
+ #
26
+ %w(opentrack clicktrack subscriptiontrack footer spamcheck ganalytics template bcc list domainkeys).each do |method_name|
27
+ define_method method_name do |config_hash|
28
+ validate_config! method_name, config_hash
29
+ @data[method_name] ||= {}
30
+ @data[method_name]["settings"] = config_hash
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def validate_config!(name, config_hash)
37
+ raise "'#{name}' Config should be a hash value." unless config_hash.is_a?(Hash)
38
+ end
39
+ end
40
+
41
+ ### smtp api class
42
+ class SmtpApi
43
+ def initialize()
44
+ @data = {}
45
+ end
46
+
47
+ def category(cat)
48
+ @data['category'] = cat
49
+ end
50
+
51
+ def filters(&block)
52
+ filter_setting = FilterSetting.new
53
+ filter_setting.instance_eval(&block)
54
+ @data["filters"] = filter_setting.data
55
+ end
56
+
57
+ def add_to(to)
58
+ @data['to'] ||= []
59
+ @data['to'] += to.kind_of?(Array) ? to : [to]
60
+ @data['to'].uniq!
61
+ end
62
+
63
+ def add_sub_val(var, val)
64
+ @data['sub'] ||= {}
65
+ @data['sub'][var] = val.instance_of?(Array) ? var : [var]
66
+ end
67
+
68
+ def set_unique_args(val)
69
+ @data['unique_args'] = val if val.instance_of?(Hash)
70
+ end
71
+
72
+ def to_json
73
+ @data.to_json.gsub(/(["\]}])([,:])(["\[{])/, '\\1\\2 \\3')
74
+ end
75
+
76
+ def to_hash
77
+ {'X-SMTPAPI' => self.to_json}
78
+ end
79
+
80
+ def to_s
81
+ 'X-SMTPAPI: %s' % self.to_json
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,9 @@
1
+ module MailEngine
2
+ module Sendgrid
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :Base
6
+ autoload :SmtpApi
7
+ autoload :RestApi
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ namespace :mail_engine do
2
+ desc "Check mail schedule table and send the scheduled mail."
3
+ task :sendmail => :environment do
4
+ puts "==== Start sending scheduled mail ===="
5
+ MailEngine::MailSchedule.all.each { |schedule| schedule.sendmail }
6
+ puts "==== End sending scheduled mail ===="
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module MailEngine
2
+ VERSION = "0.0.1"
3
+ end