Author |
|
HPS Newbie
Joined: 06 August 2013 Location: Germany
Online Status: Offline Posts: 8
|
Posted: 14 August 2019 at 4:52am | IP Logged
|
|
|
Hello,
we need to download "new" mails from a pop3 e-mail account. After downloading these mails, we can't delete them, because it must be possible to read them with other devices.
We want to use the method "Pop3.DownloadMessageHeaders Method (startIndex , count)" to get the headers of the "last" 20 mails in the account.
Then we want to check the messageId and date of each header and compare it with our internaly stored messageId and date combinations.
If all 20 messageId/date combination are "unkown", the next 20 headers must be checked.
The first "known" combination of messageId/date would be the "latest" mail we have downloaded and all before checked mails would be "new" mails.
Now to the question:
Are new mails always be appended to the last position of enumeration of mail on the mailserver?
Is it guaranteed that the position of new mails are the "last" in the enumeration, which we get from Pop3.DownloadMessageHeaders?
Or could it be that new mails are somewhere in between and mixed with older ones?
Greetings
Hans-Peter
|
Back to Top |
|
|
Alex AfterLogic Support
Joined: 19 November 2003
Online Status: Offline Posts: 2206
|
Posted: 14 August 2019 at 8:04am | IP Logged
|
|
|
Hi,
Don't use headers and Message-ID. Use UID values instead.
storedUids = db.GetUidsForAccount(accountID);
actualUids = pop.GetMessageUids;
foreach (actualUid in actualUids)
{
if (!storedUids.IndexOf(actualUid))
{
newUids.Add(actualUid); // This UID was not in the mailbox before
}
}
now you can download the messages denoted by newUids
foreach (newUid in newUids)
{
int msgIndex = pop.GetMessageIndexFromUid(newUid);
MailMessage msg = pop.DownloadEntireMessage(msgIndex);
...
}
now update database (you'll need to implement 'db' methods on your own):
db.ClearUidsForAccount(accountID); // remove all existing entries
db.SaveUidsForAccount(accountID, actualUids);
or you can avoid overwriting all stored UIDs each time:
db.SaveUidsForAccount(accountID, newUids);
The latter will only add new UIDs but it won't remove entries which are no longer on the POP3 server. Assuming that mails are rarely deleted, these redundant entries won't take up much space. Anyway, you can remove them too, if you wish:
foreach (storedUid in storedUids)
{
if (!actualUids.IndexOf(storedUid))
{
nonExistentUids.Add(storedUid); // This UID is no longer in the mailbox
}
}
db.RemoveUidsFromAccount(accountID, nonExistentUids);
Regards,
Alex
|
Back to Top |
|
|
HPS Newbie
Joined: 06 August 2013 Location: Germany
Online Status: Offline Posts: 8
|
Posted: 14 August 2019 at 10:12pm | IP Logged
|
|
|
Hi Alex,
I can't use UID because the mailserver, we must support, doesn't support UID. The UID of a message is nothing. We can not store a UID. We store the messageId and date of each received message. That's not the fastest way, but we can identify each mail we've already received.
So we need another way to reduce the message-headers we must download to identify new messages and the only way I can see is to rely on IndexOnServer.
That's the cause for my question.
I new messages are not appended at the end of the "index", this alternative wouldn't work well.
In your sample https://afterlogic.com/mailbee/docs/#KB_ReceivingNewMessagesPOP3_VB1.htm Part 2,
there is a comment "Another important fact is that new messages are always appended to the end of the mailbox. ". It seems to me, that IndexOnServer could work instead of UID - but I'm not shure if this works.
So - Is it guaranteed that the position of new mails are the "last" in the enumeration, which we get from Pop3.DownloadMessageHeaders?
Greetings
Hans-Peter
|
Back to Top |
|
|
Alex AfterLogic Support
Joined: 19 November 2003
Online Status: Offline Posts: 2206
|
Posted: 15 August 2019 at 1:52am | IP Logged
|
|
|
Hi Hans-Peter,
Oh. Never faced POP3 server without UID support before.
Well, you can indeed rely on the fact that new messages are always appended to the end of the mailbox. So if you download, let's say, last 20 headers and then iterate from the last one to the first one, you can check if you already have the message-id in your db. Once you got the match, you can assume that older messages are already in sync. If all 20 messages are new, then you download the previous 20 headers, and so on.
Once you reached the last old message (so that the first new message is +1 to it), you can start downloading them entirely, and save them in db (now in ascending order, not descending).
Regards,
Alex
|
Back to Top |
|
|
HPS Newbie
Joined: 06 August 2013 Location: Germany
Online Status: Offline Posts: 8
|
Posted: 15 August 2019 at 10:29pm | IP Logged
|
|
|
Thank you Alex - that helps.
|
Back to Top |
|
|