aboutsummaryrefslogtreecommitdiffstats
path: root/src/messagebuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/messagebuilder.cpp')
-rw-r--r--src/messagebuilder.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/messagebuilder.cpp b/src/messagebuilder.cpp
index fe23862..ea428ee 100644
--- a/src/messagebuilder.cpp
+++ b/src/messagebuilder.cpp
@@ -308,8 +308,21 @@ Result build(const OutgoingMessage &message, const Account &account)
// invariant the next early return forgets; it is assigned once, beside the
// bytes, on the one path that succeeds.
QString messageId;
- char *generatedId = g_mime_utils_generate_message_id(domainUtf8.constData());
- if (generatedId) {
+ if (!message.messageId.isEmpty()) {
+ // Item 165. A draft revision reuses the id its previous build
+ // returned, so a save REPLACES the message on the server rather than
+ // adding one. Only the autosave path supplies this; a send leaves it
+ // empty and gets a fresh id below, because two sent messages must
+ // never share one.
+ //
+ // set_message_id takes the id WITHOUT angle brackets and adds them,
+ // which is the form generate_message_id returns and the form this is
+ // stored in.
+ const QByteArray supplied = message.messageId.toUtf8();
+ g_mime_message_set_message_id(mime, supplied.constData());
+ messageId = message.messageId;
+ } else if (char *generatedId =
+ g_mime_utils_generate_message_id(domainUtf8.constData())) {
g_mime_message_set_message_id(mime, generatedId);
messageId = QString::fromUtf8(generatedId);
g_free(generatedId);