mirror of https://github.com/M66B/FairEmail.git
Use own message id to relate local and remote messages
This commit is contained in:
parent
b86f70bccb
commit
d3a235e2d0
|
@ -82,8 +82,8 @@ public class MessageHelper {
|
||||||
return props;
|
return props;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MimeMessage from(EntityMessage message, Session isession) throws MessagingException {
|
static MimeMessageEx from(EntityMessage message, Session isession) throws MessagingException {
|
||||||
MimeMessage imessage = new MimeMessage(isession);
|
MimeMessageEx imessage = new MimeMessageEx(isession, message.id);
|
||||||
|
|
||||||
if (message.from != null) {
|
if (message.from != null) {
|
||||||
Address[] from = MessageHelper.decodeAddresses(message.from);
|
Address[] from = MessageHelper.decodeAddresses(message.from);
|
||||||
|
@ -111,8 +111,8 @@ public class MessageHelper {
|
||||||
return imessage;
|
return imessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MimeMessage from(EntityMessage message, EntityMessage reply, Session isession) throws MessagingException {
|
static MimeMessageEx from(EntityMessage message, EntityMessage reply, Session isession) throws MessagingException {
|
||||||
MimeMessage imessage = from(message, isession);
|
MimeMessageEx imessage = from(message, isession);
|
||||||
imessage.addHeader("In-Reply-To", reply.msgid);
|
imessage.addHeader("In-Reply-To", reply.msgid);
|
||||||
imessage.addHeader("References", (reply.references == null ? "" : reply.references + " ") + reply.msgid);
|
imessage.addHeader("References", (reply.references == null ? "" : reply.references + " ") + reply.msgid);
|
||||||
return imessage;
|
return imessage;
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
package eu.faircode.email;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.Session;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
|
||||||
|
public class MimeMessageEx extends MimeMessage {
|
||||||
|
private long id = -1;
|
||||||
|
|
||||||
|
public MimeMessageEx(Session session, long id) {
|
||||||
|
super(session);
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateMessageID() throws MessagingException {
|
||||||
|
try {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append('<')
|
||||||
|
.append(id).append('.')
|
||||||
|
.append(BuildConfig.APPLICATION_ID).append('.')
|
||||||
|
.append(System.currentTimeMillis()).append('.')
|
||||||
|
.append("anonymous@localhost")
|
||||||
|
.append('>');
|
||||||
|
|
||||||
|
setHeader("Message-ID", sb.toString());
|
||||||
|
Log.i(Helper.TAG, "Override Message-ID=" + sb.toString());
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex));
|
||||||
|
super.updateMessageID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getId(MimeMessage message) {
|
||||||
|
try {
|
||||||
|
String msgid = message.getMessageID();
|
||||||
|
if (msgid == null)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
List<String> parts = new ArrayList<>(Arrays.asList(msgid.split("\\.")));
|
||||||
|
if (parts.size() < 1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
String part = parts.get(0);
|
||||||
|
parts.remove(0);
|
||||||
|
if (!TextUtils.join(".", parts).startsWith(BuildConfig.APPLICATION_ID))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
long id = Long.parseLong(part.substring(1));
|
||||||
|
Log.i(Helper.TAG, "Parsed Message-ID=" + msgid + " id=" + id);
|
||||||
|
return id;
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -711,18 +711,13 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
ifolder.appendMessages(new Message[]{imessage});
|
ifolder.appendMessages(new Message[]{imessage});
|
||||||
|
|
||||||
// Drafts can be appended multiple times
|
// Drafts can be appended multiple times
|
||||||
try {
|
if (msg.uid != null) {
|
||||||
if (msg.uid != null) {
|
Message previously = ifolder.getMessageByUID(msg.uid);
|
||||||
Message previously = ifolder.getMessageByUID(msg.uid);
|
if (previously == null)
|
||||||
if (previously == null)
|
throw new MessageRemovedException();
|
||||||
throw new MessageRemovedException();
|
|
||||||
|
|
||||||
previously.setFlag(Flags.Flag.DELETED, true);
|
previously.setFlag(Flags.Flag.DELETED, true);
|
||||||
ifolder.expunge();
|
ifolder.expunge();
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
// Remote will report appended
|
|
||||||
message.deleteMessage(op.message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (EntityOperation.MOVE.equals(op.name)) {
|
} else if (EntityOperation.MOVE.equals(op.name)) {
|
||||||
|
@ -789,7 +784,9 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
Log.i(Helper.TAG, "Sent via " + ident.host + "/" + ident.user +
|
Log.i(Helper.TAG, "Sent via " + ident.host + "/" + ident.user +
|
||||||
" to " + TextUtils.join(", ", to));
|
" to " + TextUtils.join(", ", to));
|
||||||
|
|
||||||
message.deleteMessage(op.message);
|
msg.ui_hide = true;
|
||||||
|
message.updateMessage(msg);
|
||||||
|
// TODO: purge sent messages
|
||||||
} finally {
|
} finally {
|
||||||
itransport.close();
|
itransport.close();
|
||||||
}
|
}
|
||||||
|
@ -1002,13 +999,14 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void synchronizeMessage(EntityFolder folder, IMAPFolder ifolder, IMAPMessage imessage) throws MessagingException, JSONException, IOException {
|
private void synchronizeMessage(EntityFolder folder, IMAPFolder ifolder, IMAPMessage imessage) throws MessagingException, JSONException, IOException {
|
||||||
FetchProfile fp = new FetchProfile();
|
long uid = -1;
|
||||||
fp.add(UIDFolder.FetchProfileItem.UID);
|
|
||||||
fp.add(IMAPFolder.FetchProfileItem.FLAGS);
|
|
||||||
ifolder.fetch(new Message[]{imessage}, fp);
|
|
||||||
|
|
||||||
long uid = ifolder.getUID(imessage);
|
|
||||||
try {
|
try {
|
||||||
|
FetchProfile fp = new FetchProfile();
|
||||||
|
fp.add(UIDFolder.FetchProfileItem.UID);
|
||||||
|
fp.add(IMAPFolder.FetchProfileItem.FLAGS);
|
||||||
|
ifolder.fetch(new Message[]{imessage}, fp);
|
||||||
|
|
||||||
|
uid = ifolder.getUID(imessage);
|
||||||
Log.i(Helper.TAG, folder.name + " start sync uid=" + uid);
|
Log.i(Helper.TAG, folder.name + " start sync uid=" + uid);
|
||||||
|
|
||||||
if (imessage.isExpunged()) {
|
if (imessage.isExpunged()) {
|
||||||
|
@ -1033,7 +1031,12 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
fp1.add(IMAPFolder.FetchProfileItem.MESSAGE);
|
fp1.add(IMAPFolder.FetchProfileItem.MESSAGE);
|
||||||
ifolder.fetch(new Message[]{imessage}, fp1);
|
ifolder.fetch(new Message[]{imessage}, fp1);
|
||||||
|
|
||||||
message = new EntityMessage();
|
long id = MimeMessageEx.getId(imessage);
|
||||||
|
message = db.message().getMessage(id);
|
||||||
|
boolean update = (message != null);
|
||||||
|
if (message == null)
|
||||||
|
message = new EntityMessage();
|
||||||
|
|
||||||
message.account = folder.account;
|
message.account = folder.account;
|
||||||
message.folder = folder.id;
|
message.folder = folder.id;
|
||||||
message.uid = uid;
|
message.uid = uid;
|
||||||
|
@ -1054,8 +1057,13 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
message.ui_seen = seen;
|
message.ui_seen = seen;
|
||||||
message.ui_hide = false;
|
message.ui_hide = false;
|
||||||
|
|
||||||
message.id = db.message().insertMessage(message);
|
if (update) {
|
||||||
Log.i(Helper.TAG, folder.name + " added id=" + message.id);
|
db.message().updateMessage(message);
|
||||||
|
Log.i(Helper.TAG, folder.name + " updated id=" + message.id);
|
||||||
|
} else {
|
||||||
|
message.id = db.message().insertMessage(message);
|
||||||
|
Log.i(Helper.TAG, folder.name + " added id=" + message.id);
|
||||||
|
}
|
||||||
|
|
||||||
int sequence = 0;
|
int sequence = 0;
|
||||||
for (EntityAttachment attachment : helper.getAttachments()) {
|
for (EntityAttachment attachment : helper.getAttachments()) {
|
||||||
|
@ -1066,7 +1074,6 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
attachment.sequence = sequence;
|
attachment.sequence = sequence;
|
||||||
attachment.id = db.attachment().insertAttachment(attachment);
|
attachment.id = db.attachment().insertAttachment(attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (message.seen != seen) {
|
} else if (message.seen != seen) {
|
||||||
message.seen = seen;
|
message.seen = seen;
|
||||||
message.ui_seen = seen;
|
message.ui_seen = seen;
|
||||||
|
@ -1074,6 +1081,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
db.message().updateMessage(message);
|
db.message().updateMessage(message);
|
||||||
Log.i(Helper.TAG, folder.name + " updated id=" + message.id);
|
Log.i(Helper.TAG, folder.name + " updated id=" + message.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
Log.i(Helper.TAG, folder.name + " end sync uid=" + uid);
|
Log.i(Helper.TAG, folder.name + " end sync uid=" + uid);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue