Go发送Email

Posted sz-wenbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go发送Email相关的知识,希望对你有一定的参考价值。

使用Go发送邮件,目前官网GO 1.12的版本的文档中,包 "net/smtp" 仅支持支持两种SMTP的认证方式。CRAM-MD5和PLAIN 认证方式。

CRAM-MD5 是基于Keyed-MD5的认证方式

PLAIN 是一种明文的验证方式

我们公司使用的邮件服务器SMTP支持两种认证方式:NTLM  和 LOGIN

查看邮件服务器支持SMTP的认证方式的方法:

  技术图片

在这种情况下:

1、直接使用Go官网"net/smtp"的认证方式发送邮件回报错

报错:x509: certificate signed by unknown authority

 理解: 这个是GO的客户端对服务器传过来数字证书进行校验,可以进行关闭,不进行校验。

代码:

if ok, _ := c.Extension("STARTTLS"); ok 
        config := &tls.ConfigServerName: c.serverName, InsecureSkipVerify: true
        if testHookStartTLS != nil 
            testHookStartTLS(config)
        
        if err = c.StartTLS(config); err != nil 
            return err
        
    

 

报错:504 5.7.4 Unrecognized authentication type

 理解:GO官网包  "net/smtp" 仅支持 CRAM-MD5和PLAIN 而我们公司邮件服务器支持认证方式 NTLM  和 LOGIN

2、支持SMTP的LOGIN认证方式的代码

type LoginAuth struct 
    username string
    password string


func NewLoginAuth(username, password string) smtp.Auth 
    return &LoginAuthusername, password


func (a *LoginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) 
    return "LOGIN", []byte, nil


func (a *LoginAuth) Next(fromServer []byte, more bool) ([]byte, error) 
    if more 
        switch string(fromServer) 
        case "Username:":
            return []byte(a.username), nil
        case "Password:":
            return []byte(a.password), nil
        default:
            return nil, errors.New("Unknown fromServer")
        
    
    return nil, nil


func SendMail(addr string, a smtp.Auth, subject string, from string, to []string, msg []byte) error 
    c, err := smtp.Dial(addr)
    host, _, _ := net.SplitHostPort(addr)
    if err != nil 
        fmt.Println("call dial")
        return err
    
    defer c.Close()

    if ok, _ := c.Extension("STARTTLS"); ok 
        config := &tls.ConfigServerName: host, InsecureSkipVerify: true
        if err = c.StartTLS(config); err != nil 
            fmt.Println("call start tls")
            return err
        
    

    if a != nil 
        if ok, _ := c.Extension("AUTH"); ok 
            if err = c.Auth(a); err != nil 
                fmt.Println("check auth with err:", err)
                return err
            
        
    

    if err = c.Mail(from); err != nil 
        return err
    
    for _, addr := range to 
        if err = c.Rcpt(addr); err != nil 
            return err
        
    
    w, err := c.Data()
    if err != nil 
        return err
    

    header := make(map[string]string)
    header["Subject"] = subject
    header["MIME-Version"] = "1.0"
    header["Content-Type"] = "text/plain; charset=\\"utf-8\\""
    header["Content-Transfer-Encoding"] = "base64"
    message := ""
    for k, v := range header 
        message += fmt.Sprintf("%s: %s\\r\\n", k, v)
    
    message += "\\r\\n" + base64.StdEncoding.EncodeToString(msg)
    _, err = w.Write([]byte(message))

    if err != nil 
        return err
    
    err = w.Close()
    if err != nil 
        return err
    
    return c.Quit()

 

以上是关于Go发送Email的主要内容,如果未能解决你的问题,请参考以下文章

无法将图像发送到 Go 服务器

发email会不会遇到显示“已发送”却没有发送成功的情况。而且没有“未发成功”的提示回复给你。

python - 发送邮件(email模块(内置))

go 接收发送文件

SSIS常用的包—发送Email任务

(10)go-micro微服务发送邮件