Golang如何发送包含复杂数据的程序结果邮件

Golang如何发送包含复杂数据的程序结果邮件 我使用以下代码打印数据:

for _, reisai := range reisai1 {
    fmt.Println(reisai)
}

得到的结果如下:

image

reisai 是一个映射。

我的问题是如何将这些结果发送到电子邮件?我查看了 SMTP - Google 的方式,需要在代码中添加 Gmail 用户名和密码,但这不是我想要的选项。还有其他方法可以实现吗?


更多关于Golang如何发送包含复杂数据的程序结果邮件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang如何发送包含复杂数据的程序结果邮件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可以使用Go标准库的net/smtp包配合第三方SMTP服务来发送邮件,避免在代码中直接使用Gmail凭据。以下是完整的解决方案:

package main

import (
    "bytes"
    "fmt"
    "net/smtp"
    "text/template"
)

// 邮件配置
type EmailConfig struct {
    Host     string
    Port     string
    Username string
    From     string
    Password string
}

// 发送邮件函数
func sendEmail(config EmailConfig, to []string, subject string, body string) error {
    auth := smtp.PlainAuth("", config.Username, config.Password, config.Host)
    
    msg := []byte("To: " + to[0] + "\r\n" +
        "Subject: " + subject + "\r\n" +
        "Content-Type: text/plain; charset=UTF-8\r\n" +
        "\r\n" +
        body + "\r\n")
    
    addr := config.Host + ":" + config.Port
    return smtp.SendMail(addr, auth, config.From, to, msg)
}

// 格式化复杂数据为字符串
func formatReisaiData(reisai []map[string]interface{}) string {
    var buffer bytes.Buffer
    
    for i, item := range reisai {
        buffer.WriteString(fmt.Sprintf("项目 %d:\n", i+1))
        for key, value := range item {
            buffer.WriteString(fmt.Sprintf("  %s: %v\n", key, value))
        }
        buffer.WriteString("\n")
    }
    
    return buffer.String()
}

func main() {
    // 示例数据 - 替换为实际的reisai数据
    reisai := []map[string]interface{}{
        {
            "ID":     1,
            "Name":   "项目A",
            "Amount": 100.50,
            "Date":   "2024-01-15",
        },
        {
            "ID":     2,
            "Name":   "项目B",
            "Amount": 200.75,
            "Date":   "2024-01-16",
        },
    }
    
    // 配置SMTP - 使用第三方服务如SendGrid、Mailgun等
    config := EmailConfig{
        Host:     "smtp.sendgrid.net", // 或其他SMTP服务商
        Port:     "587",
        Username: "apikey", // API密钥用户名
        From:     "your-email@domain.com",
        Password: "your-api-key", // 使用API密钥而非Gmail密码
    }
    
    // 格式化数据
    emailBody := formatReisaiData(reisai)
    
    // 发送邮件
    recipients := []string{"recipient@example.com"}
    subject := "程序执行结果"
    
    err := sendEmail(config, recipients, subject, emailBody)
    if err != nil {
        fmt.Printf("发送邮件失败: %v\n", err)
        return
    }
    
    fmt.Println("邮件发送成功")
}

如果需要HTML格式的邮件,可以使用模板:

// HTML邮件模板
const htmlTemplate = `
<!DOCTYPE html>
<html>
<head>
    <title>程序结果</title>
    <style>
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h2>程序执行结果</h2>
    <table>
        <tr>
            <th>字段</th>
            <th>值</th>
        </tr>
        {{range .}}
        <tr>
            <td colspan="2"><strong>项目 {{.Index}}</strong></td>
        </tr>
        {{range .Items}}
        <tr>
            <td>{{.Key}}</td>
            <td>{{.Value}}</td>
        </tr>
        {{end}}
        {{end}}
    </table>
</body>
</html>
`

// 发送HTML邮件
func sendHTMLEmail(config EmailConfig, to []string, subject string, htmlBody string) error {
    auth := smtp.PlainAuth("", config.Username, config.Password, config.Host)
    
    msg := []byte("To: " + to[0] + "\r\n" +
        "Subject: " + subject + "\r\n" +
        "Content-Type: text/html; charset=UTF-8\r\n" +
        "\r\n" +
        htmlBody + "\r\n")
    
    addr := config.Host + ":" + config.Port
    return smtp.SendMail(addr, auth, config.From, to, msg)
}

使用第三方SMTP服务的优势:

  • 不需要在代码中存储Gmail密码
  • 使用API密钥更安全
  • 更高的发送限制
  • 更好的送达率

常用的SMTP服务提供商:

  • SendGrid
  • Mailgun
  • Amazon SES
  • Mailjet

配置示例(SendGrid):

config := EmailConfig{
    Host:     "smtp.sendgrid.net",
    Port:     "587", 
    Username: "apikey",
    From:     "your-verified-email@domain.com",
    Password: "SG.your-sendgrid-api-key", // 从SendGrid控制台获取
}
回到顶部