TIP: You can type at any time to perform a new search.

Security findings

Repository
odoo/odoo · module folder
Module version
2.7
Category
Marketing/Email Marketing
Folder size
17.44 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
https://www.odoo.com/app/email-marketing
Last tracking update
2026-10-05 00:19:42
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Thibault Delavallée, odoo, Odoo Translation Bot, Christophe Matthieu, David Monjoie, Aaron Bohy, Géry Debongnie, Lucas Perais (lpe), qsm-odoo, Jorge Pinna Puissant, Aurélien Warnon, Xavier-Do, Victor Feyens, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, std-odoo, David Beguin, Prakash Prajapati, Tiffany Chang (tic), Gorash, Pierre Paridans, abd-msyukyu-odoo, Benjamin Vray, Miquel Raïch, Antoine Guenet, Florian Charlier, Nicolas Bayet, luvi, Renaud Thiry, Julien Banken, Julien (jula), amdi-odoo, Robin Lejeune (role), Louis (loco), Dylan Kiss (dyki), FrancoisGe, Chong Wang (cwg), Brieuc-brd, omra-odoo, Walid (wasa), Deependra Solanki, jorv-odoo, dhba, Bastien Fafchamps (bafa), adch-odoo, Rodolpho Lima, Adnan Saiyed, Chrysanthe (chgo), sami odoo, Harsh Shah, Xavier Luyckx (xlu), guce, Sébastien (blse), Ezzuldin Zaky (ezza), Pierre Pulinckx, Michaël Mattiello, Thomas Josse (THJO), Krzysztof Magusiak (krma), mojem, pajo, bhna-odoo, Brett Cutler, defl, bikh-odoo, agbr-odoo, Julien Launois (jula), Laetitia (ldau), Augustin (duau), Subhadeep R. Dev, Serhii Rubanskyi, romo, Alessandro Lupo, Yagnik ✗ (yagp), Saurabh, sbbh-odoo, assk-odoo, Séna Nshimiyimana, alan-odoo, Kadam Darji, h4818 (ayh), Julien Carion, ELCO, chpa-odoo, Oussema Heni, Haroune Hassine (Hahas), Louis Wicket, Julien Piron, Jean Schoenlaub, Mayur Barad
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
mail_tracking_mass_mailing, marketing_card, mass_mailing_crm, mass_mailing_event, mass_mailing_event_sms, mass_mailing_event_track, mass_mailing_event_track_sms, mass_mailing_sale, mass_mailing_slides, mass_mailing_sms, mass_mailing_themes, test_mail_full, test_mass_mailing, website_mass_mailing, website_mass_mailing_event
Description

Code Analysis info_outline

Views touched (91)
XML IDNameModelTypeStatus
ab_testing_description Mass Mailing: A/B Test Description ir.ui.view qweb New
digest_mail_main digest_mail_main ir.ui.view qweb Inherits digest.digest_mail_main
email_compose_form_mass_mailing mail.compose.message.form.mass_mailing mail.compose.message form Inherits mail.email_compose_message_wizard_form
email_designer_snippets email_designer_snippets ir.ui.view qweb New
email_designer_themes email_designer_themes ir.ui.view qweb New
link_tracker_click_view_form link.tracker.click.view.form.inherit.mass_mailing link.tracker.click form Inherits link_tracker.link_tracker_click_view_form
link_tracker_click_view_graph link.tracker.click.view.graph.inherit.mass_mailing link.tracker.click graph Inherits link_tracker.link_tracker_click_view_graph
link_tracker_click_view_list_simplified link.tracker.click.view.list.simplified link.tracker.click list New
link_tracker_click_view_search link.tracker.click.view.search.inherit.mass_mailing link.tracker.click search Inherits link_tracker.link_tracker_click_view_search
link_tracker_click_view_tree link.tracker.click.view.list.inherit.mass_mailing link.tracker.click list Inherits link_tracker.link_tracker_click_view_tree
link_tracker_view_form link.tracker.view.form.inherit.mass.mail link.tracker form Inherits link_tracker.link_tracker_view_form
link_tracker_view_search link.tracker.view.search.inherit.mass.mail link.tracker search Inherits link_tracker.link_tracker_view_search
link_tracker_view_tree link.tracker.view.list.inherit.mass.mail link.tracker list Inherits link_tracker.link_tracker_view_tree
mail_blacklist_view_form mail.blacklist.view.form.inherit.mailing mail.blacklist form Inherits mail.mail_blacklist_view_form
mail_blacklist_view_search mail.blacklist.view.search mail.blacklist search Inherits mail.mail_blacklist_view_search
mail_blacklist_view_tree mail.blacklist.view.list.inherit.mailing mail.blacklist list Inherits mail.mail_blacklist_view_tree
mailing_contact_import_view_form mailing.contact.import.view.form mailing.contact.import form New
mailing_contact_to_list_view_form mailing.contact.to.list.view.form mailing.contact.to.list form New
mailing_contact_view_form mailing.contact.view.form mailing.contact form New
mailing_contact_view_form_split_name mailing.contact.view.form.split.name mailing.contact form Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_graph mailing.contact.view.graph mailing.contact graph New
mailing_contact_view_kanban mailing.contact.view.kanban mailing.contact kanban New
mailing_contact_view_list_from_filter mailing.contact.view.list.from.filter mailing.contact list Inherits mailing_contact_view_tree
mailing_contact_view_pivot mailing.contact.pivot mailing.contact pivot New
mailing_contact_view_search mailing.contact.view.search mailing.contact search New
mailing_contact_view_tree mailing.contact.view.list mailing.contact list New
mailing_contact_view_tree_split_name mailing.contact.view.list.split.name mailing.contact list Inherits mass_mailing.mailing_contact_view_tree
mailing_filter_view_form mailing.filter.view.form mailing.filter form New
mailing_filter_view_form_simplified mailing.filter.view.form.inherit.simplified mailing.filter form Inherits mailing_filter_view_form
mailing_filter_view_kanban mailing.filter.view.kanban mailing.filter kanban New
mailing_filter_view_search mailing.filter.view.search mailing.filter search New
mailing_filter_view_tree mailing.filter.view.list mailing.filter list New
mailing_list_view_form mailing.list.form mailing.list form New
mailing_list_view_form_simplified mailing.list.form.simplified mailing.list form New
mailing_list_view_kanban mailing.list.view.kanban mailing.list kanban New
mailing_list_view_search mailing.list.view.search mailing.list search New
mailing_list_view_tree mailing.list.view.list mailing.list list New
mailing_mailing_schedule_date_view_form mailing.mailing.schedule.date.view.form mailing.mailing.schedule.date form New
mailing_mailing_view_calendar mailing.mailing.view.calendar mailing.mailing calendar New
mailing_mailing_view_kanban_templates mailing.mailing.view.kanban.templates mailing.mailing kanban New
mailing_mailing_view_list_template mailing.mailing.view.list.template mailing.mailing list New
mailing_mailing_view_search_templates mailing.mailing.view.search.templates mailing.mailing search New
mailing_report_deactivated Report Unsubscribed ir.ui.view qweb New
mailing_subscription_optout_view_form mailing.subscription.optout.view.form mailing.subscription.optout form New
mailing_subscription_optout_view_search mailing.subscription.optout.view.search mailing.subscription.optout search New
mailing_subscription_optout_view_tree mailing.subscription.optout.view.list mailing.subscription.optout list New
mailing_subscription_view_form mailing.subscription.view.form mailing.subscription form New
mailing_subscription_view_graph mailing.subscription.view.graph mailing.subscription graph New
mailing_subscription_view_pivot mailing.subscription.view.pivot mailing.subscription pivot New
mailing_subscription_view_search mailing.subscription.view.search mailing.subscription search New
mailing_subscription_view_tree mailing.subscription.view.list mailing.subscription list New
mailing_trace_report_view_graph mailing.trace.report.view.graph mailing.trace.report graph New
mailing_trace_report_view_pivot mailing.trace.report.view.pivot mailing.trace.report pivot New
mailing_trace_report_view_search mailing.trace.report.view.search mailing.trace.report search New
mailing_trace_report_view_tree mailing.trace.report.view.list mailing.trace.report list New
mailing_trace_view_form mailing.trace.view.form mailing.trace form New
mailing_trace_view_search mailing.trace.view.search mailing.trace search New
mailing_trace_view_tree mailing.trace.view.list mailing.trace list New
mailing_trace_view_tree_mail mailing.trace.view.list.mail mailing.trace list New
mailing_view Browser View ir.ui.view qweb New
mailing_view_generic View in Browser ir.ui.view qweb New
mass_mail_1_body mass_mail_1_body ir.ui.view qweb New
mass_mailing.layout Mass Mailing Layout ir.ui.view qweb New
mass_mailing.mass_mailing_kpi_link_trackers Marketing: mailing link trackers statistic ir.ui.view qweb New
mass_mailing.preview_content_mobile mass_mailing.preview_content_mobile ir.ui.view qweb New
mass_mailing_mail_layout mass_mailing_mail_layout ir.ui.view qweb New
page_mailing_confirm_unsubscribe page_mailing_confirm_unsubscribe ir.ui.view qweb New
page_mailing_has_unsubscribed page_mailing_has_unsubscribed ir.ui.view qweb New
page_mailing_unsubscribe Unsubscribe ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.mass.mailing res.config.settings form Inherits base.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.mass.mail res.partner form Inherits base.view_partner_form
res_partner_view_list res.partner.view.list.inherit.mass.mail res.partner list Inherits base.view_partner_tree
s_mail_block_footer_social Social + Footer ir.ui.view qweb New
s_mail_block_header_logo_and_stacked_menu Logo + Stacked Menu ir.ui.view qweb New
s_mail_company_logo s_mail_company_logo ir.ui.view qweb New
s_social_media Social Media ir.ui.view qweb New
s_social_media_template s_social_media_template ir.ui.view qweb New
social_links social_links ir.ui.view qweb New
theme_basic_template theme_basic_template ir.ui.view qweb New
theme_default_template theme_default_template ir.ui.view qweb New
theme_empty_template theme_empty_template ir.ui.view qweb New
unsubscribe_form unsubscribe_form ir.ui.view qweb New
utm_campaign_view_form utm.campaign.view.form utm.campaign form Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign kanban Inherits utm.utm_campaign_view_kanban
view_mail_mail_statistics_graph Mail Statistics Graph mailing.trace graph New
view_mail_mass_mailing_form mailing.mailing.form mailing.mailing form New
view_mail_mass_mailing_kanban mailing.mailing.kanban mailing.mailing kanban New
view_mail_mass_mailing_search mailing.mailing.search mailing.mailing search New
view_mail_mass_mailing_test_form mailing.mailing.test.form mailing.mailing.test form New
view_mail_mass_mailing_test_send_test_form mailing.mailing.send.test.form mailing.mailing.test form New
view_mail_mass_mailing_tree mailing.mailing.list mailing.mailing list New
HTTP endpoints (17)
Route(s)HandlerAuthTypeMethodsFlags
/mail/mailing/<int:mailing_id>/unsubscribe MailingLegacy.mailing_unsubscribe public http ALL website
/r/<string:code>/m/<int:mailing_trace_id> MassMailController.full_url_redirect public http ALL sudo
/mailing/blocklist/add MassMailController.mail_blocklist_add public jsonrpc ALL sudo
/mailing/blocklist/remove MassMailController.mail_blocklist_remove public jsonrpc ALL sudo
/mailing/<int:mailing_id>/confirm_unsubscribe MassMailController.mailing_confirm_unsubscribe public http ALL sudo website
/mailing/confirm_unsubscribe MassMailController.mailing_confirm_unsubscribe_post public http POST website
/mailing/my MassMailController.mailing_my user http ALL website
/mailing/report/unsubscribe MassMailController.mailing_report_deactivate public http ALL sudo website
/mailing/feedback MassMailController.mailing_send_feedback public jsonrpc ALL sudo
/mailing/<int:mailing_id>/unsubscribe MassMailController.mailing_unsubscribe public http ALL website
/mailing/<int:mailing_id>/unsubscribe_oneclick MassMailController.mailing_unsubscribe_oneclick public http POST csrf off website
/unsubscribe_from_list MassMailController.mailing_unsubscribe_placeholder_link public http ALL website
/mailing/list/update MassMailController.mailing_update_list_subscription public jsonrpc ALL sudo
/mailing/<int:mailing_id>/view MassMailController.mailing_view_in_browser public http ALL sudo website
/view MassMailController.mailing_view_in_browser_placeholder_link user http ALL website
/mailing/mobile/preview MassMailController.mass_mailing_preview_mobile_content user http GET website
/mail/track/<int:mail_id>/<string:token>/blank.gif MassMailController.track_mail_open public http ALL sudo
Models touched (31)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • active_mailing_ids One2many → mailing.mailing
    comodel_name='mailing.mailing' domain=[('state', '!=', 'done'), ('active', '=', True)] inverse_name='mail_server_id' readonly=True string='Active mailing using this mail server'
Public methods (0)

No public methods.

New fields (1)
  • is_mailing_enabled Boolean
    compute='_compute_is_mailing_enabled' help='Whether this model supports marketing mailing capabilities (notably email and SMS).' search='_search_is_mailing_enabled' string='Mailing Enabled'
Public methods (0)

No public methods.

New fields (1)
  • technical_usage Selection
    selection_add=[('mass_mailing', 'Mass Mailing Technical')]
Public methods (0)

No public methods.

New fields (1)
  • mass_mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
Public methods (0)

No public methods.

New fields (4)
  • email Char
    help='The email address of the entity that clicked the link' related='mailing_trace_id.email' string='Email'
  • mailing_trace_id Many2one → mailing.trace
    index='btree_not_null' string='Mail Statistics' args: 'mailing.trace'
  • mass_mailing_id Many2one → mailing.mailing
    index='btree_not_null' string='Mass Mailing' args: 'mailing.mailing'
  • url Char
    related='link_id.url' string='URL'
Public methods (1)
  • add_click(self, code, **route_values)
    @api.model

New fields (1)
  • opt_out_reason_id Many2one → mailing.subscription.optout
    ondelete='restrict' string='Opt-out Reason' tracking=10 args: 'mailing.subscription.optout'
Public methods (0)

No public methods.

New fields (4)
  • campaign_id Many2one → utm.campaign
    ondelete='set null' string='Mass Mailing Campaign' args: 'utm.campaign'
  • mailing_list_ids Many2many → mailing.list
    string='Mailing List' args: 'mailing.list'
  • mass_mailing_create Boolean
    help='If set, a mass mailing will be created so that you can track its results in the Email Marketing app.' args: 'Create Mass Mailing'
  • mass_mailing_id Many2one → mailing.mailing
    ondelete='cascade' string='Mass Mailing' args: 'mailing.mailing'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'mail_mail_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • message_mail_with_source(self, source_ref, **kwargs)
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_post_with_source(self, source_ref, **kwargs)

New fields (19)
  • clicks_ratio Float
    compute='_compute_clicks_ratio' args: 'Clicks Ratio'
  • company_name Char
    string='Company Name'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • email Char
    args: 'Email'
  • first_name Char
    args: 'First Name'
  • last_clicked_datetime Datetime
    args: 'Last Clicked On'
  • last_name Char
    args: 'Last Name'
  • last_opened_datetime Datetime
    args: 'Last Opened On'
  • last_replied_datetime Datetime
    args: 'Last Replied On'
  • list_ids Many2many → mailing.list
    string='Mailing Lists' args: 'mailing.list', 'mailing_subscription', 'contact_id', 'list_id'
  • mailing_count Integer
    compute='_compute_statistics' args: 'Number of Mailing'
  • name Char
    compute='_compute_name' readonly=False store=True tracking=True args: 'Name'
  • opened_ratio Float
    compute='_compute_statistics' args: 'Opened Ratio'
  • opt_out Boolean
    compute='_compute_opt_out' help='Opt out flag for a specific mailing list. This field should not be used in a view without a unique and active mailing list context.' search='_search_opt_out' args: 'Opt Out'
  • partner_id Many2one → res.partner
    index='btree_not_null' string='Contact' args: 'res.partner'
  • received_ratio Float
    compute='_compute_statistics' args: 'Received Ratio'
  • replied_ratio Float
    compute='_compute_statistics' args: 'Replied Ratio'
  • subscription_ids One2many → mailing.subscription
    string='Subscription Information' args: 'mailing.subscription', 'contact_id'
  • tag_ids Many2many → res.partner.category
    string='Tags' args: 'res.partner.category'
Public methods (15)
  • action_add_to_mailing_list(self)
  • action_import(self)
  • action_open_base_import(self)
    Open the base import wizard to import mailing contacts with a xlsx file.
  • action_view_clicked(self)
  • action_view_mailings(self)
  • action_view_opened(self)
  • action_view_received(self)
  • action_view_replied(self)
  • add_to_list(self, name, list_id)
    @api.model
  • copy(self, default=None)
    Cleans the default_list_ids while duplicating mailing contact in context of a mailing list because we already have subscription lists copied over for newly created contact, no need to add the ones from default_list_ids again
  • create(self, vals_list)
    @api.model_create_multi
    Synchronize default_list_ids (currently used notably for computed fields) default key with subscription_ids given by user when creating contacts. Those two values have the same purpose, adding a list to to the contact either through a direct write on m2m, either through a write on middle model subscription. This is a bit hackish but is due to default_list_ids key being used to compute oupt_out field. This should be cleaned in master but here we simply try to limit issues while keeping current behavior.
  • default_get(self, fields)
    @api.model
    When coming from a mailing list we may have a default_list_ids context key. We should use it to create subscription_ids default value that are displayed to the user as list_ids is not displayed on form view.
  • fields_get(self, allfields=None, attributes=None)
    @api.model
    Hide first and last name field if the split name feature is not enabled.
  • get_import_templates(self)
    @api.model
  • name_create(self, name)
    @api.model

New fields (2)
  • contact_list Text
    help='Contact list that will be imported, one contact per line' args: 'Contact List'
  • mailing_list_ids Many2many → mailing.list
    string='Lists' args: 'mailing.list'
Public methods (2)
  • action_import(self)
    Import each lines of "contact_list" as a new contact.
  • action_open_base_import(self)

New fields (3)
  • contact_ids Many2many → mailing.contact
    string='Mailing Contacts' args: 'mailing.contact'
  • mailing_list_ids Many2many → mailing.list
    required=True string='Mailing Lists' args: 'mailing.list'
  • partner_ids Many2many → res.partner
    string='Contacts' args: 'res.partner'
Public methods (1)
  • action_add_contacts(self)

New fields (8)
  • active Boolean
    default=True
  • color Integer
    default=0 string='Color'
  • create_uid Many2one → res.users
    default=<expr> index=True readonly=True args: 'res.users', 'Saved by'
  • mailing_count Integer
    compute='_compute_mailing_count' args: 'Number of Mailing'
  • mailing_domain Char
    default='[]' required=True string='Filter Domain'
  • mailing_model_id Many2one → ir.model
    domain=[('is_mailing_enabled', '=', True)] ondelete='cascade' required=True string='Recipients Model' args: 'ir.model'
  • mailing_model_name Char
    related='mailing_model_id.model' string='Recipients Model Name'
  • name Char
    required=True string='List Name'
Public methods (3)
  • action_send_mailing(self)
    Open the mailing form view, with the current model & domain set as the mailing model & mailing domain. respectively
  • action_view_mailings(self)
  • action_view_recipients(self)
    Redirect to the list view of the model of the selected dynamic list, with the domain of the latter set as the domain of that view. If the model is `mailing.contact`, the `New`, `Paste` and `Upload` buttons will be hidden.

New fields (15)
  • active Boolean
    default=True
  • color Integer
    default=0 string='Color'
  • contact_count Integer
    compute='_compute_mailing_list_statistics' string='Number of Contacts'
  • contact_count_blacklisted Integer
    compute='_compute_mailing_list_statistics' string='Number of Blacklisted'
  • contact_count_email Integer
    compute='_compute_mailing_list_statistics' string='Number of Emails'
  • contact_count_opt_out Integer
    compute='_compute_mailing_list_statistics' string='Number of Opted-out'
  • contact_ids Many2many → mailing.contact
    copy=False string='Mailing Lists' args: 'mailing.contact', 'mailing_subscription', 'list_id', 'contact_id'
  • contact_pct_blacklisted Float
    compute='_compute_mailing_list_statistics' string='Percentage of Blacklisted'
  • contact_pct_bounce Float
    compute='_compute_mailing_list_statistics' string='Percentage of Bouncing'
  • contact_pct_opt_out Float
    compute='_compute_mailing_list_statistics' string='Percentage of Opted-out'
  • is_public Boolean
    default=False help='The mailing list can be accessible by recipients in the subscription management page to allow them to update their preferences.' string='Show In Preferences'
  • mailing_count Integer
    compute='_compute_mailing_count' string='Number of Mailing'
  • mailing_ids Many2many → mailing.mailing
    copy=False string='Mass Mailings' args: 'mailing.mailing', 'mail_mass_mailing_list_rel'
  • name Char
    required=True string='Mailing List'
  • subscription_ids One2many → mailing.subscription
    copy=True depends=['contact_ids'] string='Subscription Information' args: 'mailing.subscription', 'list_id'
Public methods (11)
  • action_mailing_lists_merge(self)
  • action_merge(self, src_lists)
    Merge lists into self, removing exact duplicates from source lists. Duplicates are completely removed and mailings using the source lists will be updated to use self instead. The opt-out status of the destination list is preffered. Otherwise if it is opted out of any list, it is opted out of the final one.
  • action_open_import(self)
    Open the mailing list contact import wizard.
  • action_send_mailing(self)
    Open the mailing form view, with the current lists set as recipients.
  • action_view_contacts(self)
  • action_view_contacts_blacklisted(self)
  • action_view_contacts_bouncing(self)
  • action_view_contacts_email(self)
  • action_view_contacts_opt_out(self)
  • action_view_mailings(self)
  • write(self, vals)

New fields (70)
  • ab_testing_completed Boolean
    related='campaign_id.ab_testing_completed'
  • ab_testing_description Html
    compute='_compute_ab_testing_description' args: 'A/B Testing Description'
  • ab_testing_enabled Boolean
    default=False help='If checked, recipients will be mailed only once for the whole campaign. This lets you send different mailings to randomly selected recipients and test the effectiveness of the mailings, without causing duplicate messages.' string='Allow A/B Testing'
  • ab_testing_is_winner_mailing Boolean
    compute='_compute_ab_testing_is_winner_mailing' args: 'Is the Winner of its Campaign'
  • ab_testing_mailings_count Integer
    related='campaign_id.ab_testing_mailings_count'
  • ab_testing_pc Integer
    default=10 help='Percentage of the contacts that will be mailed. Recipients will be chosen randomly.' string='A/B Testing percentage'
  • ab_testing_schedule_datetime Datetime
    default=<expr> readonly=False related='campaign_id.ab_testing_schedule_datetime'
  • ab_testing_version_name Char
    copy=False args: 'A/B Testing Version'
  • ab_testing_winner_selection Selection
    copy=True default='opened_ratio' readonly=False related='campaign_id.ab_testing_winner_selection'
  • active Boolean
    default=True tracking=True
  • attachment_ids Many2many → ir.attachment
    bypass_search_access=True string='Attachments' args: 'ir.attachment', 'mass_mailing_ir_attachments_rel', 'mass_mailing_id', 'attachment_id'
  • body_arch Html
    sanitize='email_outgoing' sanitize_output_method='html' string='Body' translate=False
  • body_html Html
    render_engine='qweb' render_options={'post_process': True} sanitize='email_outgoing' string='Body converted to be sent by mail'
  • bounced Integer
    compute='_compute_statistics'
  • bounced_ratio Float
    compute='_compute_statistics' string='Bounced Ratio'
  • calendar_date Datetime
    compute='_compute_calendar_date' copy=False help='Date at which the mailing was or will be sent.' store=True args: 'Calendar Date'
  • campaign_id Many2one → utm.campaign
    index=True ondelete='set null' string='UTM Campaign' args: 'utm.campaign'
  • canceled Integer
    compute='_compute_statistics'
  • canceled_ratio Float
    compute='_compute_statistics' string='Cancelled Ratio'
  • clicked Integer
    compute='_compute_statistics'
  • clicks_ratio Float
    compute='_compute_clicks_ratio' string='Number of Clicks'
  • color Integer
    string='Color Index'
  • contact_list_ids Many2many → mailing.list
    context={'active_test': False} string='Mailing Lists' args: 'mailing.list', 'mail_mass_mailing_list_rel'
  • delivered Integer
    compute='_compute_statistics'
  • email_from Char
    compute='_compute_email_from' precompute=True readonly=False store=True string='Send From'
  • expected Integer
    compute='_compute_statistics'
  • failed Integer
    compute='_compute_statistics'
  • is_ab_test_sent Boolean
    compute='_compute_is_ab_test_sent'
  • is_body_empty Boolean
    compute='_compute_is_body_empty'
  • is_template Boolean
    tracking=True args: 'Is Template'
  • keep_archives Boolean
    string='Keep Archives'
  • kpi_mail_required Boolean
    copy=False args: 'KPI mail required'
  • link_trackers_count Integer
    compute='_compute_link_trackers_count' string='Link Trackers Count'
  • mail_server_available Boolean
    compute='_compute_mail_server_available' help='Technical field used to know if the user has activated the outgoing mail server option in the settings'
  • mail_server_id Many2one → ir.mail_server
    default=_get_default_mail_server_id help='Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.' index='btree_not_null' string='Mail Server' args: 'ir.mail_server'
  • mailing_domain Char
    compute='_compute_mailing_domain' compute_sudo=False readonly=False store=True string='Domain'
  • mailing_filter_ids Many2many → mailing.filter
    compute='_compute_mailing_filter_ids' domain="[('mailing_model_name', '=', mailing_model_name)]" readonly=False store=True string='Dynamic Lists' args: 'mailing.filter', 'mail_mass_mailing_filter_rel', 'mailing_mailing_id', 'mailing_filter_id'
  • mailing_model_id Many2one → ir.model
    compute='_compute_mailing_model_id' domain=[('is_mailing_enabled', '=', True)] ondelete='cascade' precompute=True readonly=False required=True store=True string='Recipients Model' args: 'ir.model'
  • mailing_model_name Char
    readonly=True related='mailing_model_id.model' related_sudo=True string='Recipients Model Name'
  • mailing_model_real Char
    compute='_compute_mailing_model_real' string='Recipients Real Model'
  • mailing_on_mailing_list Boolean
    compute='_compute_mailing_on_mailing_list' string='Based on Mailing Lists'
  • mailing_trace_ids One2many → mailing.trace
    string='Emails Statistics' args: 'mailing.trace', 'mass_mailing_id'
  • mailing_type Selection
    default='mail' required=True string='Mailing Type' args: [('mail', 'Email')]
  • mailing_type_description Char
    compute='_compute_mailing_type_description' args: 'Mailing Type Description'
  • medium_id Many2one → utm.medium
    compute='_compute_medium_id' help='UTM Medium: delivery method (email, sms, ...)' ondelete='restrict' readonly=False store=True string='Medium' args: 'utm.medium'
  • next_departure Datetime
    compute='_compute_next_departure' string='Scheduled date'
  • next_departure_is_past Boolean
    compute='_compute_next_departure'
  • opened Integer
    compute='_compute_statistics'
  • opened_ratio Float
    compute='_compute_statistics' string='Opened Ratio'
  • pending Integer
    compute='_compute_statistics'
  • preview Char
    render_engine='inline_template' render_options={'post_process': True} translate=False args: 'Preview'
  • process Integer
    compute='_compute_statistics'
  • received_ratio Float
    compute='_compute_statistics' string='Received Ratio'
  • recipients_count Integer
    compute='_compute_recipients_count' args: '# Of Recipients'
  • replied Integer
    compute='_compute_statistics'
  • replied_ratio Float
    compute='_compute_statistics' string='Replied Ratio'
  • reply_to Char
    compute='_compute_reply_to' help='Preferred Reply-To Address' readonly=False store=True string='Reply To'
  • reply_to_mode Selection
    compute='_compute_reply_to_mode' help='Thread: replies go to target document. Email: replies are routed to a given email.' readonly=False store=True string='Reply-To Mode' args: [('update', 'Recipient Followers'), ('new', 'Specified Email Address')]
  • schedule_date Datetime
    compute='_compute_schedule_date' copy=True readonly=False store=True string='Scheduled for' tracking=True
  • schedule_type Selection
    default='now' readonly=False required=True string='Schedule' args: [('now', 'Send now'), ('scheduled', 'Send on')]
  • scheduled Integer
    compute='_compute_statistics'
  • sent Integer
    compute='_compute_statistics'
  • sent_date Datetime
    copy=False string='Sent Date'
  • source_id Many2one → utm.source
    compute='_compute_source_id' help='UTM Source: source tracking (mass_mailing, newsletter, mass_sms, ...)' ondelete='restrict' readonly=False store=True string='Source' args: 'utm.source'
  • state Selection
    copy=False default='draft' group_expand=True required=True string='Status' tracking=True args: [('draft', 'Draft'), ('in_queue', 'In Queue'), ('sending', 'Sending'), ('done', 'Sent')]
  • subject Char
    required=True translate=False args: 'Subject'
  • total Integer
    compute='_compute_total'
  • use_exclusion_list Boolean
    compute='_compute_use_exclusion_list' copy=False default=True help='Prevent sending messages to blacklisted contacts. Disable only when absolutely necessary.' readonly=False store=True args: 'Use Exclusion List'
  • user_id Many2one → res.users
    default=<expr> string='Responsible' tracking=True args: 'res.users'
  • warning_message Char
    compute='_compute_warning_message' help='Warning message displayed in the mailing form view' args: 'Warning Message'
Public methods (34)
  • action_cancel(self)
  • action_compare_versions(self)
  • action_duplicate(self)
  • action_fetch_templates(self, extra_domain=None)
    @api.model
    Return all active mailings set as template and skip mailings with empty body.
  • action_import_mailing_contacts(self)
    Display the mailing contact import-by-paste wizard for this mailing's contact lists
  • action_launch(self)
  • action_new_mailing_from_template(self)
  • action_preview(self)
  • action_put_in_queue(self)
  • action_reload(self)
  • action_retry_failed(self, extra_domain=None)
    Remove all failed emails and their traces, and try sending them again.
  • action_save_as_template(self)
  • action_schedule(self)
  • action_select_as_winner(self)
  • action_send_mail(self, res_ids=None)
  • action_send_winner_mailing(self)
    Send the winner mailing based on the winner selection field. This action is used in 2 cases: - When the user clicks on a button to send the winner mailing. There is only one mailing in self - When the cron is executed to send winner mailing based on the A/B testing schedule datetime. In this case 'self' contains all the mailing for the campaigns so we just need to take the first to determine the winner. If the winner mailing is computed automatically, we sudo the mailings of the campaign in order to sort correctly the mailings based on the selection that can be used with sub-modules like CRM and Sales
  • action_test(self)
  • action_view_bounced(self)
  • action_view_clicked(self)
  • action_view_delivered(self)
  • action_view_link_trackers(self)
  • action_view_opened(self)
  • action_view_replied(self)
  • action_view_traces(self)
  • action_view_traces_canceled(self)
  • action_view_traces_failed(self)
  • action_view_traces_process(self)
  • action_view_traces_scheduled(self)
  • action_view_traces_sent(self)
  • convert_links(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • write(self, vals)

New fields (2)
  • mass_mailing_id Many2one → mailing.mailing
    required=True args: 'mailing.mailing'
  • schedule_date Datetime
    string='Scheduled for'
Public methods (1)
  • action_schedule_date(self)

New fields (8)
  • body_html Html
    compute='_compute_mailing_preview' sanitize='email_outgoing' string='Preview Body'
  • email_from Char
    compute='_compute_mailing_preview' string='From'
  • email_to Text
    default=_default_email_to required=True string='Recipients'
  • mass_mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • preview_record_ref Reference
    compute='_compute_preview_record_ref' readonly=False selection='_get_model_selection' store=True string='Preview for'
  • preview_text Char
    compute='_compute_mailing_preview' string='Preview Text'
  • reply_to Char
    compute='_compute_mailing_preview' string='Reply To'
  • subject Char
    compute='_compute_mailing_preview' string='Subject'
Public methods (1)
  • send_mail_test(self)

New fields (7)
  • contact_id Many2one → mailing.contact
    ondelete='cascade' required=True string='Contact' args: 'mailing.contact'
  • is_blacklisted Boolean
    readonly=False related='contact_id.is_blacklisted' store=False
  • list_id Many2one → mailing.list
    index=True ondelete='cascade' required=True string='Mailing List' args: 'mailing.list'
  • message_bounce Integer
    readonly=False related='contact_id.message_bounce' store=False
  • opt_out Boolean
    default=False help='The contact has chosen not to receive mails anymore from this list' string='Opt Out'
  • opt_out_datetime Datetime
    compute='_compute_opt_out_datetime' readonly=False store=True string='Unsubscription Date'
  • opt_out_reason_id Many2one → mailing.subscription.optout
    ondelete='restrict' string='Reason' args: 'mailing.subscription.optout'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • open_mailing_contact(self)
  • write(self, vals)

New fields (3)
  • is_feedback Boolean
    string='Ask For Feedback'
  • name Char
    string='Reason' translate=True
  • sequence Integer
    default=10 string='Sequence'
Public methods (0)

No public methods.

New fields (20)
  • campaign_id Many2one
    index='btree_not_null' readonly=True related='mass_mailing_id.campaign_id' store=True string='Campaign'
  • email Char
    help='Normalized email address' string='Email'
  • failure_reason Text
    copy=False readonly=True args: 'Failure reason'
  • failure_type Selection
    selection=[('unknown', 'Unknown error'), ('mail_bounce', 'Bounce'), ('mail_spam', 'Detected As Spam'), ('mail_email_invalid', 'Invalid email address'), ('mail_email_missing', 'Missing email address'), ('mail_from_invalid', 'Invalid from address'), ('mail_from_missing', 'Missing from address'), ('mail_smtp', 'Connection failed (outgoing mail server problem)'), ('mail_bl', 'Blacklisted Address'), ('mail_dup', 'Duplicated Email'), ('mail_optout', 'Opted Out')] string='Failure type'
  • is_test_trace Boolean
    args: 'Generated for testing'
  • links_click_datetime Datetime
    help='Stores last click datetime in case of multi clicks.' args: 'Clicked On'
  • links_click_ids One2many → link.tracker.click
    string='Links click' args: 'link.tracker.click', 'mailing_trace_id'
  • mail_mail_id Many2one → mail.mail
    index='btree_not_null' string='Mail' args: 'mail.mail'
  • mail_mail_id_int Integer
    help='ID of the related mail_mail. This field is an integer field because the related mail_mail can be deleted separately from its statistics. However the ID is needed for several action and controllers.' index='btree_not_null' string='Mail ID (tech)'
  • mass_mailing_id Many2one → mailing.mailing
    index=True ondelete='cascade' string='Mailing' args: 'mailing.mailing'
  • medium_id Many2one
    related='mass_mailing_id.medium_id'
  • message_id Char
    string='Message-ID'
  • model Char
    index=True required=True string='Document model'
  • open_datetime Datetime
    args: 'Opened On'
  • reply_datetime Datetime
    args: 'Replied On'
  • res_id Many2oneReference
    index=True model_field='model' string='Document ID'
  • sent_datetime Datetime
    args: 'Sent On'
  • source_id Many2one
    related='mass_mailing_id.source_id'
  • trace_status Selection
    default='outgoing' selection=[('outgoing', 'Outgoing'), ('process', 'Processing'), ('pending', 'Sent'), ('sent', 'Delivered'), ('open', 'Opened'), ('reply', 'Replied'), ('bounce', 'Bounced'), ('error', 'Exception'), ('cancel', 'Cancelled')] string='Status'
  • trace_type Selection
    default='mail' required=True string='Type' args: [('mail', 'Email')]
Public methods (10)
  • action_retry_failed(self)
  • action_view_contact(self)
  • create(self, vals_list)
    @api.model_create_multi
  • set_bounced(self, domain=None, failure_reason=False, failure_type=False)
  • set_canceled(self, domain=None, failure_reason=False, failure_type=False)
    Note: cancel trace_status is mainly done when detecting invalid recipients at sending time. Trace is created in 'cancel' state, which explains this method is seldom used.
  • set_clicked(self, domain=None)
  • set_failed(self, domain=None, failure_reason=False, failure_type=False)
  • set_opened(self, domain=None)
    Reply / Open are a bit shared in various processes: reply implies open, click implies open. Let us avoid status override by skipping traces that are not already opened or replied.
  • set_replied(self, domain=None)
  • set_sent(self, domain=None)

New fields (17)
  • bounced Integer
    readonly=True
  • campaign Char
    readonly=True string='Mailing Campaign'
  • canceled Integer
    readonly=True
  • clicked Integer
    readonly=True
  • delivered Integer
    readonly=True
  • email_from Char
    readonly=True args: 'From'
  • error Integer
    readonly=True
  • mailing_type Selection
    default='mail' required=True string='Type' args: [('mail', 'Mail')]
  • name Char
    readonly=True string='Mass Mail'
  • opened Integer
    readonly=True
  • pending Integer
    readonly=True
  • processing Integer
    readonly=True
  • replied Integer
    readonly=True
  • scheduled Integer
    readonly=True
  • scheduled_date Datetime
    readonly=True string='Scheduled Date'
  • sent Integer
    readonly=True
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft'), ('test', 'Tested'), ('done', 'Sent')]
Public methods (1)
  • init(self)
    Mass Mail Statistical Report: based on mailing.trace that models the various statistics collected for each mailing, and mailing.mailing model that models the various mailing performed.

New fields (0)

No new fields.

Public methods (2)
  • get_mailing_snippet_info(self)
  • update_social_links(self, social_links)
    Update social media link fields without unnecessarily reloading a view (see reload_company_service.js). :param dict social_links: Social link field names to URL path. :raises UserError: If a provided key is not a valid social media field.

New fields (6)
  • group_mass_mailing_campaign Boolean
    help='This is useful if your marketing campaigns are composed of several emails' implied_group='mass_mailing.group_mass_mailing_campaign' string='Mailing Campaigns'
  • mass_mailing_mail_server_id Many2one → ir.mail_server
    config_parameter='mass_mailing.mail_server_id' string='Mail Server' args: 'ir.mail_server'
  • mass_mailing_outgoing_mail_server Boolean
    config_parameter='mass_mailing.outgoing_mail_server' help='Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.' string='Dedicated Server'
  • mass_mailing_reports Boolean
    config_parameter='mass_mailing.mass_mailing_reports' help='Check how well your mailing is doing a day after it has been sent.' string='24H Stat Mailing Reports'
  • mass_mailing_split_contact_name Boolean
    help='Separate Mailing Contact Names into two fields' string='Split First and Last Name'
  • show_blacklist_buttons Boolean
    config_parameter='mass_mailing.show_blacklist_buttons' default=True help='Allow the recipient to manage themselves their state in the blacklist via the unsubscription page.' string='Blacklist Option when Unsubscribing'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • mailing_contact_id Many2one → mailing.contact
    compute='_compute_mailing_contact_id' groups='mass_mailing.group_mass_mailing_user' string='Contact' args: 'mailing.contact'
  • mailing_contact_ids One2many → mailing.contact
    groups='mass_mailing.group_mass_mailing_user' string='Contacts' args: 'mailing.contact', 'partner_id'
Public methods (1)
  • action_open_mailing_contacts(self)
    Open form view if a single Mailing Contact is linked, multi-record view otherwise.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • ab_testing_completed Boolean
    compute='_compute_ab_testing_completed' copy=False readonly=True store=True args: 'A/B Testing Campaign Finished'
  • ab_testing_mailings_count Integer
    compute='_compute_mailing_mail_count' args: 'A/B Test Mailings #'
  • ab_testing_schedule_datetime Datetime
    default=<expr> help='Date that will be used to know when to determine and send the winner mailing' args: 'Send Final On'
  • ab_testing_winner_mailing_id Many2one → mailing.mailing
    copy=False args: 'mailing.mailing', 'A/B Campaign Winner Mailing'
  • ab_testing_winner_selection Selection
    default='opened_ratio' help='Selection to determine the winner mailing that will be sent.' string='Winner Selection' args: [('manual', 'Manual'), ('opened_ratio', 'Highest Open Rate'), ('clicks_ratio', 'Highest Click Rate'), ('replied_ratio', 'Highest Reply Rate')]
  • bounced_ratio Float
    compute='_compute_statistics' string='Bounced Ratio'
  • is_mailing_campaign_activated Boolean
    compute='_compute_is_mailing_campaign_activated'
  • mailing_mail_count Integer
    compute='_compute_mailing_mail_count' groups='mass_mailing.group_mass_mailing_user' args: 'Number of Mass Mailing'
  • mailing_mail_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'mail')] groups='mass_mailing.group_mass_mailing_user' string='Mass Mailings' args: 'mailing.mailing', 'campaign_id'
  • opened_ratio Float
    compute='_compute_statistics' string='Opened Ratio'
  • received_ratio Float
    compute='_compute_statistics' string='Received Ratio'
  • replied_ratio Float
    compute='_compute_statistics' string='Replied Ratio'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…