zoukankan      html  css  js  c++  java
  • Go语言发邮件

        发送邮件是实际业务中经常会用到的一个功能,而在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 + "
    From: " + user + ">
    Subject: " + subject + "
    " + content_type + "
    
    " + 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 (端口:587263.net: 
    
    POP3服务器地址:pop3.263.net(端口:110) 
    
    SMTP服务器地址:smtp.263.net(端口:25263.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
    常用邮箱的服务器地址与端口

      

    作者:张亚飞
    出处:https://www.cnblogs.com/zhangyafei
    gitee:https://gitee.com/zhangyafeii
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    postman断言作用及怎么使用
    深入理解Spring MVC 思想
    serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID
    HttpClient通过Post方式发送Json数据
    HttpClient获取Cookie的两种方式
    HTTPclient cookie的获取与设置
    【BIEE】11_根据显示指标展示不同报表
    【Excle】科学计数法快速还原
    【BIEE】10_资料库查看数据报错
    【BIEE】09_BIEE控制台乱码问题解决
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/13918050.html
Copyright © 2011-2022 走看看