Go
复制代码
package main
import (
"context"
"fmt"
redis "github.com/go-redis/redis/v8"
"gopkg.in/gomail.v2"
"gopkg.in/ini.v1"
"log"
"time"
)
func main() {
// 1、连接redis,确保redis服务已开启
// 创建一个Redis客户端实例
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
Password: "", // 没有密码就留空
DB: 0, // 使用默认DB
})
// 关闭 Redis 连接
defer rdb.Close()
ctx := context.Background()
// 检查连接
pong, err := rdb.Ping(context.Background()).Result()
if err != nil {
fmt.Println("连接Redis失败", err)
return
}
fmt.Println(pong) // 输出 PING 命令的响应
// 模拟添加邮件到待发送队列
email1 := "123xxx@qq.com"
email2 := "123xxx@qq.com"
email3 := "123xxx@qq.com"
// 使用LPush命令向名为'my_list'的列表中添加元素
//values := []interface{}{"2576265911@qq.com", "2576265911@qq.com", "2576265911@qq.com"}
//err := rdb.LPush(ctx, "email_queue", email1, email2, email3).Err()
err = rdb.LPush(ctx, "email_queue", email1, email2, email3).Err()
if err != nil {
log.Fatalf("无法推送到列表: %v", err)
}
// 初始化邮件发送配置
cfg, err := ini.Load("conf/email_config.ini")
if err != nil {
log.Fatalf("加载邮件配置失败: %v", err)
}
sender := cfg.Section("AUTHENTICATION").Key("username").String()
password := cfg.Section("AUTHENTICATION").Key("password").String()
smtpServer := cfg.Section("SMTP_SERVER").Key("smtp_server").String()
smtpPort := cfg.Section("SMTP_SERVER").Key("smtp_port").MustInt(587)
// 连接到 SMTP 服务器
d := gomail.NewDialer(smtpServer, smtpPort, sender, password)
// 循环处理邮件队列
for {
// 从 Redis 队列中获取邮件
email, err := rdb.RPop(ctx, "email_queue").Result()
if err == redis.Nil {
// 队列为空,退出循环
fmt.Println("电子邮件队列为空。")
break
} else if err != nil {
log.Fatalf("无法从队列中获取电子邮件: %v", err)
}
// 创建邮件消息
m := gomail.NewMessage()
m.SetHeader("From", cfg.Section("EMAIL").Key("from").String())
m.SetHeader("To", email)
m.SetHeader("Subject", cfg.Section("EMAIL").Key("subject").String())
// 设置邮件内容
m.SetBody("text/plain", cfg.Section("EMAIL").Key("body").String())
// 发送邮件
if err := d.DialAndSend(m); err != nil {
log.Fatalf("无法将电子邮件发送到:%s: %v", email, err)
}
// 模拟邮件发送后的一些操作
fmt.Printf("发送电子邮件至:%s\n", email)
time.Sleep(5 * time.Second) // 可以添加一些延迟以限制发送速率
}
}