0

0

Golang发送电子邮件实现 smtp包配置与发送

P粉602998670

P粉602998670

发布时间:2025-08-27 12:40:02

|

827人浏览过

|

来源于php中文网

原创

Golang发送邮件需配置SMTP信息并使用net/smtp包。首先导入net/smtp、net/mail等包,设置SMTP服务器地址、端口、用户名密码,构建发件人、收件人、主题、正文等邮件头信息,通过map拼接邮件内容,调用smtp.SendMail发送。对于TLS加密的服务器(如Gmail),需用crypto/tls包建立安全连接,使用tls.Dial和smtp.NewClient手动管理连接、认证、发送流程,并注意生产环境应验证证书。发送HTML邮件时,将Content-Type设为text/html,正文为HTML字符串,建议内联CSS样式并提供纯文本备选。添加附件需使用mime/multipart包创建multipart/mixed类型邮件,将正文和附件作为不同part加入,附件需Base64编码并设置Content-Disposition为attachment。错误处理方面,需检查smtp.SendMail返回的error,区分网络、认证、服务器拒绝等异常,可加入重试机制应对临时故障。为避免邮件被标记为垃圾邮件,应使用可信发件人域名,配置SPF、DKIM DNS记录,避免敏感词,提供退订链接,控制发送频率。

golang发送电子邮件实现 smtp包配置与发送

Golang发送邮件的核心在于

net/smtp
包的配置和使用。简单来说,你需要配置SMTP服务器的连接信息,构建邮件内容,然后通过
smtp.SendMail
函数发送。

解决方案:

要使用Golang发送电子邮件,你需要以下几个步骤:

  1. 导入必要的包:
    net/smtp
    net/mail
    ,以及可能的
    errors
    log
  2. 配置SMTP服务器信息: 包括服务器地址、端口、用户名和密码。
  3. 构建邮件消息: 设置发件人、收件人、主题和正文。
  4. 使用
    smtp.SendMail
    函数发送邮件。

下面是一个基本的示例:

立即学习go语言免费学习笔记(深入)”;

package main

import (
    "net/smtp"
    "net/mail"
    "log"
    "errors"
)

func sendEmail(from, password, to, subject, body string) error {
    // 配置SMTP服务器信息
    smtpServer := "smtp.example.com" // 你的SMTP服务器地址
    smtpPort := 587                // SMTP端口,通常是587或465

    // 构建邮件消息
    fromAddress := mail.Address{Name: "Sender Name", Address: from}
    toAddress := mail.Address{Name: "Recipient Name", Address: to}

    header := make(map[string]string)
    header["From"] = fromAddress.String()
    header["To"] = toAddress.String()
    header["Subject"] = subject
    header["MIME-Version"] = "1.0"
    header["Content-Type"] = "text/plain; charset=\"utf-8\""

    message := ""
    for k, v := range header {
        message += k + ": " + v + "\r\n"
    }
    message += "\r\n" + body

    // 认证信息
    auth := smtp.PlainAuth("", from, password, smtpServer)

    // 连接到服务器并发送电子邮件
    err := smtp.SendMail(smtpServer+":"+string(rune(smtpPort)), auth, from, []string{to}, []byte(message))
    if err != nil {
        return err
    }

    return nil
}


func main() {
    // 替换成你自己的信息
    from := "your_email@example.com"
    password := "your_password"
    to := "recipient_email@example.com"
    subject := "Hello from Golang!"
    body := "This is a test email sent from Golang."

    err := sendEmail(from, password, to, subject, body)
    if err != nil {
        log.Fatal(err)
    }

    log.Println("Email sent successfully!")
}

这段代码的关键点在于

smtp.SendMail
函数,它接收SMTP服务器地址、认证信息、发件人、收件人列表和邮件内容作为参数。

如何处理SMTP服务器的TLS/SSL连接?

smtp.SendMail
函数默认使用非加密连接。对于需要TLS/SSL加密的SMTP服务器(例如Gmail),你需要使用
tls.Dial
建立安全连接,并使用
smtp.NewClient
创建SMTP客户端。这会涉及更多的代码,但安全性更高。 一个比较常见的错误是忘记配置TLS,导致连接被拒绝。

package main

import (
    "crypto/tls"
    "fmt"
    "log"
    "net"
    "net/smtp"
    "net/mail"
)

func sendEmailTLS(from, password, to, subject, body string) error {
    // 配置SMTP服务器信息
    smtpServer := "smtp.gmail.com" // Gmail SMTP服务器地址
    smtpPort := 587                // Gmail SMTP端口

    // 构建邮件消息
    fromAddress := mail.Address{Name: "Sender Name", Address: from}
    toAddress := mail.Address{Name: "Recipient Name", Address: to}

    header := make(map[string]string)
    header["From"] = fromAddress.String()
    header["To"] = toAddress.String()
    header["Subject"] = subject
    header["MIME-Version"] = "1.0"
    header["Content-Type"] = "text/plain; charset=\"utf-8\""

    message := ""
    for k, v := range header {
        message += k + ": " + v + "\r\n"
    }
    message += "\r\n" + body

    // 认证信息
    auth := smtp.PlainAuth("", from, password, smtpServer)

    // TLS配置
    tlsConfig := &tls.Config{
        InsecureSkipVerify: true, // 注意:在生产环境中,应该验证服务器证书
        ServerName:         smtpServer,
    }

    // 连接到服务器
    conn, err := tls.Dial("tcp", smtpServer+":"+string(rune(smtpPort)), tlsConfig)
    if err != nil {
        return err
    }

    // 创建SMTP客户端
    client, err := smtp.NewClient(conn, smtpServer)
    if err != nil {
        return err
    }
    defer client.Close()

    // 认证
    if err = client.Auth(auth); err != nil {
        return err
    }

    // 设置发件人和收件人
    if err = client.Mail(from); err != nil {
        return err
    }
    if err = client.Rcpt(to); err != nil {
        return err
    }

    // 发送邮件数据
    w, err := client.Data()
    if err != nil {
        return err
    }

    _, err = w.Write([]byte(message))
    if err != nil {
        return err
    }

    err = w.Close()
    if err != nil {
        return err
    }

    // 退出
    return client.Quit()
}


func main() {
    // 替换成你自己的信息
    from := "your_email@gmail.com" // Gmail邮箱
    password := "your_gmail_password" // Gmail应用专用密码
    to := "recipient_email@example.com"
    subject := "Hello from Golang with TLS!"
    body := "This is a test email sent from Golang using TLS."

    err := sendEmailTLS(from, password, to, subject, body)
    if err != nil {
        log.Fatal(err)
    }

    log.Println("Email sent successfully with TLS!")
}

注意:Gmail需要使用“应用专用密码”,而不是你的常规密码。并且

InsecureSkipVerify: true
在生产环境中是不安全的,你应该验证服务器证书。

如何发送HTML格式的邮件?

发送HTML邮件需要在邮件头中设置

Content-Type
text/html
。同时,邮件正文需要是HTML格式的字符串。

header["Content-Type"] = "text/html; charset=\"utf-8\""
body = "

Hello, World!

This is an HTML email.

NopCommerce (ASP.NET商城)
NopCommerce (ASP.NET商城)

nopCommerce 是一个由ASP.NET多层模式开发的开源电子商城系统,可以自行设置模板、配置灵活、功能强大,它内含一个目录前端和一个管理工具后端。前端包括用户注册、商品购买(可以进行评论)、投票、Blog等,后端有类别管理、产品管理、客户及角色管理、订单管理、纳税管理、国家(地区管理)、邮件发送、消息模板、新闻发布、blog管理,可以对列表数据进行XML导出。

下载
"

需要注意的是,不同邮件客户端对HTML的支持程度不同,所以最好提供一个纯文本的替代版本,以保证邮件的可读性。 我曾经遇到过一个问题,就是HTML邮件在某些客户端显示不正确,后来发现是CSS样式没有内联导致的。

如何添加附件到邮件中?

添加附件需要使用

mime/multipart
包来构建multipart邮件。这涉及到创建多个part,包括邮件正文和一个或多个附件。这部分代码会比较复杂,需要仔细处理Content-Type和Content-Disposition头。

package main

import (
    "bytes"
    "encoding/base64"
    "fmt"
    "io"
    "log"
    "mime/multipart"
    "net/mail"
    "net/smtp"
    "os"
    "path/filepath"
)

func sendEmailWithAttachment(from, password, to, subject, body, attachmentPath string) error {
    // 配置SMTP服务器信息
    smtpServer := "smtp.example.com" // 你的SMTP服务器地址
    smtpPort := 587                // SMTP端口,通常是587或465

    // 构建邮件消息
    fromAddress := mail.Address{Name: "Sender Name", Address: from}
    toAddress := mail.Address{Name: "Recipient Name", Address: to}

    // 创建一个buffer来存储邮件内容
    var bodyBuf bytes.Buffer
    writer := multipart.NewWriter(&bodyBuf)

    // 添加邮件头
    header := make(map[string]string)
    header["From"] = fromAddress.String()
    header["To"] = toAddress.String()
    header["Subject"] = subject
    header["MIME-Version"] = "1.0"
    header["Content-Type"] = "multipart/mixed; boundary=\"" + writer.Boundary() + "\""

    // 添加邮件正文
    part, err := writer.CreatePart(map[string][]string{
        "Content-Type": {"text/plain; charset=utf-8"},
    })
    if err != nil {
        return err
    }
    _, err = part.Write([]byte(body))
    if err != nil {
        return err
    }

    // 添加附件
    file, err := os.Open(attachmentPath)
    if err != nil {
        return err
    }
    defer file.Close()

    // 获取文件名
    filename := filepath.Base(attachmentPath)

    // 创建附件的part
    part, err = writer.CreatePart(map[string][]string{
        "Content-Type":              {"application/octet-stream"},
        "Content-Disposition":       {fmt.Sprintf("attachment; filename=\"%s\"", filename)},
        "Content-Transfer-Encoding": {"base64"},
    })
    if err != nil {
        return err
    }

    // 将文件内容编码为base64并写入part
    encoder := base64.NewEncoder(base64.StdEncoding, part)
    _, err = io.Copy(encoder, file)
    if err != nil {
        return err
    }
    encoder.Close()

    // 关闭multipart writer
    err = writer.Close()
    if err != nil {
        return err
    }

    // 认证信息
    auth := smtp.PlainAuth("", from, password, smtpServer)

    // 连接到服务器并发送电子邮件
    err = smtp.SendMail(smtpServer+":"+string(rune(smtpPort)), auth, from, []string{to}, bodyBuf.Bytes())
    if err != nil {
        return err
    }

    return nil
}

func main() {
    // 替换成你自己的信息
    from := "your_email@example.com"
    password := "your_password"
    to := "recipient_email@example.com"
    subject := "Email with Attachment from Golang!"
    body := "This is a test email with an attachment sent from Golang."
    attachmentPath := "path/to/your/attachment.txt" // 替换成你的附件路径

    err := sendEmailWithAttachment(from, password, to, subject, body, attachmentPath)
    if err != nil {
        log.Fatal(err)
    }

    log.Println("Email with attachment sent successfully!")
}

这个例子展示了如何添加一个附件。你可以根据需要添加多个附件。 我曾经在处理一个大附件时遇到内存溢出的问题,后来通过分块读取文件并编码为base64解决了。

如何处理发送邮件时的错误?

smtp.SendMail
函数会返回一个
error
类型的值。你应该检查这个错误,并根据错误类型进行处理。常见的错误包括:

  • 网络连接错误: 无法连接到SMTP服务器。
  • 认证错误: 用户名或密码错误。
  • 服务器拒绝错误: 服务器拒绝发送邮件,可能是因为发件人地址无效或收件人地址不存在。

针对不同的错误,你可以采取不同的措施,例如重试、记录日志或通知用户。 我建议在代码中加入重试机制,以应对临时的网络问题

如何避免邮件被标记为垃圾邮件?

避免邮件被标记为垃圾邮件是一个复杂的问题,涉及到多个方面:

  • 使用可信的发件人地址: 避免使用免费邮箱或动态IP地址发送邮件。
  • 设置SPF和DKIM记录: 这些DNS记录可以验证邮件的真实性。
  • 避免使用垃圾邮件关键词: 例如“免费”、“优惠”、“促销”等。
  • 提供取消订阅链接: 允许用户方便地取消订阅。
  • 控制发送频率: 避免短时间内发送大量邮件。

这些只是一些建议,具体的措施需要根据你的具体情况进行调整。 我曾经因为忘记设置SPF记录,导致邮件经常被标记为垃圾邮件。

总而言之,Golang的

net/smtp
包提供了强大的邮件发送功能。 虽然配置和使用起来可能有些复杂,但只要理解了其背后的原理,就能轻松地发送各种类型的邮件。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

224

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

335

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

206

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

187

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号