mirror of
https://github.com/profullstack/agentbbs.git
synced 2026-08-13 14:27:27 +00:00
fix(mailbox): write messages before IMAP append wait
This commit is contained in:
parent
03a2ce3f8b
commit
40407e061d
2 changed files with 95 additions and 1 deletions
|
|
@ -229,7 +229,10 @@ func (t *imapTransport) Send(_ context.Context, from string, d Draft) (SendResul
|
|||
}
|
||||
// Best-effort copy to Sent so the message shows in the member's mailbox.
|
||||
t.mu.Lock()
|
||||
_, _ = t.c.Append(Sent, int64(len(msg)), nil).Wait() // ignore APPEND errors
|
||||
appendCmd := t.c.Append(Sent, int64(len(msg)), nil)
|
||||
_, _ = appendCmd.Write(msg)
|
||||
_ = appendCmd.Close()
|
||||
_, _ = appendCmd.Wait()
|
||||
t.mu.Unlock()
|
||||
return SendResult{MessageID: msgID}, nil
|
||||
}
|
||||
|
|
|
|||
91
internal/mailbox/imap_test.go
Normal file
91
internal/mailbox/imap_test.go
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
package mailbox
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"github.com/emersion/go-imap/v2"
|
||||
"github.com/emersion/go-imap/v2/imapserver"
|
||||
"github.com/emersion/go-imap/v2/imapserver/imapmemserver"
|
||||
)
|
||||
|
||||
func newFakeIMAP(t *testing.T) string {
|
||||
t.Helper()
|
||||
|
||||
backend := imapmemserver.New()
|
||||
user := imapmemserver.NewUser("alice", "secret")
|
||||
if err := user.Create(Inbox, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := user.Create(Sent, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
backend.AddUser(user)
|
||||
|
||||
server := imapserver.New(&imapserver.Options{
|
||||
NewSession: func(*imapserver.Conn) (imapserver.Session, *imapserver.GreetingData, error) {
|
||||
return backend.NewSession(), nil, nil
|
||||
},
|
||||
InsecureAuth: true,
|
||||
Caps: imap.CapSet{
|
||||
imap.CapIMAP4rev1: {},
|
||||
imap.CapIMAP4rev2: {},
|
||||
},
|
||||
})
|
||||
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
go func() { _ = server.Serve(listener) }()
|
||||
t.Cleanup(func() {
|
||||
_ = server.Close()
|
||||
_ = listener.Close()
|
||||
})
|
||||
return listener.Addr().String()
|
||||
}
|
||||
|
||||
func TestIMAPSendCopiesMessageToSent(t *testing.T) {
|
||||
smtpServer := newFakeSMTP(t)
|
||||
transport, err := NewIMAPTransport(IMAPConfig{
|
||||
IMAPAddr: newFakeIMAP(t),
|
||||
SMTPAddr: smtpServer.addr,
|
||||
Username: "alice",
|
||||
Password: "secret",
|
||||
Plaintext: true,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = transport.Close() })
|
||||
|
||||
_, err = transport.Send(context.Background(), "alice@example.test", Draft{
|
||||
To: []Address{{Address: "bob@example.test"}},
|
||||
Subject: "Saved message",
|
||||
Text: "message body",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
messages, err := transport.ListMessages(context.Background(), ListOptions{Mailbox: Sent})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(messages) != 1 {
|
||||
t.Fatalf("Sent contains %d messages; want 1", len(messages))
|
||||
}
|
||||
if messages[0].Subject != "Saved message" {
|
||||
t.Fatalf("Sent subject = %q; want %q", messages[0].Subject, "Saved message")
|
||||
}
|
||||
message, found, err := transport.ReadMessage(context.Background(), Sent, messages[0].UID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !found {
|
||||
t.Fatal("saved message not found in Sent")
|
||||
}
|
||||
if message.Text != "message body" {
|
||||
t.Fatalf("Sent body = %q; want %q", message.Text, "message body")
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue