When emailing multiple addresses, put one in To: and the rest in CC: (#2310).
[dcpomatic.git] / src / lib / kdm_with_metadata.cc
index a826327ca1bff8f692f019cb0d178663de1baa8d..7dee935c4a0346c2b11b97aee5e2268f87055baf 100644 (file)
@@ -38,6 +38,7 @@ using std::function;
 using std::list;
 using std::shared_ptr;
 using std::string;
+using std::vector;
 using boost::optional;
 
 
@@ -201,7 +202,8 @@ send_emails (
        list<list<KDMWithMetadataPtr>> kdms,
        dcp::NameFormat container_name_format,
        dcp::NameFormat filename_format,
-       string cpl_name
+       string cpl_name,
+       vector<string> extra_addresses
        )
 {
        auto config = Config::instance ();
@@ -210,6 +212,10 @@ send_emails (
                throw NetworkError (_("No mail server configured in preferences"));
        }
 
+       if (config->kdm_from().empty()) {
+               throw NetworkError(_("No KDM from address configured in preferences"));
+       }
+
        for (auto const& kdms_for_cinema: kdms) {
 
                auto first = kdms_for_cinema.front();
@@ -244,7 +250,13 @@ send_emails (
                }
                boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2));
 
-               Emailer email (config->kdm_from(), first->emails(), subject, body);
+               auto emails = first->emails();
+               Emailer email (config->kdm_from(), { emails.front() }, subject, body);
+
+               /* Use CC for the second and subsequent email addresses, so we seem less spammy (#2310) */
+               for (auto cc = std::next(emails.begin()); cc != emails.end(); ++cc) {
+                       email.add_cc(*cc);
+               }
 
                for (auto cc: config->kdm_cc()) {
                        email.add_cc (cc);
@@ -255,22 +267,38 @@ send_emails (
 
                email.add_attachment (zip_file, container_name_format.get(first->name_values(), ".zip"), "application/zip");
 
+               auto log_details = [](Emailer& email) {
+                       dcpomatic_log->log("Email content follows", LogEntry::TYPE_DEBUG_EMAIL);
+                       dcpomatic_log->log(email.email(), LogEntry::TYPE_DEBUG_EMAIL);
+                       dcpomatic_log->log("Email session follows", LogEntry::TYPE_DEBUG_EMAIL);
+                       dcpomatic_log->log(email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
+               };
+
                try {
                        email.send (config->mail_server(), config->mail_port(), config->mail_protocol(), config->mail_user(), config->mail_password());
                } catch (...) {
                        boost::filesystem::remove (zip_file);
-                       dcpomatic_log->log ("Email content follows", LogEntry::TYPE_DEBUG_EMAIL);
-                       dcpomatic_log->log (email.email(), LogEntry::TYPE_DEBUG_EMAIL);
-                       dcpomatic_log->log ("Email session follows", LogEntry::TYPE_DEBUG_EMAIL);
-                       dcpomatic_log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
+                       log_details (email);
                        throw;
                }
 
-               boost::filesystem::remove (zip_file);
+               log_details (email);
 
-               dcpomatic_log->log ("Email content follows", LogEntry::TYPE_DEBUG_EMAIL);
-               dcpomatic_log->log (email.email(), LogEntry::TYPE_DEBUG_EMAIL);
-               dcpomatic_log->log ("Email session follows", LogEntry::TYPE_DEBUG_EMAIL);
-               dcpomatic_log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL);
+               for (auto extra: extra_addresses) {
+                       Emailer email (config->kdm_from(), { extra }, subject, body);
+                       email.add_attachment (zip_file, container_name_format.get(first->name_values(), ".zip"), "application/zip");
+
+                       try {
+                               email.send (config->mail_server(), config->mail_port(), config->mail_protocol(), config->mail_user(), config->mail_password());
+                       } catch (...) {
+                               boost::filesystem::remove (zip_file);
+                               log_details (email);
+                               throw;
+                       }
+
+                       log_details (email);
+               }
+
+               boost::filesystem::remove (zip_file);
        }
 }