go

go内网环境使用代理地址发送邮件

背景

我的线上环境基本上都是内网环境,通过一台外网的前置机进行外网通信。这样在上文执行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://pkg.go.dev/github.com/magisterquis/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

查看邮件

发送成功。

file

分类: go
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x