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,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