- $protocols = CRM_Core_PseudoConstant::get('CRM_Core_DAO_MailSettings', 'protocol');
- if (empty($protocols[$dao->protocol])) {
- throw new Exception("Empty mail protocol");
+ $protocols = CRM_Core_PseudoConstant::get('CRM_Core_DAO_MailSettings', 'protocol', [], 'validate');
+
+ // Prepare normalized/hookable representation of the mail settings.
+ $mailSettings = $dao->toArray();
+ $mailSettings['protocol'] = $protocols[$mailSettings['protocol']] ?? NULL;
+ $protocolDefaults = self::getProtocolDefaults($mailSettings['protocol']);
+ $mailSettings = array_merge($protocolDefaults, $mailSettings);
+
+ CRM_Utils_Hook::alterMailStore($mailSettings);
+
+ if (!empty($mailSettings['factory'])) {
+ return call_user_func($mailSettings['factory'], $mailSettings);