aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-composer-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-composer-utils.c')
-rw-r--r--mail/em-composer-utils.c176
1 files changed, 172 insertions, 4 deletions
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index 630fe0f77a..44e8619e5d 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -1103,6 +1103,8 @@ create_new_composer (EShell *shell,
e_composer_header_table_set_subject (table, subject);
e_composer_header_table_set_identity_uid (table, identity);
+ em_utils_apply_send_account_override_to_composer (composer, shell, folder);
+
g_free (identity);
g_object_unref (client_cache);
@@ -1140,6 +1142,83 @@ em_utils_compose_new_message (EShell *shell,
return composer;
}
+static CamelMimeMessage *
+em_utils_get_composer_recipients_as_message (EMsgComposer *composer)
+{
+ CamelMimeMessage *message;
+ EComposerHeaderTable *table;
+ EComposerHeader *header;
+ EDestination **destv;
+ CamelInternetAddress *to_addr, *cc_addr, *bcc_addr, *dest_addr;
+ const gchar *text_addr;
+ gint ii;
+
+ g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL);
+
+ table = e_msg_composer_get_header_table (composer);
+ header = e_composer_header_table_get_header (table, E_COMPOSER_HEADER_TO);
+
+ if (!e_composer_header_get_visible (header))
+ return NULL;
+
+ message = camel_mime_message_new ();
+
+ to_addr = camel_internet_address_new ();
+ cc_addr = camel_internet_address_new ();
+ bcc_addr = camel_internet_address_new ();
+
+ /* To */
+ dest_addr = to_addr;
+ destv = e_composer_header_table_get_destinations_to (table);
+ for (ii = 0; destv != NULL && destv[ii] != NULL; ii++) {
+ text_addr = e_destination_get_address (destv[ii]);
+ if (text_addr && *text_addr) {
+ if (camel_address_decode (CAMEL_ADDRESS (dest_addr), text_addr) <= 0)
+ camel_internet_address_add (dest_addr, "", text_addr);
+ }
+ }
+ e_destination_freev (destv);
+
+ /* CC */
+ dest_addr = cc_addr;
+ destv = e_composer_header_table_get_destinations_cc (table);
+ for (ii = 0; destv != NULL && destv[ii] != NULL; ii++) {
+ text_addr = e_destination_get_address (destv[ii]);
+ if (text_addr && *text_addr) {
+ if (camel_address_decode (CAMEL_ADDRESS (dest_addr), text_addr) <= 0)
+ camel_internet_address_add (dest_addr, "", text_addr);
+ }
+ }
+ e_destination_freev (destv);
+
+ /* Bcc */
+ dest_addr = bcc_addr;
+ destv = e_composer_header_table_get_destinations_bcc (table);
+ for (ii = 0; destv != NULL && destv[ii] != NULL; ii++) {
+ text_addr = e_destination_get_address (destv[ii]);
+ if (text_addr && *text_addr) {
+ if (camel_address_decode (CAMEL_ADDRESS (dest_addr), text_addr) <= 0)
+ camel_internet_address_add (dest_addr, "", text_addr);
+ }
+ }
+ e_destination_freev (destv);
+
+ if (camel_address_length (CAMEL_ADDRESS (to_addr)) > 0)
+ camel_mime_message_set_recipients (message, CAMEL_RECIPIENT_TYPE_TO, to_addr);
+
+ if (camel_address_length (CAMEL_ADDRESS (cc_addr)) > 0)
+ camel_mime_message_set_recipients (message, CAMEL_RECIPIENT_TYPE_CC, cc_addr);
+
+ if (camel_address_length (CAMEL_ADDRESS (bcc_addr)) > 0)
+ camel_mime_message_set_recipients (message, CAMEL_RECIPIENT_TYPE_BCC, bcc_addr);
+
+ g_object_unref (to_addr);
+ g_object_unref (cc_addr);
+ g_object_unref (bcc_addr);
+
+ return message;
+}
+
/**
* em_utils_compose_new_message_with_mailto:
* @shell: an #EShell
@@ -1170,6 +1249,8 @@ em_utils_compose_new_message_with_mailto (EShell *shell,
else
composer = e_msg_composer_new (shell);
+ em_utils_apply_send_account_override_to_composer (composer, shell, folder);
+
table = e_msg_composer_get_header_table (composer);
client_cache = e_composer_header_table_ref_client_cache (table);
@@ -1459,6 +1540,9 @@ em_utils_edit_message (EShell *shell,
}
composer = e_msg_composer_new_with_message (shell, message, keep_signature, NULL);
+
+ em_utils_apply_send_account_override_to_composer (composer, shell, folder);
+
if (!folder_is_templates) {
EComposerHeaderTable *table;
ESource *source;
@@ -1907,8 +1991,10 @@ redirect_get_composer (EShell *shell,
registry = e_shell_get_registry (shell);
/* This returns a new ESource reference. */
- source = em_utils_guess_mail_identity_with_recipients_and_sort (
- registry, message, NULL, NULL, sort_sources_by_ui, shell);
+ source = em_utils_check_send_account_override (shell, message, NULL);
+ if (!source)
+ source = em_utils_guess_mail_identity_with_recipients_and_sort (
+ registry, message, NULL, NULL, sort_sources_by_ui, shell);
if (source != NULL) {
identity_uid = e_source_dup_uid (source);
@@ -2851,8 +2937,10 @@ em_utils_reply_to_message (EShell *shell,
registry = e_shell_get_registry (shell);
/* This returns a new ESource reference. */
- source = em_utils_guess_mail_identity_with_recipients_and_sort (
- registry, message, folder, message_uid, sort_sources_by_ui, shell);
+ source = em_utils_check_send_account_override (shell, message, folder);
+ if (!source)
+ source = em_utils_guess_mail_identity_with_recipients_and_sort (
+ registry, message, folder, message_uid, sort_sources_by_ui, shell);
if (source != NULL) {
identity_uid = e_source_dup_uid (source);
g_object_unref (source);
@@ -2920,6 +3008,9 @@ em_utils_reply_to_message (EShell *shell,
g_free (tmp_message_uid);
}
+ /* because some reply types can change recipients after the composer is populated */
+ em_utils_apply_send_account_override_to_composer (composer, shell, folder);
+
composer_set_no_change (composer);
gtk_widget_show (GTK_WIDGET (composer));
@@ -3058,3 +3149,80 @@ em_configure_new_composer (EMsgComposer *composer,
header, "clicked",
G_CALLBACK (post_header_clicked_cb), session);
}
+
+/* free returned pointer with g_object_unref(), if not NULL */
+ESource *
+em_utils_check_send_account_override (EShell *shell,
+ CamelMimeMessage *message,
+ CamelFolder *folder)
+{
+ EMailBackend *mail_backend;
+ EMailSendAccountOverride *account_override;
+ CamelInternetAddress *to = NULL, *cc = NULL, *bcc = NULL;
+ gchar *folder_uri = NULL, *account_uid;
+ ESource *account_source = NULL;
+ ESourceRegistry *source_registry;
+
+ g_return_val_if_fail (E_IS_SHELL (shell), NULL);
+
+ if (!message && !folder)
+ return NULL;
+
+ if (message) {
+ to = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO);
+ cc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
+ bcc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC);
+ }
+
+ mail_backend = E_MAIL_BACKEND (e_shell_get_backend_by_name (shell, "mail"));
+ g_return_val_if_fail (mail_backend != NULL, NULL);
+
+ if (folder)
+ folder_uri = e_mail_folder_uri_from_folder (folder);
+
+ source_registry = e_shell_get_registry (shell);
+ account_override = e_mail_backend_get_send_account_override (mail_backend);
+ account_uid = e_mail_send_account_override_get_account_uid (account_override, folder_uri, to, cc, bcc);
+
+ while (account_uid) {
+ account_source = e_source_registry_ref_source (source_registry, account_uid);
+ if (account_source)
+ break;
+
+ /* stored send account override settings contain a reference
+ to a dropped account, thus cleanup it now */
+ e_mail_send_account_override_remove_for_account_uid (account_override, account_uid);
+
+ g_free (account_uid);
+ account_uid = e_mail_send_account_override_get_account_uid (account_override, folder_uri, to, cc, bcc);
+ }
+
+ g_free (folder_uri);
+ g_free (account_uid);
+
+ return account_source;
+}
+
+void
+em_utils_apply_send_account_override_to_composer (EMsgComposer *composer,
+ EShell *shell,
+ CamelFolder *folder)
+{
+ CamelMimeMessage *message;
+ EComposerHeaderTable *header_table;
+ ESource *source;
+
+ g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+
+ message = em_utils_get_composer_recipients_as_message (composer);
+ source = em_utils_check_send_account_override (shell, message, folder);
+ g_object_unref (message);
+
+ if (!source)
+ return;
+
+ header_table = e_msg_composer_get_header_table (composer);
+ e_composer_header_table_set_identity_uid (header_table, e_source_get_uid (source));
+
+ g_object_unref (source);
+}