背景
我的线上环境基本上都是内网环境,通过一台外网的前置机进行外网通信。这样在上文执行k8s巡检脚本后生成的html文件,无法直接通过脚本发送到邮箱。所以需要对脚本进行一些修改。这里使用go实现。
步骤
安装go
服务器如果没有go命令的话,需要先行安装。下载地址为:https://go.dev/dl/
# 解压
tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
# 添加环境变量
export PATH=$PATH:/usr/local/go/bin
source ~/.bash_profile
或
source /etc/profile
下载connectproxy
gomail文档地址:https://github.com/go-gomail/gomail
connectproxy文档地址:https://pkg.go.dev/github.com/magisterquis/connectproxy
先在有外网机器上下载打包。
go env -w GOPROXY=https://goproxy.cn,direct
go get github.com/magisterquis/connectproxy
# 包会保存到GOPATH/pkg/mod/github.com/magisterquis
tar czvf connectproxy.tar connectproxy@v0.0.0-20200725203833-3582e84f0c9b
然后再上传到离线机器上。
cd GOPATH
mkdir -p src/github.com/magisterquis
cd src/github.com/magisterquis
tar xvf connectproxy.tar
go env -w GOSUMDB=off
脚本内容
package main
import (
"crypto/tls"
"fmt"
"golang.org/x/net/proxy"
"log"
"net/smtp"
"net/url"
"os"
"github.com/magisterquis/connectproxy"
)
func main() {
// 代理地址
proxyAddr, err := url.Parse("http://1.2.3.4:6666")
if err != nil {
log.Fatal(err)
}
fmt.Println("代理地址是:", proxyAddr)
// 创建代理连接
d, err := connectproxy.New(proxyAddr, proxy.Direct)
if err != nil {
log.Fatal(err)
}
fmt.Println("创建代理连接")
/// 创建到SMTP服务器的连接
conn, err := d.Dial("tcp", "smtp.qq.com:25")
if err != nil {
log.Fatal(err)
}
fmt.Println("创建到SMTP服务器的连接")
// 创建SMTP客户端
client, err := smtp.NewClient(conn, "smtp.qq.com")
if err != nil {
log.Fatal(err)
}
fmt.Println("创建SMTP客户端")
// 禁用TLS
if err = client.StartTLS(&tls.Config{InsecureSkipVerify: true}); err != nil {
log.Fatal(err)
}
fmt.Println("禁用TLS")
// 验证
if err = client.Auth(smtp.PlainAuth("", "xxx", "xxxxxxxx", "smtp.qq.com")); err != nil {
log.Fatal(err)
}
fmt.Println("用户验证")
// 读取HTML文件内容
htmlContent, err := os.ReadFile("/opt/xunjian/check.html")
if err != nil {
log.Fatal(err)
}
fmt.Println("读取HTML文件内容")
// 创建邮件正文
body := string(htmlContent)
msg := []byte("To: " + "234@qq.cn" + "\r\nFrom: " + "123@qq.com" + ">\r\nSubject: 巡检报告内网发送测试!" + "\r\n" + "Content-Type: text/html" + "\r\n\r\n" + body)
fmt.Println("创建邮件正文")
// 发送邮件
fmt.Println("发送邮件")
if err = client.Mail("123@qq.com"); err != nil {
log.Fatal(err)
}
if err = client.Rcpt("234@qq.cn"); err != nil {
log.Fatal(err)
}
wc, err := client.Data()
if err != nil {
log.Fatal(err)
}
_, err = wc.Write([]byte(msg))
if err != nil {
log.Fatal(err)
}
err = wc.Close()
if err != nil {
log.Fatal(err)
}
err = client.Quit()
if err != nil {
log.Fatal(err)
}
fmt.Println("邮件发送成功!")
}
发送邮件
go run smtp.go
查看邮件
发送成功。