{
struct mail_namespace *ns;
struct mailbox *box;
+ enum mailbox_transaction_flags trans_flags;
struct mailbox_transaction_context *t;
struct mail_save_context *save_ctx;
struct mail_keywords *kw;
enum mail_error error;
const char *mailbox_name;
+ uint32_t uid_validity, uid1 = 0, uid2 = 0;
bool default_save;
int ret = 0;
return -1;
}
- t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL);
+ trans_flags = MAILBOX_TRANSACTION_FLAG_EXTERNAL;
+ if (ctx->save_dest_mail)
+ trans_flags |= MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS;
+ t = mailbox_transaction_begin(box, trans_flags);
kw = str_array_length(keywords) == 0 ? NULL :
mailbox_keywords_create_valid(box, keywords);
if (ret < 0)
mailbox_transaction_rollback(&t);
- else
- ret = mailbox_transaction_commit(&t);
+ else {
+ ret = mailbox_transaction_commit_get_uids(&t, &uid_validity,
+ &uid1, &uid2);
+ }
if (ret == 0) {
ctx->saved_mail = TRUE;
mail_deliver_log(ctx, "saved mail to %s", mailbox_name);
+
+ if (ctx->save_dest_mail && mailbox_sync(box, 0, 0, NULL) == 0) {
+ i_assert(uid1 == uid2);
+
+ t = mailbox_transaction_begin(box, 0);
+ ctx->dest_mail = mail_alloc(t, MAIL_FETCH_STREAM_BODY,
+ NULL);
+ if (mail_set_uid(ctx->dest_mail, uid1) < 0) {
+ mail_free(&ctx->dest_mail);
+ mailbox_transaction_rollback(&t);
+ }
+ }
} else {
mail_deliver_log(ctx, "save failed to %s: %s", mailbox_name,
mail_storage_get_last_error(*storage_r, &error));
}
- mailbox_close(&box);
+ if (ctx->dest_mail == NULL)
+ mailbox_close(&box);
return ret;
}