您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

go语言发送邮件

时间:2023-08-17 16:58:40  来源:今日头条  作者:干饭人小羽

发送邮件是实际业务中经常会用到的一个功能,而在Go语言中实现发送邮件的库也有很多,这篇文章将介绍go语言中如何发邮件。

1. 登录QQ邮箱,选择账户,开启POP3/SMTP服务和IMAP/SMTP服务,并生成授权码



 

2. 使用go语言的smtp包发送邮件

  • go_emAIl/email.go

 

func SendEduEmail(user, password, host, to, subject, body, mailtype string) error {

hp := strings.Split(host, ":")

auth := smtp.PlainAuth("", user, password, hp[0])

var content_type string

if mailtype == "html" {

content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"

} else {

content_type = "Content-Type: text/plain" + "; charset=UTF-8"

}

msg := []byte("To: " + to + "rnFrom: " + user + ">rnSubject: " + subject + "rn" + content_type + "rnrn" + body)

send_to := strings.Split(to, ";")

err := smtp.SendMail(host, auth, user, send_to, msg)

return err

}

 

  • main.go

package main

import (

"fmt"

)

func main() {

send_email_test1()

}

iunc send_email_test1() {

var to = []string{"15735177116@163.com", "201800910862@b.sxmu.edu.cn"}

from := "1271570224@qq.com"

nickname := "张亚飞"

secret := "xxxxxxxx"

host := "smtp.qq.com"

port := 25

subject := "Perfect Vue Admin 发送邮件测试"

body := "测试内容"

if err := go_email.SendEmail(from, to, secret, host, nickname, subject, body, port, true); err != nil{

fmt.Println("发送失败: ", err)

}else {

fmt.Println("发送成功")

}

}

 

3. 使用"jordan-wright/email"发送邮件

关键参数

// Email is the type used for email messages

type Email struct {

ReplyTo []string

From string

To []string

Bcc []string

Cc []string

Subject string

Text []byte // Plaintext message (optional)

HTML []byte // Html message (optional)

Sender string // override From as SMTP envelope sender (optional)

Headers textproto.MIMEHeader

Attachments []*Attachment

ReadReceipt []string

}

 

  • From:发件人邮箱,格式为“名称+<邮箱>”,也可以直接写邮箱,默认显示的发件人为@符号前的名称
  • To:收件人邮箱地址
  • Subject:邮件标题
  • Text:邮件正文

调用Send方法发送邮件,第一个参数是你的发件人邮箱的SMTP域名+端口号,第二个参数用于身份认证

1

e.Send("smtp.163.com:25", smtp.PlainAuth("", "pingyeaa@163.com", "<你的密码>", "smtp.163.com"))

smtp.PlainAuth

  • 参数1:通常,identity应该是空字符串,以用作用户名。
  • 参数2:用户邮箱
  • 参数3:密码,如果拿到了授权码,则填写授权码
  • 参数4:服务器地址,163的地址是smtp.163.com,其他平台可自行查看

CC与BCC

CC全称是Carbon Copy,意为抄送,BCC全称Blind Carbon Copy,意为暗抄送,收件人看不到被暗抄送给了谁。

e := email.NewEmail()

e.Cc = []string{"xxxxxxx@qq.com"}

e.Bcc = []string{"xxxxxxx@qq.com"}

另一种初始化方式

可以实例化的时候直接赋值

e := &email.Email{

From: "平也 <pingyeaa@163.com>",

To: []string{"xxxxxxx@qq.com"},

Subject: "发现惊天大秘密!",

Text: []byte("平也好帅好有智慧哦~"),

}

发送附件

发送附件非常简单,直接传入文件名即可

 

e.AttachFile("attachment.txt")

连接池

由于频繁发送邮件会不断的与SMTP服务器建立连接,比较影响性能,所以email提供了连接池的功能

auth := smtp.PlainAuth("", "pingyeaa@163.com", "<你的密码>", "smtp.163.com")

p, _ := email.NewPool("smtp.163.com:25", 4, auth)

创建成功后,就可以借助连接池来发送邮件

e := email.NewEmail()

e.From = "平也 <pingyeaa@163.com>"

e.To = []string{"xxxxxx@qq.com"}

e.Subject = "发现惊天大秘密!"

e.Text = []byte("平也好帅好有智慧哦~")

p.Send(e, 10*time.Second)

实例

  • go_email/email.go

 

package go_email

import (

"crypto/tls"

"fmt"

"Github.com/jordan-wright/email"

"log"

".NET/smtp"

"strings"

"time"

)

var (

pool *email.Pool

maxClient int = 10

)

func SendEmail(from string, to []string, secret string, host string, nickname string, subject string, body string, port int, ssl bool) error {

auth := smtp.PlainAuth("", from, secret, host)

e := email.NewEmail()

e.From = fmt.Sprintf("%s<%s>", nickname, from)

e.To = to

e.Subject = subject

e.HTML = []byte(body)

hostAddr := fmt.Sprintf("%s:%d", host, port)

if ssl {

return e.SendWithTLS(hostAddr, auth,&tls.Config{ServerName: host})

}

return e.Send(hostAddr, auth)

}

func SendEmailWithFile(from string, to []string, secret string, host string, nickname string, subject string, body string, port int, ssl bool,attach string) error {

auth := smtp.PlainAuth("", from, secret, host)

e := email.NewEmail()

e.From = fmt.Sprintf("%s<%s>", nickname, from)

e.To = to

e.Subject = subject

e.HTML = []byte(body)

if attach != ""{

_,_ = e.AttachFile(attach)

}

hostAddr := fmt.Sprintf("%s:%d", host, port)

if ssl {

return e.SendWithTLS(hostAddr, auth,&tls.Config{ServerName: host})

}

return e.Send(hostAddr, auth)

}

func SendEmailWithPool(to []string, from, secret, host, subject, body, nickname string, port int) (err error) {

hostAddr := fmt.Sprintf("%s:%d", host, port)

auth := smtp.PlainAuth("", from, secret, host)

if pool == nil {

pool, err = email.NewPool(hostAddr, maxClient, auth)

if err != nil {

log.Fatal(err)

}

}

e := &email.Email{

From: fmt.Sprintf("%s<%s>", nickname, from),

To: to,

Subject: subject,

Text: []byte(body),

}

return pool.Send(e, 5 * time.Second)

}

func SendEmailWithPoolAndFile(to []string, from, secret, host, subject, body, nickname string, port int, attach string) (err error) {

hostAddr := fmt.Sprintf("%s:%d", host, port)

auth := smtp.PlainAuth("", from, secret, host)

if pool == nil {

pool, err = email.NewPool(hostAddr, maxClient, auth)

if err != nil {

log.Fatal(err)

}

}

e := &email.Email{

From: fmt.Sprintf("%s<%s>", nickname, from),

To: to,

Subject: subject,

Text: []byte(body),

}

if attach != "" {

_, _ = e.AttachFile(attach)

}

return pool.Send(e, 5 * time.Second)

}

 

  • main.go

package main

import (

"fmt"

go_email "go_dev/go_email/email"

)

func main() {

//send_email_test1()

//send_email_test2()

//send_email_test3()

send_email_test4()

}

func send_email_test4() {

var to = []string{"15735177116@163.com", "1271570224@qq.com"}

from := "201800910862@b.sxmu.edu.cn"

nickname := "张亚飞"

secret := "xxxxxxxx"

host := "smtp.exmail.qq.com"

port := 25

subject := "Perfect Vue Admin 发送邮件测试"

body := "测试内容"

if err :=
go_email.SendEmailWithPoolAndFile(to, from, secret, host, subject, body, nickname, port, "简称.txt"); err != nil{

fmt.Println("发送失败: ", err)

}else {

fmt.Println("发送成功")

}

}

func send_email_test3() {

var to = []string{"15735177116@163.com", "201800910862@b.sxmu.edu.cn"}

from := "1271570224@qq.com"

nickname := "张亚飞"

secret := "vsloiltxbxyzgeii"

host := "smtp.qq.com"

port := 25

subject := "Perfect Vue Admin 发送邮件测试"

body := "测试内容"

if err :=
go_email.SendEmailWithPoolAndFile(to, from, secret, host, subject, body, nickname, port, "简称.txt"); err != nil{

fmt.Println("发送失败: ", err)

}else {

fmt.Println("发送成功")

}

}

func send_email_test2() {

to := "1271570224@qq.com;15735177116@163.com"

user := "201800910862@b.sxmu.edu.cn"

password := "xxxxxx3"

host := "smtp.exmail.qq.com:25"

//host := "smtp.exmail.qq.com"

subject := "Perfect Vue Admin 发送邮件测试"

body := "测试内容"

if err := go_email.SendEduEmail(user, password, host, to, subject, body, "html"); err != nil{

fmt.Println("发送失败: ", err)

}else {

fmt.Println("发送成功")

}

}

func send_email_test1() {

var to = []string{"15735177116@163.com", "201800910862@b.sxmu.edu.cn"}

from := "1271570224@qq.com"

nickname := "张亚飞"

secret := "xxxxxx"

host := "smtp.qq.com"

port := 25

subject := "Perfect Vue Admin 发送邮件测试"

body := "测试内容"

if err := go_email.SendEmail(from, to, secret, host, nickname, subject, body, port, true); err != nil{

fmt.Println("发送失败: ", err)

}else {

fmt.Println("发送成功")

}

 

四、常用邮箱服务器地址与端口

163.com: 

POP3服务器地址:pop.163.com(端口:110) 

SMTP服务器地址:smtp.163.com(端口:25)  

 

126邮箱:

POP3服务器地址:pop.126.com(端口:110) 

SMTP服务器地址:smtp.126.com(端口:25)

 

139邮箱: 

POP3服务器地址:POP.139.com(端口:110) 

SMTP服务器地址:SMTP.139.com(端口:25) 

 

QQ邮箱: 

POP3服务器地址:pop.qq.com(端口:110) 

SMTP服务器地址:smtp.qq.com (端口:25)  

 

QQ企业邮箱 :

POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995) 

SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)  

 

gmail(google.com) :

POP3服务器地址:pop.gmail.com(SSL启用 端口:995) 

SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587) 

 

Foxmail: 

POP3服务器地址:POP.foxmail.com(端口:110) 

SMTP服务器地址:SMTP.foxmail.com(端口:25) 

 

sina.com: 

POP3服务器地址:pop3.sina.com.cn(端口:110) 

SMTP服务器地址:smtp.sina.com.cn(端口:25)

 

sinaVIP: 

POP3服务器:pop3.vip.sina.com (端口:110) 

SMTP服务器:smtp.vip.sina.com (端口:25)  

 

sohu.com: 

POP3服务器地址:pop3.sohu.com(端口:110) 

SMTP服务器地址:smtp.sohu.com(端口:25)  

 

yahoo.com: 

POP3服务器地址:pop.mail.yahoo.com 

SMTP服务器地址:smtp.mail.yahoo.com  

 

yahoo.com.cn: 

POP3服务器地址:pop.mail.yahoo.com.cn(端口:995) 

SMTP服务器地址:smtp.mail.yahoo.com.cn(端口:587  )

 

HotMail :

POP3服务器地址:pop3.live.com (端口:995) 

SMTP服务器地址:smtp.live.com (端口:587)

   

263.net: 

POP3服务器地址:pop3.263.net(端口:110) 

SMTP服务器地址:smtp.263.net(端口:25)  

 

263.net.cn: 

POP3服务器地址:pop.263.net.cn(端口:110) 

SMTP服务器地址:smtp.263.net.cn(端口:25)  

 

x263.net: 

POP3服务器地址:pop.x263.net(端口:110) 

SMTP服务器地址:smtp.x263.net(端口:25) 

 

21cn.com: 

POP3服务器地址:pop.21cn.com(端口:110) 

SMTP服务器地址:smtp.21cn.com(端口:25)   


china.com: 

POP3服务器地址:pop.china.com(端口:110) 

SMTP服务器地址:smtp.china.com(端口:25)

  
tom.com: 

POP3服务器地址:pop.tom.com(端口:110) 

SMTP服务器地址:smtp.tom.com(端口:25)

  
etang.com: 

POP3服务器地址:pop.etang.com 

SMTP服务器地址:smtp.etang.com


Tags:go语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
宝藏级Go语言开源项目——教你自己动手开发互联网搜索引擎
DIYSearchEngine 是一个能够高速采集海量互联网数据的开源搜索引擎,采用 Go 语言开发。Github 地址:https://github.com/johnlui/DIYSearchEngine运行方法首先,给自己准备一杯...【详细内容】
2024-03-12  Search: go语言  点击:(18)  评论:(0)  加入收藏
你是否想知道如何应对高并发?Go语言为你提供了答案!
并发编程是当前软件领域中不可忽视的一个关键概念。随着CPU等硬件的不断发展,我们都渴望让我们的程序运行速度更快、更快。而Go语言在语言层面天生支持并发,充分利用现代CPU的...【详细内容】
2023-12-29  Search: go语言  点击:(107)  评论:(0)  加入收藏
Go语言实现GoF设计模式:适配器模式
简介适配器模式(Adapter)是最常用的结构型模式之一,在现实生活中,适配器模式也是处处可见,比如电源插头转换器,它可以让英式的插头工作在中式的插座上。GoF 对它的定义如下:Convert...【详细内容】
2023-12-12  Search: go语言  点击:(207)  评论:(0)  加入收藏
Go语言字符串拼接方式与性能比较,分析过没?
在Go语言中,字符串拼接性能是相当高效的,主要原因有两点:一是字符串在Go中是不可变的(immutable),二是Go语言提供了strings.Builder类型来高效处理字符串拼接。1. 字符串是不可变...【详细内容】
2023-12-11  Search: go语言  点击:(229)  评论:(0)  加入收藏
一篇学会AI与Go语言无缝对接
在当今应用开发领域,类似OpenAI API等生成式AI技术的蓬勃发展正在彻底改变着应用开发的格局。Python和JavaScript等语言已经拥有丰富的资源来支持这些技术,其中LangChain就是...【详细内容】
2023-12-04  Search: go语言  点击:(141)  评论:(0)  加入收藏
20小时快速入门Go语言
Go语言是由Google开发的一种高效、简洁和并发性强的编程语言,其设计目标是使得程序员能够更加容易地创建可靠、高效的软件。尽管Go语言的语法相对其他编程语言来说可能更加陌...【详细内容】
2023-12-03  Search: go语言  点击:(154)  评论:(0)  加入收藏
十个令人惊叹的Go语言技巧,让你的代码更加优雅
在开发生产项目的过程中,我注意到经常会发现自己在重复编写代码,使用某些技巧时没有意识到,直到后来回顾工作时才意识到。为了解决这个问题,我开发了一种解决方案,对我来说非常有...【详细内容】
2023-11-20  Search: go语言  点击:(172)  评论:(0)  加入收藏
Go语言Context应用全攻略:异步编程利器
概述在 Go 语言中,Context(上下文)是一个非常重要的概念,特别是在处理请求时。允许在请求的整个生命周期内传递数据、控制请求的取消、处理超时等。本文将介绍 Go 语言中 Contex...【详细内容】
2023-11-06  Search: go语言  点击:(304)  评论:(0)  加入收藏
Go语言高级特性:Context深入解读
概述在 Go 语言中,context(上下文)是一个非常重要的概念。它主要用于在多个 goroutine 之间传递请求特定任务的截止日期、取消信号以及其他请求范围的值。3. Context 的取消与...【详细内容】
2023-11-01  Search: go语言  点击:(232)  评论:(0)  加入收藏
Go语言中如何实现JWT
什么JWTJWT(JSON Web Token)是一种开放标准(RFC 7519),定义了一种在各方之间安全传输信息的简洁方式。这些信息可以被验证和信任,因为它们是数字签名的。JWT由三部分组成,用.分隔。...【详细内容】
2023-09-11  Search: go语言  点击:(250)  评论:(0)  加入收藏
▌简易百科推荐
宝藏级Go语言开源项目——教你自己动手开发互联网搜索引擎
DIYSearchEngine 是一个能够高速采集海量互联网数据的开源搜索引擎,采用 Go 语言开发。Github 地址:https://github.com/johnlui/DIYSearchEngine运行方法首先,给自己准备一杯...【详细内容】
2024-03-12  OSC开源社区    Tags:Go语言   点击:(18)  评论:(0)  加入收藏
Go Gin框架实现优雅地重启和停止
在Web应用程序中,有时候我们需要重启或停止服务器,无论是因为更新代码还是进行例行维护。在这种情景下,我们需要保证应用程序的可用性和数据的一致性。这就需要优雅地关闭和重...【详细内容】
2024-01-30  源自开发者  微信公众号  Tags:Go   点击:(67)  评论:(0)  加入收藏
如何让Go程序以后台进程或daemon方式运行
本文探讨了如何通过Go代码实现在后台运行的程序。最近我用Go语言开发了一个WebSocket服务,我希望它能在后台运行,并在异常退出时自动重新启动。我的整体思路是将程序转为后台...【详细内容】
2024-01-26  Go语言圈  微信公众号  Tags:Go程序   点击:(60)  评论:(0)  加入收藏
深入Go底层原理,重写Redis中间件实战
Go语言以其简洁、高效和并发性能而闻名,深入了解其底层原理可以帮助我们更好地利用其优势。在本文中,我们将探讨如何深入Go底层原理,以及如何利用这些知识重新实现一个简单的Re...【详细内容】
2024-01-25  547蓝色星球    Tags:Go   点击:(66)  评论:(0)  加入收藏
Go 内存优化与垃圾收集
Go提供了自动化的内存管理机制,但在某些情况下需要更精细的微调从而避免发生OOM错误。本文将讨论Go的垃圾收集器、应用程序内存优化以及如何防止OOM(Out-Of-Memory)错误。Go...【详细内容】
2024-01-15  DeepNoMind  微信公众号  Tags:Go   点击:(61)  评论:(0)  加入收藏
Go函数指针是如何让你的程序变慢的?
导读Go 语言的常规优化手段无需赘述,相信大家也能找到大量的经典教程。但基于 Go 的函数值问题,业界还没有太多深度讨论的内容分享。本文作者根据自己对 Go 代码的使用与调优...【详细内容】
2024-01-15  腾讯云开发者  微信公众号  Tags:Go函数   点击:(86)  评论:(0)  加入收藏
Go编程中调用外部命令的几种场景
在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库...【详细内容】
2024-01-09  suntiger    Tags:Go编程   点击:(102)  评论:(0)  加入收藏
Go 语言不支持并发读写 Map,为什么?
Go语言的map类型不支持并发读写的主要原因是并发读写会导致数据竞态(data race),这意味着多个 goroutine 可能同时访问并修改同一个 map,从而引发不确定的结果。在Go语言的设计...【详细内容】
2024-01-05  Go语言圈  微信公众号  Tags:Go 语言   点击:(77)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  大雷家吃饭    Tags:Go微服务   点击:(62)  评论:(0)  加入收藏
你是否想知道如何应对高并发?Go语言为你提供了答案!
并发编程是当前软件领域中不可忽视的一个关键概念。随着CPU等硬件的不断发展,我们都渴望让我们的程序运行速度更快、更快。而Go语言在语言层面天生支持并发,充分利用现代CPU的...【详细内容】
2023-12-29  灵墨AI探索室  微信公众号  Tags:Go语言   点击:(107)  评论:(0)  加入收藏
站内最新
站内热门
站内头条