=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
`