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