Jump to content
IPS Community Suite 简体中文
Sign in to follow this  
ipscn

Golang send email via TLS

Recommended Posts

本文记录在阿里云VPS 上,使用 Go 语言和 126 SMTP 免费服务发送必要邮件的实现。

安装 Golang

查看下是否安装过

whereis go

如果没有显示出路径,那么,这台服务器就没有安装过 Golang ,需要安装下,如果不是太确定服务器架构,可查看下:

arch

如果看到的是 x86_64 ,那就是 64 位的系统,安装 Golang :

wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz --no-check-certificate
tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
rm -f go1.9.2.linux-amd64.tar.gz

然后按照 Golang 官方说明,把 Golang 加入到环境变量中:

export PATH=$PATH:/usr/local/go/bin

确定安装成功,执行:

go version

如果看到相应的版本输出,说明成功了,如果没看到,不对,不可能看不到的啊。。。

SMTP 账号准备

以 126 邮箱为例:设置->POP3/SMTP/IMAP,点击页面左侧菜单中的 "客户端授权密码",设置下客户端授权码,记住它。

服务器防火墙允许 465 端口

以 CentOS 6.X 为例。

先查看下防火墙规则中是否启用了 465 端口:

iptables -L -n

如果没有,添加

iptables -A INPUT -p tcp --dport 465   -j ACCEPT

保存

service iptables save

重启防火墙

service iptables restart

 

Golang 邮件发送的测试脚本

本地创建个文件 mailtls.go

/*
通过 SMTP 的 465 端口发送邮件

测试执行:

go run mailtls.go

*/
package main

import (
	"crypto/tls"
	"fmt"
	"log"
	"net"
	"net/smtp"
)

func main() {

	/*==============config================*/
	userPlain := "XXX@126.com"
	pwdPlain := "xxxBJ"

	fromPlain := "xxx@126.com"
	toPlain := "xxx@qq.com"
	hostPlain := "smtp.126.com"
	portPlain := 465
	/*==============//config================*/

	fmt.Println("开始发送")
	auth := smtp.PlainAuth(
		"",
		userPlain,
		pwdPlain,
		hostPlain,
	)

	to := []string{toPlain}
	msg := []byte("To: " + toPlain + "\r\n" +
		"Subject:一封 Golang  发出的邮件!!\r\n" +
		"\r\n" + "假装这是邮件内容!!\n世界,你好!\r\n")

	err := SendMailViaTLS(
		fmt.Sprintf("%s:%d", hostPlain, portPlain),
		auth,
		fromPlain,
		to,
		msg,
	)

	if err != nil {
		log.Fatal(err)
	} else {
		fmt.Println("发送完毕!")
	}
}

func Dial(addr string) (*smtp.Client, error) {
	conn, err := tls.Dial("tcp", addr, nil)
	if err != nil {
		log.Println("Dialing Error:", err)
		return nil, err
	}

	host, _, _ := net.SplitHostPort(addr)
	return smtp.NewClient(conn, host)
}

func SendMailViaTLS(addr string, auth smtp.Auth, from string,
	to []string, msg []byte) (err error) {

	c, err := Dial(addr)
	if err != nil {
		log.Println("Create SMTP Client fail:", err)
		return err
	}
	defer c.Close()

	if auth != nil {
		if ok, _ := c.Extension("AUTH"); ok {
			if err = c.Auth(auth); err != nil {
				log.Println("AUTH ERROR ", err)
				return err
			}
		}
	}

	if err = c.Mail(from); err != nil {
		return err
	}

	for _, addr := range to {
		if err = c.Rcpt(addr); err != nil {
			return err
		}
	}

	w, err := c.Data()
	if err != nil {
		return err
	}

	_, err = w.Write(msg)
	if err != nil {
		return err
	}

	err = w.Close()
	if err != nil {
		return err
	}

	return c.Quit()
}

按照自己的实际情况修改上面的配置 ( config 之间的内容),然后把文件上传到服务器的某个目录下。

打开服务器的模拟终端(一般是 XShell), 在文件所在目录执行:

go run mailtls.go

如果看到:

开始发送
发送完毕!

说明邮件已发送,可以去自己的邮箱的收件夹或者垃圾邮件收件夹看下。

 

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×