From e89dcb2cca0bebc623bbc3a86f30930d6f9b3bda Mon Sep 17 00:00:00 2001 From: James Houlahan Date: Mon, 6 Feb 2023 15:47:11 +0100 Subject: [PATCH] fix(GODT-2343): Only poll after send if sync is complete --- internal/user/imap.go | 20 ++++++++++++++++++-- internal/user/user.go | 4 +++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/internal/user/imap.go b/internal/user/imap.go index ab17f2f8..19fa3e10 100644 --- a/internal/user/imap.go +++ b/internal/user/imap.go @@ -287,12 +287,28 @@ func (conn *imapConnector) CreateMessage( } else if ok { conn.log.WithField("messageID", messageID).Warn("Message already sent") - message, err := conn.client.GetMessage(ctx, messageID) + // Query the server-side message. + full, err := conn.client.GetFullMessage(ctx, messageID) if err != nil { return imap.Message{}, nil, fmt.Errorf("failed to fetch message: %w", err) } - return toIMAPMessage(message.MessageMetadata), nil, nil + // Build the message as it is on the server. + if err := safe.RLockRet(func() error { + return withAddrKR(conn.apiUser, conn.apiAddrs[full.AddressID], conn.vault.KeyPass(), func(_, addrKR *crypto.KeyRing) error { + var err error + + if literal, err = message.BuildRFC822(addrKR, full.Message, full.AttData, defaultJobOpts()); err != nil { + return err + } + + return nil + }) + }, conn.apiUserLock, conn.apiAddrsLock); err != nil { + return imap.Message{}, nil, fmt.Errorf("failed to build message: %w", err) + } + + return toIMAPMessage(full.MessageMetadata), literal, nil } wantLabelIDs := []string{string(mailboxID)} diff --git a/internal/user/user.go b/internal/user/user.go index 56d6d701..c3484fc5 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -431,7 +431,9 @@ func (user *User) NewIMAPConnectors() (map[string]connector.Connector, error) { // SendMail sends an email from the given address to the given recipients. func (user *User) SendMail(authID string, from string, to []string, r io.Reader) error { - defer user.goPollAPIEvents(true) + if user.vault.SyncStatus().IsComplete() { + defer user.goPollAPIEvents(true) + } if len(to) == 0 { return ErrInvalidRecipient