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