using std::list;
using std::shared_ptr;
using std::string;
+using std::vector;
using boost::optional;
{
int written = 0;
- for (auto const& i: kdms) {
+ for (auto const& kdm: kdms) {
auto path = directory;
- path /= container_name_format.get(i.front()->name_values(), "", "s");
+ path /= container_name_format.get(kdm.front()->name_values(), "", "s");
if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
boost::filesystem::create_directories (path);
- write_files (i, path, filename_format, confirm_overwrite);
+ write_files(kdm, path, filename_format, confirm_overwrite);
+ written += kdm.size();
}
- written += i.size();
}
return written;
{
int written = 0;
- for (auto const& i: kdms) {
+ for (auto const& kdm: kdms) {
auto path = directory;
- path /= container_name_format.get(i.front()->name_values(), ".zip", "s");
+ path /= container_name_format.get(kdm.front()->name_values(), ".zip", "s");
if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
if (boost::filesystem::exists (path)) {
/* Creating a new zip file over an existing one is an error */
boost::filesystem::remove (path);
}
- make_zip_file (i, path, filename_format);
- written += i.size();
+ make_zip_file(kdm, path, filename_format);
+ written += kdm.size();
}
}
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 ();
throw NetworkError (_("No mail server configured in preferences"));
}
- for (auto const& i: kdms) {
+ if (config->kdm_from().empty()) {
+ throw NetworkError(_("No KDM from address configured in preferences"));
+ }
- if (i.front()->emails().empty()) {
- continue;
- }
+ for (auto const& kdms_for_cinema: kdms) {
+
+ auto first = kdms_for_cinema.front();
auto zip_file = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path();
boost::filesystem::create_directories (zip_file);
- zip_file /= container_name_format.get(i.front()->name_values(), ".zip");
- make_zip_file (i, zip_file, filename_format);
-
- auto substitute_variables = [cpl_name, i](string target) {
- boost::algorithm::replace_all (target, "$CPL_NAME", cpl_name);
- boost::algorithm::replace_all (target, "$START_TIME", i.front()->get('b').get_value_or(""));
- boost::algorithm::replace_all (target, "$END_TIME", i.front()->get('e').get_value_or(""));
- boost::algorithm::replace_all (target, "$CINEMA_NAME", i.front()->get('c').get_value_or(""));
- boost::algorithm::replace_all (target, "$CINEMA_SHORT_NAME", i.front()->get('c').get_value_or("").substr(0, 14));
+ zip_file /= container_name_format.get(first->name_values(), ".zip");
+ make_zip_file (kdms_for_cinema, zip_file, filename_format);
+
+ auto substitute_variables = [cpl_name, first](string target) {
+ boost::algorithm::replace_all(target, "$CPL_NAME", cpl_name);
+ boost::algorithm::replace_all(target, "$START_TIME", first->get('b').get_value_or(""));
+ boost::algorithm::replace_all(target, "$END_TIME", first->get('e').get_value_or(""));
+ boost::algorithm::replace_all(target, "$CINEMA_NAME", first->get('c').get_value_or(""));
+ boost::algorithm::replace_all(target, "$CINEMA_SHORT_NAME", first->get('c').get_value_or("").substr(0, 14));
return target;
};
auto body = substitute_variables(config->kdm_email());
string screens;
- for (auto j: i) {
- auto screen_name = j->get('s');
+ for (auto kdm: kdms_for_cinema) {
+ auto screen_name = kdm->get('s');
if (screen_name) {
screens += *screen_name + ", ";
}
}
boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2));
- Emailer email (config->kdm_from(), i.front()->emails(), subject, body);
+ auto emails = first->emails();
+ std::copy(extra_addresses.begin(), extra_addresses.end(), std::back_inserter(emails));
+ if (emails.empty()) {
+ continue;
+ }
+
+ Emailer email (config->kdm_from(), { emails.front() }, subject, body);
- for (auto i: config->kdm_cc()) {
- email.add_cc (i);
+ /* 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);
}
if (!config->kdm_bcc().empty()) {
email.add_bcc (config->kdm_bcc());
}
- email.add_attachment (zip_file, container_name_format.get(i.front()->name_values(), ".zip"), "application/zip");
+ 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);
+ boost::filesystem::remove (zip_file);
}
}