mail_engine 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardoc/checksums +17 -0
- data/.yardoc/objects/ActionMailer/Base/collect_responses_and_parts_order_i.dat +0 -0
- data/.yardoc/objects/ActionMailer/Base/mail_i.dat +0 -0
- data/.yardoc/objects/ActionMailer/Base/origin_mail_i.dat +0 -0
- data/.yardoc/objects/ActionMailer/Base/set_layout_and_partials_i.dat +0 -0
- data/.yardoc/objects/ActionMailer/Base.dat +0 -0
- data/.yardoc/objects/ActionMailer/Collector/custom_i.dat +0 -0
- data/.yardoc/objects/ActionMailer/Collector.dat +0 -0
- data/.yardoc/objects/ActionMailer.dat +0 -0
- data/.yardoc/objects/MailEngine/ActsAsMailReceiver/ClassMethods/acts_as_mail_receiver_i.dat +0 -0
- data/.yardoc/objects/MailEngine/ActsAsMailReceiver/ClassMethods.dat +0 -0
- data/.yardoc/objects/MailEngine/ActsAsMailReceiver.dat +0 -0
- data/.yardoc/objects/MailEngine/Base/_40_40configurations.dat +0 -0
- data/.yardoc/objects/MailEngine/Base/current_config_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Base/send_mail_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Base.dat +0 -0
- data/.yardoc/objects/MailEngine/Configuration/load_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Configuration.dat +0 -0
- data/.yardoc/objects/MailEngine/CreateConfig/create_config_file_i.dat +0 -0
- data/.yardoc/objects/MailEngine/CreateConfig.dat +0 -0
- data/.yardoc/objects/MailEngine/CreateMigration/create_migrations_i.dat +0 -0
- data/.yardoc/objects/MailEngine/CreateMigration.dat +0 -0
- data/.yardoc/objects/MailEngine/Engine.dat +0 -0
- data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/check_21_c.dat +0 -0
- data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/process_c.dat +0 -0
- data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/replace_resource_filename_in_html_c.dat +0 -0
- data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer/replace_resource_url_in_html_c.dat +0 -0
- data/.yardoc/objects/MailEngine/HtmlDocumentAssetsReplacer.dat +0 -0
- data/.yardoc/objects/MailEngine/MailLogSubscriber/deliver_i.dat +0 -0
- data/.yardoc/objects/MailEngine/MailLogSubscriber.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/Base/ClassMethods/sendgrid_header_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/Base/ClassMethods.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/Base/InstanceMethods.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/Base.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/data_3D_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/data_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/initialize_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting/validate_config_21_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/FilterSetting.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApi/blocks_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApi/bounces_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApi/invalidemails_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApi/spamreports_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApi/stats_c.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApi.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/RestApiError.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/add_sub_val_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/add_to_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/category_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/filters_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/initialize_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/set_unique_args_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/to_hash_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/to_json_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi/to_s_i.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid/SmtpApi.dat +0 -0
- data/.yardoc/objects/MailEngine/Sendgrid.dat +0 -0
- data/.yardoc/objects/MailEngine/VERSION.dat +0 -0
- data/.yardoc/objects/MailEngine/ZipProcessor/extract_all_files_c.dat +0 -0
- data/.yardoc/objects/MailEngine/ZipProcessor.dat +0 -0
- data/.yardoc/objects/MailEngine.dat +0 -0
- data/.yardoc/objects/PLACEHOLDERS_IN_LAYOUT.dat +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/.yardoc/proxy_types +0 -0
- data/Gemfile +36 -0
- data/Gemfile.lock +159 -0
- data/MIT-LICENSE +20 -0
- data/README.mkd +152 -0
- data/Rakefile +57 -0
- data/VERSION +1 -0
- data/app/controllers/mail_engine/application_controller.rb +7 -0
- data/app/controllers/mail_engine/dashboard_controller.rb +9 -0
- data/app/controllers/mail_engine/mail_logs_controller.rb +20 -0
- data/app/controllers/mail_engine/mail_schedules_controller.rb +56 -0
- data/app/controllers/mail_engine/mail_template_files_controller.rb +46 -0
- data/app/controllers/mail_engine/mail_templates_controller.rb +141 -0
- data/app/controllers/mail_engine/reports_controller.rb +34 -0
- data/app/helpers/mail_engine/mail_engine_helper.rb +30 -0
- data/app/mailers/mail_engine/mail_dispatcher.rb +59 -0
- data/app/models/mail_engine/mail_log.rb +36 -0
- data/app/models/mail_engine/mail_schedule.rb +70 -0
- data/app/models/mail_engine/mail_template.rb +270 -0
- data/app/models/mail_engine/mail_template_file.rb +31 -0
- data/app/models/mail_engine/template_partial.rb +9 -0
- data/app/uploaders/mail_engine/template_file_uploader.rb +47 -0
- data/app/uploaders/mail_engine/zip_file_uploader.rb +47 -0
- data/app/views/layouts/mail_engine/mail_engine.html.erb +112 -0
- data/app/views/layouts/mail_engine/mail_template_layouts/header_and_footer.html.erb +10 -0
- data/app/views/layouts/mail_engine/mail_template_layouts/header_and_footer.text.erb +3 -0
- data/app/views/layouts/mail_engine/mail_template_layouts/none.html.erb +8 -0
- data/app/views/layouts/mail_engine/mail_template_layouts/none.text.erb +1 -0
- data/app/views/layouts/mail_engine/mail_template_layouts/only_footer.html.erb +9 -0
- data/app/views/layouts/mail_engine/mail_template_layouts/only_footer.text.erb +2 -0
- data/app/views/mail_engine/dashboard/index.html.erb +64 -0
- data/app/views/mail_engine/mail_logs/index.html.erb +34 -0
- data/app/views/mail_engine/mail_logs/show.html.erb +38 -0
- data/app/views/mail_engine/mail_schedules/_form.html.erb +45 -0
- data/app/views/mail_engine/mail_schedules/edit.html.erb +16 -0
- data/app/views/mail_engine/mail_schedules/index.html.erb +50 -0
- data/app/views/mail_engine/mail_schedules/new.html.erb +13 -0
- data/app/views/mail_engine/mail_schedules/show.html.erb +44 -0
- data/app/views/mail_engine/mail_template_files/_form.html.erb +28 -0
- data/app/views/mail_engine/mail_template_files/edit.html.erb +9 -0
- data/app/views/mail_engine/mail_template_files/new.html.erb +9 -0
- data/app/views/mail_engine/mail_templates/_form.html.erb +97 -0
- data/app/views/mail_engine/mail_templates/_layout_selector.html.erb +50 -0
- data/app/views/mail_engine/mail_templates/duplicate.html.erb +41 -0
- data/app/views/mail_engine/mail_templates/edit.html.erb +16 -0
- data/app/views/mail_engine/mail_templates/index.html.erb +69 -0
- data/app/views/mail_engine/mail_templates/new.html.erb +12 -0
- data/app/views/mail_engine/mail_templates/new_by_upload.html.erb +63 -0
- data/app/views/mail_engine/mail_templates/partial_options.html.erb +28 -0
- data/app/views/mail_engine/mail_templates/preview.html.erb +1 -0
- data/app/views/mail_engine/mail_templates/preview.text.erb +1 -0
- data/app/views/mail_engine/mail_templates/show.html.erb +64 -0
- data/app/views/mail_engine/reports/charts/blocks.html.erb +21 -0
- data/app/views/mail_engine/reports/charts/bounces.html.erb +21 -0
- data/app/views/mail_engine/reports/charts/invalidemails.html.erb +19 -0
- data/app/views/mail_engine/reports/charts/spamreports.html.erb +17 -0
- data/app/views/mail_engine/reports/index.html.erb +67 -0
- data/config/routes.rb +48 -0
- data/db/migrate/20110114030841_create_table_mail_template.rb +22 -0
- data/db/migrate/20110126030525_create_mail_schedules.rb +21 -0
- data/db/migrate/20110204114145_create_template_partials.rb +13 -0
- data/db/migrate/20110206025002_create_mail_logs.rb +17 -0
- data/db/migrate/20110217062316_create_mail_template_files.rb +14 -0
- data/doc/_index.html +322 -0
- data/doc/class_list.html +36 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +53 -0
- data/doc/css/style.css +310 -0
- data/doc/file_list.html +38 -0
- data/doc/frames.html +13 -0
- data/doc/js/app.js +203 -0
- data/doc/js/full_list.js +149 -0
- data/doc/js/jquery.js +154 -0
- data/doc/method_list.html +283 -0
- data/lib/mail_engine/action_mailer_patch.rb +104 -0
- data/lib/mail_engine/acts_as_mail_receiver.rb +22 -0
- data/lib/mail_engine/base.rb +26 -0
- data/lib/mail_engine/configuration.rb +11 -0
- data/lib/mail_engine/engine.rb +42 -0
- data/lib/mail_engine/generators/create_config.rb +20 -0
- data/lib/mail_engine/generators/create_migration.rb +20 -0
- data/lib/mail_engine/generators/templates/mail_engine_config.yml +14 -0
- data/lib/mail_engine/html_document_assets_replacer.rb +86 -0
- data/lib/mail_engine/mail_log_subscriber.rb +30 -0
- data/lib/mail_engine/placeholders_in_layout.rb +5 -0
- data/lib/mail_engine/sendgrid/base.rb +45 -0
- data/lib/mail_engine/sendgrid/rest_api.rb +85 -0
- data/lib/mail_engine/sendgrid/smtp_api.rb +85 -0
- data/lib/mail_engine/sendgrid.rb +9 -0
- data/lib/mail_engine/tasks/sendmail.rake +8 -0
- data/lib/mail_engine/version.rb +3 -0
- data/lib/mail_engine/zip_processor.rb +51 -0
- data/lib/mail_engine.rb +17 -0
- data/mail_engine.gemspec +422 -0
- data/screenshots/bounce_report.png +0 -0
- data/screenshots/dashboard.png +0 -0
- data/screenshots/editing_mail_template.png +0 -0
- data/screenshots/logs.png +0 -0
- data/screenshots/new_by_upload.png +0 -0
- data/screenshots/reports.png +0 -0
- data/screenshots/schedule.png +0 -0
- data/screenshots/select_layout_partial.png +0 -0
- data/screenshots/templates.png +0 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/controllers/application_controller.rb +11 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/user_mailer.rb +36 -0
- data/test/dummy/app/models/user.rb +10 -0
- data/test/dummy/config/application.rb +52 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +52 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +47 -0
- data/test/dummy/config/environments/production.rb +49 -0
- data/test/dummy/config/environments/test.rb +43 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/locales/zh.yml +2 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20110114030841_create_table_mail_template.rb +22 -0
- data/test/dummy/db/migrate/20110125094530_create_users.rb +16 -0
- data/test/dummy/db/migrate/20110126030525_create_mail_schedules.rb +21 -0
- data/test/dummy/db/migrate/20110204114145_create_template_partials.rb +13 -0
- data/test/dummy/db/migrate/20110206025002_create_mail_logs.rb +17 -0
- data/test/dummy/db/migrate/20110217062316_create_mail_template_files.rb +14 -0
- data/test/dummy/db/schema.rb +78 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/images/mail_engine/header_and_footer_layout.png +0 -0
- data/test/dummy/public/images/mail_engine/logo.gif +0 -0
- data/test/dummy/public/images/mail_engine/logo.png +0 -0
- data/test/dummy/public/images/mail_engine/none_layout.png +0 -0
- data/test/dummy/public/images/mail_engine/only_footer_layout.png +0 -0
- data/test/dummy/public/images/mail_engine/unselect_header_and_footer_layout.png +0 -0
- data/test/dummy/public/images/mail_engine/unselect_none_layout.png +0 -0
- data/test/dummy/public/images/mail_engine/unselect_only_footer_layout.png +0 -0
- data/test/dummy/public/javascripts/jquery.iframe-auto-height.plugin.js +50 -0
- data/test/dummy/public/javascripts/jquery.js +16 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/img/ajaxLoader.gif +0 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/img/close.gif +0 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/img/next.gif +0 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/img/prev.gif +0 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal-ie6.js +186 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal-ie6.min.js +9 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal.custom.js +1599 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/js/jquery.nyroModal.custom.min.js +34 -0
- data/test/dummy/public/javascripts/jquery.nyroModal/styles/nyroModal.css +102 -0
- data/test/dummy/public/javascripts/jquery.string.js +425 -0
- data/test/dummy/public/javascripts/mail_engine_application.js +2 -0
- data/test/dummy/public/javascripts/markitup/jquery.markitup.js +564 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/bold.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/css.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/italic.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/picture.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/stroke.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/tag.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_center.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_justify.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_left.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_align_right.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_indent.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_letterspacing.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_linespacing.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_lowercase.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_bottom.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_left.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_right.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_padding_top.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/images/text_uppercase.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/css/readme.txt +28 -0
- data/test/dummy/public/javascripts/markitup/sets/css/set.js +52 -0
- data/test/dummy/public/javascripts/markitup/sets/css/style.css +72 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/bold.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/clean.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/image.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/italic.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/link.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/picture.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/preview.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/images/stroke.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/default/set.js +27 -0
- data/test/dummy/public/javascripts/markitup/sets/default/style.css +27 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/bold.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/clean.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/h1.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/h2.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/h3.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/h4.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/h5.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/h6.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/image.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/italic.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/link.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/list-bullet.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/list-item.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/list-numeric.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/paragraph.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/picture.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/preview.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/images/stroke.png +0 -0
- data/test/dummy/public/javascripts/markitup/sets/html/readme.txt +11 -0
- data/test/dummy/public/javascripts/markitup/sets/html/set.js +40 -0
- data/test/dummy/public/javascripts/markitup/sets/html/style.css +59 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-container.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-bbcode.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-dotclear.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-html.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-json.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-markdown.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-textile.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-wiki.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor-xml.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/bg-editor.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/handle.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/menu.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/images/submenu.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/markitup/style.css +147 -0
- data/test/dummy/public/javascripts/markitup/skins/simple/images/handle.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/simple/images/menu.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/simple/images/submenu.png +0 -0
- data/test/dummy/public/javascripts/markitup/skins/simple/style.css +118 -0
- data/test/dummy/public/javascripts/markitup/templates/preview.css +5 -0
- data/test/dummy/public/javascripts/markitup/templates/preview.html +11 -0
- data/test/dummy/public/javascripts/rails.js +132 -0
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
- data/test/dummy/public/stylesheets/application.css +0 -0
- data/test/dummy/public/stylesheets/style.css +681 -0
- data/test/dummy/script/rails +6 -0
- data/test/factories.rb +88 -0
- data/test/fixtures/files/compress_by_dir.zip +0 -0
- data/test/fixtures/files/compress_by_file.zip +0 -0
- data/test/fixtures/files/image.png +0 -0
- data/test/functional/mail_engine/mail_dispatcher_test.rb +8 -0
- data/test/functional/mail_engine/mail_schedules_controller_controller_test.rb +8 -0
- data/test/functional/mail_engine/mail_templates_controller_controller_test.rb +8 -0
- data/test/support/integration_case.rb +5 -0
- data/test/test_helper.rb +35 -0
- data/test/unit/mail_engine/mail_log_test.rb +8 -0
- data/test/unit/mail_engine/mail_schedule_test.rb +40 -0
- data/test/unit/mail_engine/mail_template_file_test.rb +21 -0
- data/test/unit/mail_engine/mail_template_test.rb +77 -0
- data/test/unit/mail_engine/template_partial_test.rb +8 -0
- 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
|