Go Redis 实现邮件群发

一、安装

复制代码
go get github.com/go-redis/redis/v8

二、邮箱服务配置,以QQ邮箱为例

三、示例代码

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 := "[email protected]"
	email2 := "[email protected]"
	email3 := "[email protected]"
	// 使用LPush命令向名为'my_list'的列表中添加元素
	//values := []interface{}{"[email protected]", "[email protected]", "[email protected]"}
	//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) // 可以添加一些延迟以限制发送速率
	}
}

四、邮件配置

Go 复制代码
# 以QQ邮箱为例
[SMTP_SERVER]
smtp_server = smtp.qq.com
#587或465,具体取决于SMTP服务器配置
smtp_port = 587

[AUTHENTICATION]
# 发送者邮箱
username = [email protected]
# 授权码,不是登录密码
password = aafrsdgsgsssfqw

[EMAIL]
# 发送者邮箱
from = [email protected]
subject = Test Email(邮件主题)
body = 这是我的应用程序发送的测试电子邮件。

[SECURITY]
use_tls = yes
tls_insecure_skip_verify = no


;这个配置文件包含以下部分:
;SMTP_SERVER: 存储 SMTP 服务器的主机名和端口号。
;AUTHENTICATION: 存储用于邮件认证的用户名和密码。
;EMAIL: 存储发送邮件时使用的发件人地址、邮件主题和邮件正文。
;SECURITY: 存储安全设置,比如是否使用 TLS 加密以及是否跳过 TLS 证书验证。
;请注意,你需要将示例中的占位符(如 smtp.example.com、[email protected] 和 your_password)替换为实际的值。此外,use_tls 和 tls_insecure_skip_verify 用于配置安全选项,具体值取决于你的邮件服务器配置。
;在实际使用中,出于安全考虑,不建议在配置文件中明文存储密码。可以使用环境变量或加密存储密码的方式来提高安全性。
相关推荐
巷北夜未央9 分钟前
Python每日一题(14)
开发语言·python·算法
浮尘笔记18 分钟前
go-zero使用elasticsearch踩坑记:时间存储和展示问题
大数据·elasticsearch·golang·go
雾月5537 分钟前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
Y.O.U..1 小时前
今日八股——C++
开发语言·c++·面试
weixin_307779131 小时前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
Xiaok10181 小时前
解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
开发语言·神经网络·php
绿草在线1 小时前
Mock.js虚拟接口
开发语言·javascript·ecmascript
go_bai1 小时前
Linux环境基础开发工具——(2)vim
linux·开发语言·经验分享·笔记·vim·学习方法
小郝 小郝1 小时前
【C语言】strstr查找字符串函数
c语言·开发语言
yinhezhanshen1 小时前
理解rust里面的copy和clone
开发语言·后端·rust