=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)」的功能;
- 增加「可添加附件」的功能;
参考链接:
- GO使用SMTP发送邮件#测试OK
- https://golang.org/pkg/net/smtp/
- Golang 发送邮件#未测试
- Golang1.7.3发送大附件邮件#未测试
- 使用golang实现批量发送面试邀请邮件
- golang 通过 qq 开通smtp 发送邮件的 全步骤(tls +ssl)
=END=
《 “Go语言学习#10-如何发送邮件” 》 有 2 条评论
解决SMTP发信暴露服务器源IP的方法
https://paper.tuisec.win/detail/7b86543881528d2
https://www.gaomingsong.com/537.html
`
最近很多朋友问,SMTP发信会暴露网站服务器的IP(即使用了CDN),该怎么解决这个问题呢?解决方法其实有很多种,我就说说我目前在用的一种方法,就是使用Haproxy中转。
第一步:需要找一台机器做中转,先安装Haproxy。
第二步:登录WEB服务器,把smtp地址写进/etc/hosts文件,指向中转服务器的IP。
`
golang写的IM服务器
https://github.com/alberliu/gim
`
简要介绍
gim是一个即时通讯服务器,代码全部使用golang完成。主要功能
1.离线消息同步
2.多业务接入
3.单用户多设备同时在线
4.单聊,群聊,以及超大群聊天场景
5.支持服务水平扩展
使用技术:
数据库:Mysql+Redis
组件:grpc+jsoniter+zap
`