Golang如何发送包含复杂数据的程序结果邮件
Golang如何发送包含复杂数据的程序结果邮件 我使用以下代码打印数据:
for _, reisai := range reisai1 { fmt.Println(reisai) }得到的结果如下:
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控制台获取
}


