zoukankan      html  css  js  c++  java
  • GoLang 中发送 email 邮件

    方法 1,使用官方的 net/smtp

    package main
    
    import (
    	"log"
    	"net/smtp"
    )
    
    const (
    	SMTPHost     = "smtp.gmail.com"
    	SMTPPort     = ":587"
    	SMTPUsername = "xxx@gmail.com"
    	SMTPPassword = "xxxx"
    )
    
    func sendEmail(receiver string) {
    	auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
    	msg := []byte("Subject: 这里是标题内容
    
    " + "这里是正文内容
    ")
    	err := smtp.SendMail(SMTPHost+SMTPPort, auth, SMTPUsername, []string{receiver}, msg)
    	if err != nil {
    		log.Fatal("failed to send email:", err)
    	}
    }
    
    func sendHTMLEmail(receiver string, html []byte) {
    	auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
    	msg := append([]byte("Subject: 这里是标题内容
    "+
    		"MIME-version: 1.0;
    Content-Type: text/html; charset="UTF-8";
    
    "), 
    		html...)
    	err := smtp.SendMail(SMTPHost+SMTPPort, auth, SMTPUsername, []string{receiver}, msg)
    	if err != nil {
    		log.Fatal("failed to send email:", err)
    	}
    }
    
    func main() {
    	sendHTMLEmail("接受者@gmail.com", []byte("<html><h2>这是网页内容</h2></html>"))
    }
    

    方法2. 使用 jordan-wright 库

    package main
    
    import (
    	"log"
    	"fmt"
    	"net/smtp"
    	"github.com/jordan-wright/email"
    )
    
    const (
    	SMTPHost     = "smtp.gmail.com"
    	SMTPPort     = ":587"
    	SMTPUsername = "xxx@gmail.com"
    	SMTPPassword = "xxxx"
    )
    
    func sendEmail(receiver string) {
    	auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
    	e := &email.Email{
    		From:    fmt.Sprintf("发送者名字<%s>", SMTPUsername),
    		To:      []string{receiver},
    		Subject: "这里是标题内容",
    		Text:    []byte("这里是正文内容"),
    	}
    	err := e.Send(SMTPHost+SMTPPort, auth)
    	if err != nil {
    		log.Fatal(err)
    	}
    }
    
    func sendHTMLEmail(receiver string, html []byte) {
    	auth := smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost)
    	e := &email.Email{
    		From:    fmt.Sprintf("发送者名字<%s>", SMTPUsername),
    		To:      []string{receiver},
    		Subject: "这里是标题内容",
    		HTML:    html,
    	}
    	err := e.Send(SMTPHost+SMTPPort, auth)
    	if err != nil {
    		log.Fatal(err)
    	}
    }
    
    func main() {
    	sendHTMLEmail("接受者@gmail.com", []byte("<html><h2>这是网页内容</h2></html>"))
    }
    

    方法3. 使用 jordan-wright 库的 Pool

    package main
    
    import (
    	"log"
    	"fmt"
    	"time"
    	"net/smtp"
    	"github.com/jordan-wright/email"
    )
    
    const (
    	SMTPHost     = "smtp.gmail.com"
    	SMTPPort     = ":587"
    	SMTPUsername = "xxx@gmail.com"
    	SMTPPassword = "xxxx"
    	MaxClient    = 5
    )
    
    var pool *email.Pool
    
    func sendEmail(receiver string) {
    	var err error
    	if pool == nil {
    		pool, err = email.NewPool(SMTPHost+SMTPPort, MaxClient, smtp.PlainAuth("", SMTPUsername, SMTPPassword, SMTPHost))
    		if err != nil {
    			log.Fatal(err)
    		}
    	}
    	e := &email.Email{
    		From:    fmt.Sprintf("发送者名字<%s>", SMTPUsername),
    		To:      []string{receiver},
    		Subject: "这里是标题内容",
    		Text:    []byte("这里是正文内容"),
    	}
    	err =  pool.Send(e, 5 * time.Second)
    	if err != nil {
    		log.Fatal(err)
    	}
    }
    

    对比总结

    如果只是发送少量邮件,可以使用前两种方法。但是如果需要一次性发送较多邮件,需要使用第三种方法,即连接池。

  • 相关阅读:
    网页中的图片查看器viewjs使用
    检测和删除多余无用的css
    网页中插入视频的方案
    WebSocket使用教程
    JS+CSS简单实现DIV遮罩层显示隐藏【转藏】
    使用GPS经纬度定位附近地点(某一点范围内查询)
    使用SQL Server Management Studio 创建数据库备份作业
    SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
    关于LINQ方方面面的入门、进阶、深入的文章。
    LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
  • 原文地址:https://www.cnblogs.com/flipped/p/13845690.html
Copyright © 2011-2022 走看看