golang通过Mailgun API发送邮件的插件库mailgun-go的使用
Golang通过Mailgun API发送邮件的插件库mailgun-go的使用
安装
如果你使用Go Modules,请确保在导入路径中包含/v5
:
go get github.com/mailgun/mailgun-go/v5
使用示例
发送消息
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/mailgun/mailgun-go/v5"
)
// 可用的域名可以在这里找到:
var yourDomain = "your-domain-name" // 例如 mg.yourcompany.com
// 你可以在账户菜单的"设置"下找到私钥:
var privateAPIKey = "your-private-key"
func main() {
// 创建Mailgun客户端实例
mg := mailgun.NewMailgun(privateAPIKey)
// 如果是欧盟域名,必须指定端点:
// err := mg.SetAPIBase(mailgun.APIBaseEU)
sender := "sender@example.com"
subject := "Fancy subject!"
body := "Hello from Mailgun Go!"
recipient := "recipient@example.com"
// 消息对象允许你添加附件和Bcc收件人
message := mailgun.NewMessage(yourDomain, sender, subject, body, recipient)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
// 发送消息,设置10秒超时
resp, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %s Resp: %s\n", resp.ID, resp.Message)
}
获取事件
package main
import (
"context"
"fmt"
"time"
"github.com/mailgun/mailgun-go/v5"
"github.com/mailgun/mailgun-go/v5/events"
)
func main() {
// 你可以在账户菜单的"设置"下找到私钥:
mg := mailgun.NewMailgun("your-private-key")
it := mg.ListEvents("your-domain.com", &mailgun.ListEventOptions{Limit: 100})
var page []events.Event
// 整个操作不应超过30秒
ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
defer cancel()
// 对于每100个事件的页面
for it.Next(ctx, &page) {
for _, e := range page {
// 你可以通过接口访问一些字段
fmt.Printf("Event: '%s' TimeStamp: '%s'\n", e.GetName(), e.GetTimestamp())
// 你可以根据事件类型采取行动
switch event := e.(type) {
case *events.Accepted:
fmt.Printf("Accepted: auth: %t\n", event.Flags.IsAuthenticated)
case *events.Delivered:
fmt.Printf("Delivered transport: %s\n", event.Envelope.Transport)
case *events.Failed:
fmt.Printf("Failed reason: %s\n", event.Reason)
case *events.Clicked:
fmt.Printf("Clicked GeoLocation: %s\n", event.GeoLocation.Country)
case *events.Opened:
fmt.Printf("Opened GeoLocation: %s\n", event.GeoLocation.Country)
case *events.Rejected:
fmt.Printf("Rejected reason: %s\n", event.Reject.Reason)
case *events.Stored:
fmt.Printf("Stored URL: %s\n", event.Storage.URL)
case *events.Unsubscribed:
fmt.Printf("Unsubscribed client OS: %s\n", event.ClientInfo.ClientOS)
}
}
}
}
发送HTML模板邮件
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/mailgun/mailgun-go/v5"
)
var yourDomain = "your-domain-name"
var privateAPIKey = "your-private-key"
func main() {
mg := mailgun.NewMailgun(privateAPIKey)
sender := "sender@example.com"
subject := "HTML email!"
recipient := "recipient@example.com"
message := mailgun.NewMessage(yourDomain, sender, subject, "", recipient)
body := `
<html>
<body>
<h1>Sending HTML emails with Mailgun</h1>
<p style="color:blue; font-size:30px;">Hello world</p>
<p style="font-size:30px;">More examples can be found <a href="https://documentation.mailgun.com/en/latest/api-sending.html#examples">here</a></p>
</body>
</html>
`
message.SetHTML(body)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
resp, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %s Resp: %s\n", resp.ID, resp.Message)
}
使用模板
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/mailgun/mailgun-go/v5"
)
var yourDomain = "your-domain-name"
var privateAPIKey = "your-private-key"
func main() {
mg := mailgun.NewMailgun(privateAPIKey)
sender := "sender@example.com"
subject := "Fancy subject!"
body := ""
recipient := "recipient@example.com"
message := mailgun.NewMessage(yourDomain, sender, subject, body, recipient)
message.SetTemplate("passwordReset")
err := message.AddTemplateVariable("passwordResetLink", "some link to your site unique to your user")
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
resp, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %s Resp: %s\n", resp.ID, resp.Message)
}
欧盟区域
欧洲客户需要更改默认的API基础URL来访问你的域名:
mg := mailgun.NewMailgun("private-api-key")
mg.SetAPIBase(mailgun.APIBaseEU)
测试
警告 - 运行测试会花费你的钱!
要运行测试,必须设置各种环境变量。这些是:
MG_DOMAIN
是域名 - 这是在Mailgun管理界面中注册的值。MG_API_KEY
是私钥 - 你可以从Mailgun安全页面获取此值MG_EMAIL_TO
是在各种发送测试中使用的电子邮件地址。
最后:
MG_SPEND_MONEY
如果设置了此值,将运行使用API实际发送电子邮件的测试部分 - 请注意,这将计入你的配额,并且这会花费你的钱。
代码在3条款BSD许可证下发布。有关更多信息,请参阅LICENSE文件。
更多关于golang通过Mailgun API发送邮件的插件库mailgun-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang通过Mailgun API发送邮件的插件库mailgun-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用mailgun-go库通过Mailgun API发送邮件
mailgun-go是Mailgun官方提供的Golang SDK,可以方便地通过Mailgun API发送邮件。下面我将详细介绍如何使用这个库。
安装
首先需要安装mailgun-go库:
go get github.com/mailgun/mailgun-go/v4
基本使用
1. 初始化客户端
package main
import (
"context"
"log"
"time"
"github.com/mailgun/mailgun-go/v4"
)
func main() {
// 初始化Mailgun客户端
// 参数: 你的域名(如 sandboxxxx.mailgun.org), API密钥
mg := mailgun.NewMailgun("your-domain.com", "your-api-key")
// 如果是EU区域的账户,需要设置API基础URL
// mg.SetAPIBase("https://api.eu.mailgun.net/v3")
}
2. 发送简单邮件
func sendSimpleEmail(mg mailgun.Mailgun) {
// 设置发件人
sender := "sender@your-domain.com"
// 设置收件人
recipient := "recipient@example.com"
// 邮件主题
subject := "Hello from Mailgun"
// 邮件正文
body := "This is a test email sent using Mailgun API"
// 创建消息
message := mg.NewMessage(sender, subject, body, recipient)
// 设置上下文超时
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
// 发送邮件
resp, id, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
log.Printf("ID: %s Resp: %s\n", id, resp)
}
3. 发送HTML邮件
func sendHTMLEmail(mg mailgun.Mailgun) {
sender := "sender@your-domain.com"
recipient := "recipient@example.com"
subject := "HTML Email from Mailgun"
body := "Plain text version of the email"
html := `<html><body><h1>Hello!</h1><p>This is an <b>HTML</b> email!</p></body></html>`
message := mg.NewMessage(sender, subject, body, recipient)
message.SetHtml(html)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
_, _, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
}
4. 添加附件
func sendEmailWithAttachment(mg mailgun.Mailgun) {
sender := "sender@your-domain.com"
recipient := "recipient@example.com"
subject := "Email with Attachment"
body := "Please see the attached file."
message := mg.NewMessage(sender, subject, body, recipient)
// 添加附件
err := message.AddAttachment("path/to/file.pdf")
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
_, _, err = mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
}
高级功能
1. 批量发送
func sendBulkEmails(mg mailgun.Mailgun) {
sender := "sender@your-domain.com"
subject := "Bulk Email Test"
body := "This is a bulk email test."
// 创建批量消息
message := mg.NewMessage(sender, subject, body)
// 添加多个收件人
recipients := []string{
"user1@example.com",
"user2@example.com",
"user3@example.com",
}
for _, recipient := range recipients {
message.AddRecipient(recipient)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
_, _, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
}
2. 使用模板发送
func sendTemplatedEmail(mg mailgun.Mailgun) {
sender := "sender@your-domain.com"
recipient := "recipient@example.com"
subject := "Templated Email"
// 创建消息
message := mg.NewMessage(sender, subject, "", recipent)
// 设置模板名称和变量
message.SetTemplate("welcome")
err := message.AddVariable("username", "John Doe")
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
_, _, err = mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
}
3. 设置自定义头信息
func sendEmailWithCustomHeaders(mg mailgun.Mailgun) {
sender := "sender@your-domain.com"
recipient := "recipient@example.com"
subject := "Email with Custom Headers"
body := "This email has custom headers."
message := mg.NewMessage(sender, subject, body, recipient)
// 添加自定义头
message.AddHeader("X-My-Header", "MyValue")
message.AddHeader("X-Another-Header", "AnotherValue")
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
_, _, err := mg.Send(ctx, message)
if err != nil {
log.Fatal(err)
}
}
错误处理
Mailgun API可能会返回各种错误,建议进行适当的错误处理:
func sendEmailWithErrorHandling(mg mailgun.Mailgun) {
// ... 创建消息 ...
ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
defer cancel()
_, _, err := mg.Send(ctx, message)
if err != nil {
if mailgunErr, ok := err.(*mailgun.UnexpectedResponseError); ok {
log.Printf("Mailgun API error: %d %s", mailgunErr.StatusCode, mailgunErr.Message)
} else {
log.Printf("Other error: %v", err)
}
return
}
log.Println("Email sent successfully")
}
最佳实践
- 环境变量:不要将API密钥硬编码在代码中,使用环境变量:
domain := os.Getenv("MAILGUN_DOMAIN")
apiKey := os.Getenv("MAILGUN_API_KEY")
-
超时设置:根据网络情况设置合理的超时时间。
-
批量发送限制:Mailgun对批量发送有限制,注意查阅最新文档。
-
日志记录:记录发送结果和错误信息以便排查问题。
-
测试环境:开发时使用Mailgun提供的沙盒环境进行测试。
通过mailgun-go库,你可以轻松集成Mailgun的邮件发送功能到你的Golang应用中,支持从简单文本邮件到复杂的模板邮件的各种需求。