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")
}

最佳实践

  1. 环境变量:不要将API密钥硬编码在代码中,使用环境变量:
domain := os.Getenv("MAILGUN_DOMAIN")
apiKey := os.Getenv("MAILGUN_API_KEY")
  1. 超时设置:根据网络情况设置合理的超时时间。

  2. 批量发送限制:Mailgun对批量发送有限制,注意查阅最新文档。

  3. 日志记录:记录发送结果和错误信息以便排查问题。

  4. 测试环境:开发时使用Mailgun提供的沙盒环境进行测试。

通过mailgun-go库,你可以轻松集成Mailgun的邮件发送功能到你的Golang应用中,支持从简单文本邮件到复杂的模板邮件的各种需求。

回到顶部