Go语言学习#10-如何发送邮件


=Start=

缘由:

在程序运行期间,因为所处环境、依赖条件等的各种变化,不可避免的会出现意想不到的情况(异常/错误),针对其中的运行时异常,我们一般会通过邮件或IM来通知运维人员,以采取相应措施,这里就整理一下用Go 语言编程实现邮件发送功能的例子,方便以后参考和使用。

正文:

参考解答:

下面这个例子比较简单,改一下对应的用户名、密码、SMTP地址以及收件人就可以进行测试。

package main

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

func SendToMail(user, password, host, to, subject, body, mailtype string) error {
    hp := strings.Split(host, ":")
    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, ";")

    auth := smtp.PlainAuth("", user, password, hp[0])
    err := smtp.SendMail(host, auth, user, send_to, msg)
    return err
}

func main() {
    user := "[email protected]"
    password := "password"
    host := "smtp.163.com:25"

    subject := "使用Golang发送邮件"
    to := "[email protected]"

    body := `
        <html>
        <body>
        <h3>
        Test to use Golang send mail.
        </h3>
        </body>
        </html>
        `
    fmt.Println("Send mail")
    err := SendToMail(user, password, host, to, subject, body, "html")
    if err != nil {
        fmt.Println("Send mail error!")
        fmt.Println(err)
    } else {
        fmt.Println("Send mail success!")
    }

}

 

如果要用到实际的生产环境中,还需要解决几个问题才会显得好一些,比如:

  • 对固定的user/password/host这几个字段全局化处理,只做一次PlainAuth操作得到auth变量,将后续同一个user的发件都共用auth变量进行;
  • 可以考虑借助template改进一下邮件格式,增强用户体验;
  • 增加「抄送(CC)/密送(BCC)」的功能;
  • 增加「可添加附件」的功能;

 

参考链接:

=END=

,

《 “Go语言学习#10-如何发送邮件” 》 有 2 条评论

  1. 解决SMTP发信暴露服务器源IP的方法
    https://paper.tuisec.win/detail/7b86543881528d2
    https://www.gaomingsong.com/537.html
    `
    最近很多朋友问,SMTP发信会暴露网站服务器的IP(即使用了CDN),该怎么解决这个问题呢?解决方法其实有很多种,我就说说我目前在用的一种方法,就是使用Haproxy中转。

    第一步:需要找一台机器做中转,先安装Haproxy。
    第二步:登录WEB服务器,把smtp地址写进/etc/hosts文件,指向中转服务器的IP。
    `

  2. golang写的IM服务器
    https://github.com/alberliu/gim
    `
    简要介绍
    gim是一个即时通讯服务器,代码全部使用golang完成。主要功能
    1.离线消息同步
    2.多业务接入
    3.单用户多设备同时在线
    4.单聊,群聊,以及超大群聊天场景
    5.支持服务水平扩展

    使用技术:
    数据库:Mysql+Redis
    组件:grpc+jsoniter+zap
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注