Go 群发邮件Redis 实现邮件群发
一、安装
go get github.com/go-redis/redis/v8
go get gopkg.in/gomail.v2
二、使用"gopkg.in/gomail.v2"群发
package mainimport (gomail "gopkg.in/gomail.v2"
)func main() {// 邮件内容m := gomail.NewMessage()m.SetHeader("From", "demo@163.com")m.SetHeader("To", "demo@qq.com")m.SetHeader("Subject", "邮件标题")m.SetBody("text/html", "<h2>邮件内容</h2>")// 邮件服务器账号密码// func NewDialer(host string, port int, username, password string) *Dialerd := gomail.NewDialer("smtp.163.com",25,"demo@163.com","password",)// 发送邮件d.DialAndSend(m)
}
三、邮箱服务配置,以QQ邮箱为例


四、示例代码
package mainimport ("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) // 可以添加一些延迟以限制发送速率}
}
五、邮件配置
# 以QQ邮箱为例
[SMTP_SERVER]
smtp_server = smtp.qq.com
#587或465,具体取决于SMTP服务器配置
smtp_port = 587[AUTHENTICATION]
# 发送者邮箱
username = qwexxxx@qq.com
# 授权码,不是登录密码
password = aafrsdgsgsssfqw[EMAIL]
# 发送者邮箱
from = qwexxxx@qq.com
subject = Test Email(邮件主题)
body = 这是我的应用程序发送的测试电子邮件。[SECURITY]
use_tls = yes
tls_insecure_skip_verify = no;这个配置文件包含以下部分:
;SMTP_SERVER: 存储 SMTP 服务器的主机名和端口号。
;AUTHENTICATION: 存储用于邮件认证的用户名和密码。
;EMAIL: 存储发送邮件时使用的发件人地址、邮件主题和邮件正文。
;SECURITY: 存储安全设置,比如是否使用 TLS 加密以及是否跳过 TLS 证书验证。
;请注意,你需要将示例中的占位符(如 smtp.example.com、your_email@example.com 和 your_password)替换为实际的值。此外,use_tls 和 tls_insecure_skip_verify 用于配置安全选项,具体值取决于你的邮件服务器配置。
;在实际使用中,出于安全考虑,不建议在配置文件中明文存储密码。可以使用环境变量或加密存储密码的方式来提高安全性。
相关文章:
Go 群发邮件Redis 实现邮件群发
一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…...
夕小瑶:资本寒冬下的AI创业一年
几天前我和几位前大厂朋友约了个饭,朋友纷纷向我透露出一种纠结: “GPT-4o将催生一大波创业机会啊,想离职” “但是现在是资本寒冬啊” “好想像你一样勇敢啊” 说起来这两年的大厂打工人确实比较难,受经济大环境影响࿰…...
[JAVASE] 异常 与 SE阶段知识点补充
目录 一. 异常 1.1 什么是异常? 1.2 异常的本质 1.3 异常的分类 1.4 如何处理异常? 1.5 自定义异常 1.6 受查异常 与 非受查异常 与 Error(重要) 二. Object类 三. 内部类 2.1 什么是内部类? 2.2 内部类的分类 2.3 常用内部类的使用 四. 总结 一. 异常 1.1 什么是异…...
可视化数据科学平台在信贷领域应用系列一:数据探索
引言 信贷风险数据建模是金融机构在数据量日益庞杂的时代进行信贷业务风控的关键技术。它能够帮助机构更好地控制风险、减少违约损失,并提高业务效率。通过不断优化建模方法和利用建模工具,金融机构的风险控制能力得到了显著提升。 在本文中,…...
SpringBoot发送Gmail邮件
1. 登录Gmail Gmail网址 点击右上角“小齿轮”,然后点击"查看所有设置" 点击“转发和 POP/IMAP”,按图中设置,然后点击保存: 2. 启用两步验证(https://myaccount.google.com/security) 登录上述网址,找…...
【小海实习日记】金融-现货以及合约理解
在股票和金融市场中,“单项持仓”和“双向持仓”是两个常见的概念,主要用于描述投资者在市场中的头寸及其策略。 单项持仓(单向持仓) 单项持仓是指投资者在市场中只持有一种方向的头寸(多头或空头)&#…...
html 添加元素如何能提升速度
在 HTML 中,如果你需要频繁地添加大量元素,需要确保你的操作能够以最佳性能进行。以下是一些有助于提高添加元素速度的方法: 综上所述,通过使用文档片段、innerHTML、虚拟滚动以及避免频繁的重排和重绘,你可以提高在 H…...
人工智能大模型的进化之路:探索如何让它们变得更“聪明”
一、引言 在人工智能(AI)领域,大模型凭借其强大的处理能力和广泛的应用前景,已经成为研究的热点。然而,尽管这些模型在多个领域展现出了惊人的能力,但它们仍然面临着理解力、泛化能力和适应性等方面的挑战…...
【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解
👈️上一篇:桥接模式 | 下一篇:享元模式👉️ 设计模式-专栏👈️ 目 录 外观模式(Facade Pattern)定义英文原文直译如何理解呢?字面理解代码实现中的理解生活案例:操作多功能料理机典型案例…...
2024拼多多 最新理论+实战干货,从入门到精通全链路多角度学习-7节课
基于最新规则理论结合实际的干货 课程内容: 01 2024年多多防比价新规则破局理论课与实操课.mp4 02 24年多多强付费第二节课基础内功.mp4 03 24年多多强付费第三节课直通车实操 .mp4 04 24年多多强付费第一节课市场定价格段,mp4 05 24年多多自然流第一节课市场…...
在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南
效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂,还通过其强大的扩展库支持丰富的后期处理效果,为3D场景增添无限魅力。本篇文章将引导您深入了…...
Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)
一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…...
高校实验室危险化学品及重大危险源安全管理系统
高校实验室危险化学品及重大危险源安全管理的重要性: 保障师生安全:通过严格管理,可以有效地降低这些风险,确保师生在实验室内的安全。 确保实验教学质量:良好的危化品管理能够确保实验材料的准确性和可靠性࿰…...
【Godot4自学手册】第四十一节背包系统(一)UI设置
各位同学,好久没有更新笔记了,今天开始,我准备自学背包系统。今天先学习下UI界面设置。 一、新建场景和结点 1.新建Node2D场景,命名为Inventory,保存到Scenes目录下,inventory.tscn。 2.新建TextureRect子…...
JS继承的方式
目录 原型链继承构造函数继承组合继承寄生组合继承ES6 Class 继承原型链继承 原理: 通过将子类的原型(prototype)设置为父类的一个实例,使得子类实例能够沿着原型链访问到父类的属性和方法。 function Parent() {this.parentProperty...
拓展虚拟世界边界,云手机可以做到吗
虚拟世界,AI,VR等词汇是21世纪最为流行的词汇,在科技背后,这些词汇的影响变得越来越大,已经走进了人们的世界,比如之前APPLE发布的vision pro,使人们能够更加身临其境的体验到原生os系统&#x…...
网络的功能和实现方法简介
网络的功能: 计算机网络是研究怎么样在两个端用户之间提供访问通路的。所以网络的功能是为网络上的任意两个端用户之间提供访问通路。 计算机通信的特点: 间歇性和突发性。即时而线路中没有信息流过,时而突来的大量数据需要迅速传输。为此计…...
npm有哪些插件包??
1.Web开发相关 Web开发相关的npm插件包涵盖了各种工具、框架和库,帮助开发人员简化开发流程、提高效率并实现更好的用户体验。以下是一些常见的Web开发相关的npm插件包及其功能: 1. webpack:一个现代的JavaScript应用程序的静态模块打包工具…...
SpringBoot基础篇
1:parent 目的:减少依赖配置 开发SpringBoot程序要继承spring-boot-starter-parentspring-boot-starter-parent中定义了若干个依赖管理继承parent模块可以避免多个依赖使用相同技术出现依赖版本冲突继承parent的形式也可以采用引入依赖的i形式实现效果…...
【java11】java11新特性介绍
Java11于2018年9月25日正式发布,Java11是继Java8之后的第一个LTS(Long-Term-Support)长期支持功能版本,与之前的版本(Java9和Java10)不同,它提供了长达3年的维护期,旨在提供稳定且长…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
