发送邮件是实际业务中经常会用到的一个功能,而在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 + "\r\nFrom: " + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + 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域名+端口号,第二个参数用于身份认证

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

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

  

Go语言发邮件的更多相关文章

  1. python语言(六)mock接口开发、发邮件、写日志、新Excel操作

    一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...

  2. 学习linux之用mail命令发邮件

    背景 这两天工作比较闲,网上各种冲浪(这个词暴露我的网龄了).看到一位大神的文章更闲 <>.端详一番,原来是用R语言拼接字符串后用shell命令发出去.发现shell命令既然还能直接发邮件 ...

  3. ActiveMQ JMS 在发邮件中的使用

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...

  4. python自动发邮件总结及实例说明

    python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. sm ...

  5. centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课

    centos shell基础知识 alias  变量单引号 双引号   history 错误重定向 2>&1  jobs  环境变量 .bash_history  source配置文件 ...

  6. python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)

    简介 发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮 ...

  7. 【python】python 自动发邮件

    一.一般发邮件的方法 Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件. 注意到构造MIMETEXT对象时,第一个参数就是邮件正文,第 ...

  8. # PHP - 使用PHPMailer发邮件

    PHPMailer支持多种邮件发送方式,使用起来非常简单 1.下载PHPMailer https://github.com/PHPMailer/PHPMailer,下载完成加压后, 把下边的两个文件复 ...

  9. Linux发邮件之mail命令

    一.mail命令 1.配置 vim /etc/mail.rc 文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com" set ...

随机推荐

  1. 【简】题解 AWSL090429 【原子】

    预处理出每个原子最近的不能合并的位置 枚举当前位置和前面断开的位置合并 发现还是不能过 考虑用选段树优化 但是因为每次转移的最优点是在前面可以合并的范围内 dp值加上当前的到该点的最大值 因为每个位置 ...

  2. jenkins实例 nodejs项目

    目录 一.案例1 二.案例2 一.案例1 使用shell方式 #清理上一次版本,拉取新代码 rm -rf /server/admin-web cd /server git clone http://g ...

  3. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  4. WebRTC + WebSocket 实现视频通话

    前言 WebRTC WebRTC(Web Real-Time Communication).Real-Time Communication,实时通讯. WebRTC能让web应用和站点之间选择性地分享 ...

  5. CF977C Less or Equal 题解

    Content 给定一个 \(n\) 个数的数列 \(a_1,a_2,a_3,...,a_n\) 和一个数 \(k\),试找出这样的一个数 \(x\),使得数列中有 \(k\) 个数小于等于 \(x\ ...

  6. CF111A Petya and Inequiations 题解

    Content 请找出一个由 \(n\) 个正整数组成的数列 \(\{a_1,a_2,\dots,a_n\}\),满足以下两种条件: \(\sum\limits_{i=1}^na_i^2\geqsla ...

  7. java 图形化小工具Abstract Window Toolit

      老掉牙的历史 Java1.0在发布的时候,就为我们提供了GUI操作的库,这个库系统在所有的平台下都可以运行,这套基本的类库被称作抽象窗口工具集(Abstract Window Toolit),简称 ...

  8. 存储技术之ceph了解

    ceph rados:可靠的.自动的.分布式.对象存储 特性:高效性,统一性(文件存储,块存储,对象存储),可扩展 没有数据库的概念:为cluster map 记录集群状态. PG:(ceph核心单位 ...

  9. curl英文直译

    文档概述 比较表 curl手册页 常见问题 HTTP脚本编写 mk-ca-bundle 教程 curl / 文件 / 工具文档 /手册页 curl.1手册页 相关: 手动 常见问题解答 HTTP脚本 ...

  10. 【手把手教程】uniapp + vue 从0搭建仿斗鱼虎牙直播App:腾讯云MLVB移动直播实践连麦PK+带货

    基于uniapp + vue 实现仿斗鱼虎牙腾讯云移动直播应用实践,实现以下功能 1: 用户登陆 2: 房间管理 3: 房间聊天 4: 直播美颜 5: Svga礼物动画 6: 一对一连麦观众 项目开发 ...