当前位置: 首页 > news >正文

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述

使用email库发送QQ邮件,采用465端口:

package mainimport ("fmt""net/smtp""github.com/jordan-wright/email"
)func SendEmail(sendTo string, subject string, body string) (err error) {e := email.NewEmail()// 设置发送方的邮箱e.From = "193*******@qq.com"// 设置接收方的邮箱e.To = []string{sendTo}// 设置主题e.Subject = subject// 设置文件发送的内容e.Text = []byte(body)// e.HTML = []byte(body)// 设置服务器相关的配置err = e.Send(fmt.Sprintf("%s:%d", "smtp.qq.com", 587), smtp.PlainAuth("", "193*******@qq.com", "sdacdf********", "smtp.qq.com"))return
}
func main() {err := SendEmail("wwwwwwww@gmail.com", "测试主题",fmt.Sprintf("您的验证码为:%s,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!", "123456"))if err != nil {fmt.Println("发送验证码失败:", err)//打印错误类型fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

控制台输出下面的内容:

发送验证码失败: short response: 一串乱码
textproto.ProtocolError

但是收到了验证码:

image-20241104164852486

可能的原因

因为在SMTP发送过程中出现了意料之外的响应情况,可能是因为连接问题、网络不稳定,或是由于服务器的一些特定限制导致的短响应。尽管服务器响应中断,邮件实际上已经发送成功。

debug过程

尝试改用465加密(ssl)端口:

package mainimport ("crypto/tls""fmt""net/smtp""github.com/jordan-wright/email"
)func SendEmail(sendTo string, subject string, body string) (err error) {e := email.NewEmail()// 设置发送方的邮箱e.From = "193*******@qq.com"// 设置接收方的邮箱e.To = []string{sendTo}// 设置主题e.Subject = subject// 设置文件发送的内容e.Text = []byte(body)// e.HTML = []byte(body)// 设置服务器相关的配置// 使用 SSL 端口 465 并配置 TLStlsConfig := &tls.Config{InsecureSkipVerify: true,ServerName:         "smtp.qq.com",}err = e.SendWithTLS(fmt.Sprintf("%s:%d", "smtp.qq.com", 465), smtp.PlainAuth("", "193*******@qq.com", "sdacdf********", "smtp.qq.com"), tlsConfig)return
}func main() {err := SendEmail("wwwwwwww@gmail.com", "测试主题",fmt.Sprintf("您的验证码为:%s,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!", "123456"))if err != nil {fmt.Println("发送验证码失败:", err)//打印错误类型fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

还是报相同的错误,能够收到邮件,遂放弃封装好的email库,使用原始的smtp库,但是采用不加密的587端口:

package mainimport ("fmt""net/smtp"
)func SendEmail(sendTo string, subject string, body string) error {from := "193*******@qq.com"password := "dsfdfcf******" // 邮箱授权码smtpServer := "smtp.qq.com:587"// 邮件内容,确保包含 From 头部msg := []byte("From: Sender Name <" + from + ">\r\n" +"To: " + sendTo + "\r\n" +"Subject: " + subject + "\r\n" +"\r\n" +body + "\r\n")// 设置 PlainAuthauth := smtp.PlainAuth("", from, password, "smtp.qq.com")// 发送邮件err := smtp.SendMail(smtpServer, auth, from, []string{sendTo}, msg)if err != nil {return fmt.Errorf("发送失败: %v", err)}return nil
}func main() {err := SendEmail("193*******@qq.com", "古树林书法社团", "您的验证码为:123456,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!")if err != nil {fmt.Println(err)fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

还是报相同的错误,能够收到邮件,于是采用加密的465端口:

package mainimport ("crypto/tls""fmt""net/smtp"
)func SendEmail(sendTo string, subject string, body string) error {from := "193*******@qq.com"password := "dsfdfcf******" // 邮箱授权码smtpServer := "smtp.qq.com:465"// 设置 PlainAuthauth := smtp.PlainAuth("", from, password, "smtp.qq.com")// 创建 tls 配置tlsconfig := &tls.Config{InsecureSkipVerify: true,ServerName:         "smtp.qq.com",}// 连接到 SMTP 服务器conn, err := tls.Dial("tcp", smtpServer, tlsconfig)if err != nil {return fmt.Errorf("TLS 连接失败: %v", err)}defer conn.Close()client, err := smtp.NewClient(conn, "smtp.qq.com")if err != nil {return fmt.Errorf("SMTP 客户端创建失败: %v", err)}defer client.Quit()// 使用 auth 进行认证if err = client.Auth(auth); err != nil {return fmt.Errorf("认证失败: %v", err)}// 设置发件人和收件人if err = client.Mail(from); err != nil {return fmt.Errorf("发件人设置失败: %v", err)}if err = client.Rcpt(sendTo); err != nil {return fmt.Errorf("收件人设置失败: %v", err)}// 写入邮件内容wc, err := client.Data()if err != nil {return fmt.Errorf("数据写入失败: %v", err)}defer wc.Close()msg := []byte("From: Sender Name <" + from + ">\r\n" +"To: " + sendTo + "\r\n" +"Subject: " + subject + "\r\n" +"\r\n" +body + "\r\n")_, err = wc.Write(msg)if err != nil {return fmt.Errorf("消息发送失败: %v", err)}return nil
}func main() {err := SendEmail("193*******@qq.com", "古树林书法社团", "您的验证码为:123456,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!")if err != nil {fmt.Println("发送验证码失败:", err)//打印错误类型fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

这次控制台显示“发送验证码成功”,报错消失。

http://www.lryc.cn/news/476849.html

相关文章:

  • 为什么说高级工程师研究的不仅是器件的稳态,模拟器件的开关过程
  • Matlab实现白鲸优化算法(BWO)求解路径规划问题
  • SQLserver索引的优化和使用
  • Linux 安装nacos
  • 水仙花判断
  • 在VS中安装chatGPT
  • 算法笔记:Day-09(初始动态规划)
  • “探索未来医疗:生成式人工智能在医疗领域的革命性应用“
  • 数字IC后端实现Innovus 时钟树综合(Clock Tree Synthesis)典型案例
  • Matlab应用制作入门
  • 什么是声明式编程什么是函数式编程,打比方说明
  • SpringBoot+Shiro权限管理
  • 前端面试题22 | 什么是跨域问题?怎么解决?
  • HarmonyOS Next星河版笔记--界面开发(3)
  • 科研绘图系列:R语言组合连线图和箱线图(linechart+boxplot)
  • 对象的接口与设计模式在其中的作用
  • 如何自学机器学习?
  • python中应该使用while 1吗?按位运算符可以代替逻辑运算符使用吗?
  • 线程ID和线程库
  • 使用AWS Lambda构建无服务器应用程序
  • 响应式网页设计案例
  • 麦麦Docker笔记(一)
  • 【设计模式系列】总览
  • P11118 [ROI 2024 Day 2] 无人机比赛 题解
  • 时序数据库是什么:概念、特点与分类简析
  • 大数据上岗.入职.就业面试题
  • 2016年7月和8月NASA的气候成像(ATom)-1飞行活动期间测量的黑碳(BC)质量混合比(单位为ng BC / kg空气)
  • python opencv3
  • git原理与上传
  • LeetCode:633. 平方数之和(Java)