mirror of
https://github.com/mjl-/mox.git
synced 2025-07-12 17:44:35 +03:00
fix handling of reputation for messages that were moved out of the rejects mailbox
the idea of the rejects mailbox is to show messages that were rejected. you can look there, and if you see a message that should have been delivered, you can move it to your inbox or archive. next time a deliver attempt by that user is attempted, they should be accepted, because you corrected the reject. but that wasn't happening, because the reputation-calculation is per-delivery mailbox (e.g. Inbox) and we look at MailboxOrigID when calculating the reputation. and that was set to the Rejects mailbox id, so the message wasn't considered. the same applies to moving messages from Rejects to Junk (to train your filter). we now keep track of a MailboxDestinedID, that is set to the mailbox that we would have delivered to if we would not have rejected the message. then, when a message is moved out of the Rejects mailbox, we change MailboxOrigID to MailboxDestinedID. this essentially makes the message look like it was delivered normally.
This commit is contained in:
@ -163,8 +163,8 @@ func analyze(ctx context.Context, log *mlog.Log, resolver dns.Resolver, d delive
|
||||
err = d.acc.DB.Read(func(tx *bstore.Tx) error {
|
||||
// Set message MailboxID to which mail will be delivered. Reputation is
|
||||
// per-mailbox. If referenced mailbox is not found (e.g. does not yet exist), we
|
||||
// can still use determine a reputation because we also base it on outgoing
|
||||
// messages and those account-global.
|
||||
// can still determine a reputation because we also base it on outgoing
|
||||
// messages and those are account-global.
|
||||
mailbox := d.rcptAcc.destination.Mailbox
|
||||
if mailbox == "" {
|
||||
mailbox = "Inbox"
|
||||
@ -174,7 +174,15 @@ func analyze(ctx context.Context, log *mlog.Log, resolver dns.Resolver, d delive
|
||||
}
|
||||
mb := d.acc.MailboxFindX(tx, mailbox)
|
||||
if mb != nil {
|
||||
// We want to deliver to mb.ID, but this message may be rejected and sent to the
|
||||
// Rejects mailbox instead, which MailboxID overwritten. Record the ID in
|
||||
// MailboxDestinedID too. If the message is later moved out of the Rejects mailbox,
|
||||
// we'll adjust the MailboxOrigID so it gets taken into account during reputation
|
||||
// calculating in future deliveries. If we end up delivering to the intended
|
||||
// mailbox (i.e. not rejecting), MailboxDestinedID is cleared during delivery so we
|
||||
// don't store it unnecessarily.
|
||||
d.m.MailboxID = mb.ID
|
||||
d.m.MailboxDestinedID = mb.ID
|
||||
} else {
|
||||
log.Debug("mailbox not found in database", mlog.Field("mailbox", mailbox))
|
||||
}
|
||||
|
Reference in New Issue
Block a user