openfalcon mail provider starttls 版本

报警邮件对ops很重要,在过去的时候,我们openfalcon中使用的是smtp mail provider https://github.com/open-falcon/mail-provider, 但是只是支持smtp 25明文传输。

但是,随着安全意识的提高,加密的smtp,一般使用startls的使用越来越广泛,比如fastmail就要求必须使用tls, 要么是587端口的startls,要么是465端口的tls。

经过一番折腾,参考了 go mail smtp tls里面的example,改了mail provider的弹头部分,变成了支持startls的smtp server。

  • http/mail.go
package http

import (
        "fmt"
    "net/http"
    "strings"
    "github.com/open-falcon/mail-provider/config"
    //"github.com/toolkits/smtp"
    "github.com/toolkits/web/param"
        //"net"
        "net/mail"
        "net/smtp"
        "crypto/tls"
        "log"
)

func configProcRoutes() {

    http.HandleFunc("/sender/mail", func(w http.ResponseWriter, r *http.Request) {
        cfg := config.Config()
        token := param.String(r, "token", "")
        if cfg.Http.Token != token {
            http.Error(w, "no privilege", http.StatusForbidden)
            return
        }

        tos := param.MustString(r, "tos")
        subject := param.MustString(r, "subject")
        content := param.MustString(r, "content")
        tos = strings.Replace(tos, ",", ";", -1)

        //s := smtp.New(cfg.Smtp.Addr, cfg.Smtp.Username, cfg.Smtp.Password)
        //err := s.SendMail(cfg.Smtp.From, tos, subject, content)
        //if err != nil {
        //  http.Error(w, err.Error(), http.StatusInternalServerError)
        //} else {
        //  http.Error(w, "success", http.StatusOK)
        //}

// 参考 https://gist.github.com/chrisgillis/10888032 , 对上面一段的smtp不加密传输进行弹头改装,如下。
// 测试的时候,使用的是fastmail,注意两点,一个是生成一个app使用的发送的密码,另外一个就是要使用端口587(starttls,使用465不work。)
// 参考 https://www.fastmail.com/help/technical/servernamesandports.html#email
    from := mail.Address{"", cfg.Smtp.From}
    to   := mail.Address{"", tos}
    subj := subject
    body := content

    // Setup headers
    headers := make(map[string]string)
    headers["From"] = from.String()
    headers["To"] = to.String()
    headers["Subject"] = subj

    // Setup message
    message := ""
    for k,v := range headers {
        message += fmt.Sprintf("%s: %s\r\n", k, v)
    }
    message += "\r\n" + body

    auth := smtp.PlainAuth("",cfg.Smtp.Username, cfg.Smtp.Password, cfg.Smtp.Addr)

    // TLS config
    tlsconfig := &tls.Config {
        InsecureSkipVerify: false,
        ServerName: cfg.Smtp.Addr,
    }

    // Here is the key, you need to call tls.Dial instead of smtp.Dial
    // for smtp servers running on 465 that require an ssl connection
    // from the very beginning (no starttls)
    conn, err := tls.Dial("tcp", cfg.Smtp.Addr, tlsconfig)
    if err != nil {
        log.Panic(err)
    }

    c, err := smtp.NewClient(conn, cfg.Smtp.Addr)
    if err != nil {
        log.Panic(err)
    }

    // Auth
    if err = c.Auth(auth); err != nil {
        log.Panic(err)
    }

    // To && From
    if err = c.Mail(cfg.Smtp.From); err != nil {
        log.Panic(err)
    }

    if err = c.Rcpt(tos); err != nil {
        log.Panic(err)
    }

    // Data
    //w, err = c.Data()
    p, err := c.Data()
    if err != nil {
        log.Panic(err)
    }

    _, err = p.Write([]byte(message))
    if err != nil {
        log.Panic(err)
    }

    err = p.Close()
    if err != nil {
        log.Panic(err)
    }

    c.Quit()







                http.Error(w,"complete!",http.StatusOK)
    })

}
  • 一开始,直接使用465端口,没反应。
    这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值