You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:36:20