如何在Golang发送电子邮件
#go #email #smtp #golangdeveloper

如何在Golang中发送电子邮件

简介
net/smtp是一个内置的GO软件包,并实现了SMTP协议。它提供了一种通过SMTP服务器发送邮件的简单方法。我们将探索内置的NET/SMTP软件包和Gomail软件包以发送电子邮件。

先决条件

  • 对Golang的基本理解
  • GO版本1.10或更高版本。

发送电子邮件/SMTP

发送电子邮件

导入软件包

package main

import (
    "fmt"
    "net/smtp"
)

发送电子邮件

package main

import (
    "fmt"
    "net/smtp"
    "os"
)

// Main function
func  main() {
    // from is sender's email address
    from := os.Getenv("MAIL")
    password := os.Getenv("PASSWD")

    // toList is a list of email addresses that email is to be sent
    toList := []string{"example@gmail.com"}

    // host is address of server that the  sender's email address belongs,
    // in this case it's gmail.
    host := "smtp.gmail.com"

    // It's the default port of smtp server
    port := "587"

    // This is the message to send in the mail
    msg := "Hello World!"

    // We can't send strings directly in mail,
    // strings need to be converted into slice bytes
    body := []byte(msg)

    // PlainAuth uses the given username and password to
    // authenticate to host and act as identity.
    auth := smtp.PlainAuth("", from, password, host)

    // SendMail uses TLS connection to send the mail
    // The email is sent to all address in the toList,
    // the body should be of type bytes, not strings
    // This returns an error if any occurred.
    err := smtp.SendMail(host+":"+port, auth, from, toList, body)

    // handling the errors
    if err != nil { 
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Println("Successfully sent email!")
}

发送带有Gomail的电子邮件

导入软件包

package main

import (
    "crypto/tls"
    "fmt"
    gomail "gopkg.in/mail.v2"
)

发送电子邮件

package main

import (
    "crypto/tls"
    "fmt"
    gomail "gopkg.in/mail.v2"
)

func main() {
    m := gomail.NewMessage()

    m.SetHeader("From", "youremail@gmail.com")
    m.SetHeader("To", "recipient@example.com")

    m.SetHeader("Subject", "Sending Email with Goalang")

    // Set the email body. You can set plain text or html with text/html
    m.SetBody("text/plain", "Hello World!")

    // Settings for SMTP server
    d := gomail.NewDialer("smtp.gmail.com", 587, "youremail@gmail.com", "yourpassword")

    // This is only needed when the SSL/TLS certificate is not valid on the server.
    // In production this should be set to false.
    d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

    if err := d.DialAndSend(m); err != nil {
        fmt.Println(err)
        panic(err)
    }

    return
}

常见问题和决议

错误:无效登录:535-5.7.8不接受用户名和密码。
该错误的潜在解决方案可能是使Gmail服务能够在第三方应用程序中使用它。要解决此错误,只需在Gmail帐户中登录,并使用此链接

启用较低的安全应用程序

eTimedout错误
检查您的防火墙设置。超时通常会在您尝试在服务器上或计算机上打开端口的连接。

tls错误
检查您的防病毒设置。防病毒通常会弄乱电子邮件端口。 Node.js可能无法识别您的防病毒所使用的MITM证书。
最新的节点版本仅允许TLS版本1.2及更高版本,有些服务器仍可能使用TLS 1.1或更低。检查node.js文档如何获得应用程序的正确TLS支持。

结论

gmail效果很好,要么根本不起作用。切换到诸如Mayazy之类的替代电子邮件服务提供商可能更容易,而不是解决Gmail问题。使用Gmail作为生产服务器也不推荐,您应该选择电子邮件提供商来管理您的电子邮件。
Configuring and setting up Mailazy很容易,无缝,电子邮件可以在几分钟内成为sent