如何获取通过SMTP发送的邮件副本并上传至已发送文件夹?
解决go-mail发送邮件后已发送文件夹无记录的问题
要搞定这个问题,核心就是在SMTP发送邮件前先保存好完整的邮件副本,再通过IMAP把副本上传到邮箱的「已发送」文件夹。下面是具体步骤和代码示例:
1. 获取SMTP发送的邮件副本
go-mail的msg.Message对象本身包含了完整的邮件数据(包括所有头信息、正文、附件等),你只需要在发送前调用msg.Bytes()方法就能拿到邮件的字节流副本:
package main import ( "github.com/wneessen/go-mail" ) func main() { // 1. 构建邮件 msg := mail.NewMsg() if err := msg.From("your-email@example.com"); err != nil { panic(err) } if err := msg.To("recipient@example.com"); err != nil { panic(err) } msg.Subject("测试邮件") msg.SetBodyString(mail.TypeTextPlain, "这是测试邮件的内容") // 2. 获取邮件副本(关键步骤) mailBytes, err := msg.Bytes() if err != nil { panic(err) } // 这里的mailBytes就是完整的邮件副本,可直接用于后续IMAP上传 // 3. 通过SMTP发送邮件 client, err := mail.NewClient("smtp.example.com", mail.WithPort(587), mail.WithSMTPAuth(mail.SMTPAuthPlain), mail.WithUsername("your-email@example.com"), mail.WithPassword("your-password")) if err != nil { panic(err) } if err := client.DialAndSend(msg); err != nil { panic(err) } }
2. 通过IMAP上传副本到已发送文件夹
用emersion/go-imap这个常用的IMAP库,把刚才拿到的mailBytes上传到「已发送」文件夹。注意不同邮箱的「已发送」文件夹名称有差异:
- Gmail:
[Gmail]/Sent Mail - Outlook/Hotmail:
Sent Items - QQ邮箱/163邮箱:
已发送
示例代码:
package main import ( "log" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" ) func uploadToSentFolder(emailBytes []byte, imapAddr, username, password, sentFolder string) error { // 连接IMAP服务器 c, err := client.DialTLS(imapAddr, nil) if err != nil { return err } defer c.Logout() // 登录邮箱 if err := c.Login(username, password); err != nil { return err } // 打开目标已发送文件夹 _, err = c.Select(sentFolder, false) if err != nil { return err } // 上传邮件副本到文件夹 if err := c.Append(sentFolder, []string{imap.SeenFlag}, nil, emailBytes); err != nil { return err } log.Println("邮件副本已成功上传到已发送文件夹") return nil } // 在main函数中调用示例: // uploadToSentFolder(mailBytes, "imap.example.com:993", "your-email@example.com", "your-password", "已发送")
注意事项
- 确保IMAP服务器地址和端口正确(一般SSL端口为993,非SSL为143,建议优先用SSL)
- 部分邮箱需要手动开启「IMAP服务」,且需使用授权码而非登录密码(比如QQ邮箱、网易邮箱)
- 若上传失败,优先检查文件夹名称是否匹配对应邮箱的命名规则
内容的提问来源于stack exchange,提问作者ogbofjnr
相关产品推荐
相关产品推荐

