0

0

使用 Go 通过非加密连接发送邮件

心靈之曲

心靈之曲

发布时间:2025-09-07 18:54:01

|

810人浏览过

|

来源于php中文网

原创

使用 go 通过非加密连接发送邮件

第一段引用上面的摘要:

本文档介绍了在使用 Go 语言通过非加密 SMTP 连接发送电子邮件时可能遇到的 "unencrypted connection" 错误,并提供了绕过此限制的两种解决方案:复制并修改标准库中的 smtp.PlainAuth 函数,或者创建一个包装器类型来欺骗身份验证机制,使其认为连接已加密。同时强调了使用加密连接的重要性,并建议尽可能使用更安全的身份验证机制,如 CRAM-MD5。

在使用 Go 语言的 net/smtp 包发送电子邮件时,如果尝试通过未加密的连接使用 smtp.PlainAuth 进行身份验证,可能会遇到 "unencrypted connection" 错误。这是因为 smtp.PlainAuth 默认情况下拒绝在非加密连接上发送密码,以保护用户的安全。

解决方案一:修改 smtp.PlainAuth (不推荐)

虽然不推荐,但如果确实需要通过非加密连接发送邮件,可以复制 smtp.PlainAuth 的源代码并进行修改,移除对加密连接的检查。

  1. 找到 smtp.PlainAuth 的源代码: 可以在 Go 语言标准库的 net/smtp/auth.go 文件中找到 PlainAuth 函数的实现。

  2. 复制并修改代码: 将该函数复制到你的项目中,并删除以下代码段:

if !server.TLS {
    return "", nil, errors.New("unencrypted connection")
}
  1. 使用修改后的函数: 在你的代码中使用修改后的函数进行身份验证。

重要提示: 这种方法极不安全,因为你的密码将以明文形式通过网络传输。强烈建议不要在生产环境中使用此方法。

解决方案二:创建包装器类型 (推荐)

一个更安全的选择是创建一个包装器类型,欺骗身份验证机制,使其认为连接已加密。

迦恩计算机资源网源码(图书销售类)
迦恩计算机资源网源码(图书销售类)

采用三层架构开发,前台集成了产品在线展示,用户注册、在线调查、在线投稿后台有类别管理\图书管理\订单管理\会员管理\配送范围管理\邮件列表\广告管理\友情链接管理等后台添加图书时自动生成缩略图和文字水印主要参考了petshop的设计架构、使用了Asp.net2.0中很多MemberShip、master等新功能后台管理地址/web/admin/ 超级管理员账号密码均为aspx1特别提示:该系统需要

下载
type unencryptedAuth struct {
    smtp.Auth
}

func (a unencryptedAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
    s := *server
    s.TLS = true
    return a.Auth.Start(&s)
}

// 使用示例
auth := unencryptedAuth {
    smtp.PlainAuth(
        "",
        "your_email@example.com",
        "your_password",
        "mail.example.com",
    ),
}

// 然后像往常一样使用 auth 变量
err := smtp.SendMail(
    "mail.example.com:25",
    auth,
    "sender@example.com",
    []string{"recipient@example.com"},
    []byte("This is the email body."),
)
if err != nil {
    log.Fatal(err)
}

代码解释:

  • unencryptedAuth 结构体包装了 smtp.Auth 接口。
  • Start 方法拦截了 *smtp.ServerInfo,并将其 TLS 字段设置为 true,从而欺骗了底层的身份验证机制。

注意事项:

  • 虽然这种方法比直接修改 smtp.PlainAuth 更安全,但仍然存在风险,因为你的密码仍然以明文形式发送。
  • 务必在代码中添加详细的注释,说明你为什么要这样做,以及潜在的安全风险。

最佳实践:使用加密连接和更安全的身份验证机制

强烈建议尽可能使用加密连接(TLS/SSL)和更安全的身份验证机制,如 CRAM-MD5 或 OAuth 2.0。这些方法可以更好地保护你的密码和数据安全。

以下是使用 TLS 连接发送邮件的示例代码:

package main

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

func main() {
    // Set up authentication information.
    auth := smtp.PlainAuth(
        "",
        "your_email@example.com",
        "your_password",
        "mail.example.com",
    )

    // Connect to the server.
    conn, err := tls.Dial("tcp", "mail.example.com:465", &tls.Config{})
    if err != nil {
        log.Fatal(err)
    }

    client, err := smtp.NewClient(conn, "mail.example.com")
    if err != nil {
        log.Fatal(err)
    }

    // Authenticate.
    if err = client.Auth(auth); err != nil {
        log.Fatal(err)
    }

    // Set the sender and recipient.
    if err = client.Mail("sender@example.com"); err != nil {
        log.Fatal(err)
    }
    if err = client.Rcpt("recipient@example.com"); err != nil {
        log.Fatal(err)
    }

    // Send the email body.
    wc, err := client.Data()
    if err != nil {
        log.Fatal(err)
    }
    _, err = wc.Write([]byte("This is the email body."))
    if err != nil {
        log.Fatal(err)
    }
    err = wc.Close()
    if err != nil {
        log.Fatal(err)
    }

    // Quit.
    err = client.Quit()
    if err != nil {
        log.Fatal(err)
    }
}

总结:

虽然可以通过修改代码或创建包装器类型来绕过 Go 语言 net/smtp 包的加密连接检查,但强烈建议不要这样做。为了保护你的密码和数据安全,应该尽可能使用加密连接和更安全的身份验证机制。 在不得不使用非加密连接的情况下,务必权衡安全风险,并采取必要的保护措施。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

220

2025.06.09

golang结构体方法
golang结构体方法

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

192

2025.07.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1132

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1759

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

SSL检测工具介绍
SSL检测工具介绍

SSL检测工具有SSL Labs、SSL Check、SSL Server Test、SSLMate、SSL/TLS Analyzer等。详细介绍:1、SSL Labs是一个由Qualys提供的在线SSL检测工具,可以评估服务器证书的部署情况、加密套件、协议支持等方面的安全性,它提供了一个详细的报告,包括证书的颁发者、有效期、安全性配置等;2、SSL Check等等。

336

2023.10.20

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

12

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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