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

如何在Go语言中为go-simple-mail库配置SMTP代理?

关于github.com/xhit/go-simple-mail/v2的SMTP代理配置方案

1. 现有库的代理实现方式(无需更换库)

该库本身没有直接提供代理配置参数,但可以通过自定义DialContext函数接入正向代理,实现隐藏发送方IP的需求。核心思路是用Go的代理拨号逻辑替换库默认的网络连接方式。

以下是基于SOCKS5代理的实现示例:

package main

import (
	"context"
	"net"
	"time"

	gomail "github.com/xhit/go-simple-mail/v2"
	"golang.org/x/net/proxy"
)

func main() {
	// 创建SOCKS5代理拨号器
	dialer, err := proxy.SOCKS5("tcp", "proxy.example.com:1080", nil, proxy.Direct)
	if err != nil {
		panic(err)
	}

	// 适配为DialContext类型
	proxyDialContext := func(ctx context.Context, network, addr string) (net.Conn, error) {
		return dialer.Dial(network, addr)
	}

	// 初始化SMTP客户端
	server := gomail.NewSMTPClient()
	server.Host = "smtp.example.com"
	server.Port = 587
	server.Username = "your-email@example.com"
	server.Password = "your-password"
	server.Encryption = gomail.EncryptionSTARTTLS
	server.ConnectTimeout = 10 * time.Second
	server.SendTimeout = 10 * time.Second

	// 替换默认拨号逻辑为代理拨号
	server.DialContext = proxyDialContext

	// 构建并发送邮件
	email := gomail.NewMSG()
	email.SetFrom("Sender <your-email@example.com>").
		AddTo("recipient@example.com").
		SetSubject("Test Email via Proxy")
	email.SetBody(gomail.TextPlain, "This is a test email sent through SOCKS5 proxy")

	client, err := server.Connect()
	if err != nil {
		panic(err)
	}
	defer client.Close()

	if err := email.Send(client); err != nil {
		panic(err)
	}
}
  • 若使用HTTP正向代理(需确保代理支持SMTP透传),可替换proxy.SOCKS5为对应的HTTP代理拨号实现。
  • 需确认代理服务器允许SMTP流量转发,否则无法建立连接。

2. 替代方案(若自定义拨号无法满足需求)

如果上述方式适配失败,可考虑以下库:

  • 标准库net/smtp:配合golang.org/x/net/proxy直接实现代理连接,灵活性高,但需自行处理邮件构建、TLS等细节。
  • github.com/jordan-wright/email:封装简洁,支持自定义拨号器实现代理,兼容多数SMTP场景。

内容的提问来源于stack exchange,提问作者GhostVision

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:42:48