diff options
Diffstat (limited to 'mail/send.c')
-rw-r--r-- | mail/send.c | 137 |
1 files changed, 43 insertions, 94 deletions
diff --git a/mail/send.c b/mail/send.c index b8b74c2ea..72ebd3608 100644 --- a/mail/send.c +++ b/mail/send.c @@ -499,98 +499,51 @@ saveatt (void *item, void *data) } static int -add_body (mu_message_t inmsg, mu_iterator_t itr, mu_mime_t mime) +add_body (mu_message_t inmsg, compose_env_t *env) { - mu_body_t body; - mu_message_t part; - mu_stream_t str, output; - mu_header_t outhdr; - char *p; int rc; - + mu_body_t body; + mu_stream_t str; + struct atchinfo *aptr; + mu_message_get_body (inmsg, &body); - if (skip_empty_attachments || multipart_alternative) - { - size_t size; - rc = mu_body_size (body, &size); - if (rc) - { - mu_diag_funcall (MU_DIAG_ERROR, "mu_body_size", NULL, rc); - return -1; - } - if (size == 0) - return 0; - } - - /* Add original message as the first part */ - - /* 1. Create the part and obtain a reference to its stream */ - if ((rc = mu_message_create (&part, NULL)) == 0) - { - mu_body_t pbody; - - mu_message_get_body (part, &pbody); - mu_body_get_streamref (pbody, &output); - } - else - { - mu_diag_funcall (MU_DIAG_ERROR, "mu_message_create", NULL, rc); - return -1; - } - - /* 2. Get original body stream and copy it out to the part's body */ mu_body_get_streamref (body, &str); - mu_stream_copy (output, str, 0, NULL); - mu_stream_close (output); - mu_stream_destroy (&output); - - /* 3. Copy "Content-*" headers from the original message */ - mu_message_get_header (part, &outhdr); - for (mu_iterator_first (itr); !mu_iterator_is_done (itr); - mu_iterator_next (itr)) - { - const char *name, *value; - - if (mu_iterator_current_kv (itr, (const void **)&name, - (void**)&value) == 0) - { - if (mu_c_strncasecmp (name, "Content-", 8) == 0) - mu_header_set_value (outhdr, name, value, 0); - } - } + aptr = mu_alloc (sizeof (*aptr)); + aptr->id = NULL; + aptr->encoding = default_encoding ? mu_strdup (default_encoding) : NULL; + aptr->content_type = mu_strdup (default_content_type ? + default_content_type : "text/plain"); + aptr->name = NULL; + aptr->filename = NULL; + aptr->source = str; + aptr->skip_empty = skip_empty_attachments || multipart_alternative; + if (!env->attlist) + env->attlist = attlist_new (); + rc = mu_list_prepend (env->attlist, aptr); + if (rc) + mu_diag_funcall (MU_DIAG_ERROR, "mu_list_prepend", NULL, rc); + return rc; +} - /* 4. Add the content type and content ID headers. */ - mu_header_set_value (outhdr, MU_HEADER_CONTENT_TYPE, - default_content_type ? default_content_type : "text/plain", - 0); - mu_rfc2822_msg_id (0, &p); - mu_header_set_value (outhdr, MU_HEADER_CONTENT_ID, p, 1); - free (p); - - /* 5. Add part to the mime object */ - mu_mime_add_part (mime, part); - mu_message_unref (part); - - return 0; -} - static int add_attachments (compose_env_t *env, mu_message_t *pmsg) { mu_message_t inmsg, outmsg; mu_header_t inhdr, outhdr; mu_iterator_t itr; - mu_mime_t mime; int rc; + inmsg = *pmsg; + + if (mailvar_is_true ("mime") && add_body (inmsg, env)) + return 1; + if (mu_list_is_empty (env->attlist)) return 0; - inmsg = *pmsg; - /* Create a mime object */ - rc = mu_mime_create (&mime, NULL, + rc = mu_mime_create (&env->mime, NULL, env->alt ? MU_MIME_MULTIPART_ALT : MU_MIME_MULTIPART_MIXED); if (rc) @@ -600,39 +553,35 @@ add_attachments (compose_env_t *env, mu_message_t *pmsg) } mu_message_get_header (inmsg, &inhdr); - mu_header_get_iterator (inhdr, &itr); - - if (add_body (inmsg, itr, mime)) - { - mu_mime_destroy (&mime); - mu_iterator_destroy (&itr); - return 1; - } - - env->mime = mime; /* Add the respective attachments */ rc = mu_list_foreach (env->attlist, saveatt, env); if (rc) - { - mu_mime_destroy (&mime); - mu_iterator_destroy (&itr); - return 1; - } + return 1; /* Get the resulting message */ - rc = mu_mime_get_message (mime, &outmsg); + rc = mu_mime_get_message (env->mime, &outmsg); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_mime_get_message", NULL, rc); - mu_mime_destroy (&mime); - mu_iterator_destroy (&itr); return 1; } /* Copy rest of headers from the original message */ - mu_message_get_header (outmsg, &outhdr); + rc = mu_message_get_header (outmsg, &outhdr); + if (rc) + { + mu_diag_funcall (MU_DIAG_ERROR, "mu_message_get_header", NULL, rc); + return 1; + } + + rc = mu_header_get_iterator (inhdr, &itr); + if (rc) + { + mu_diag_funcall (MU_DIAG_ERROR, "mu_header_get_iterator", NULL, rc); + return 1; + } for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next (itr)) { @@ -1356,7 +1305,7 @@ mail_send0 (compose_env_t *env, int save_to) mu_message_set_header (msg, env->header, NULL); env->header = NULL; - + status = add_attachments (env, &msg); if (status) break; |