当前位置: 首页 > news >正文

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创业一年

几天前我和几位前大厂朋友约了个饭&#xff0c;朋友纷纷向我透露出一种纠结&#xff1a; “GPT-4o将催生一大波创业机会啊&#xff0c;想离职” “但是现在是资本寒冬啊” “好想像你一样勇敢啊” 说起来这两年的大厂打工人确实比较难&#xff0c;受经济大环境影响&#xff0…...

[JAVASE] 异常 与 SE阶段知识点补充

目录 一. 异常 1.1 什么是异常? 1.2 异常的本质 1.3 异常的分类 1.4 如何处理异常? 1.5 自定义异常 1.6 受查异常 与 非受查异常 与 Error(重要) 二. Object类 三. 内部类 2.1 什么是内部类? 2.2 内部类的分类 2.3 常用内部类的使用 四. 总结 一. 异常 1.1 什么是异…...

可视化数据科学平台在信贷领域应用系列一:数据探索

引言 信贷风险数据建模是金融机构在数据量日益庞杂的时代进行信贷业务风控的关键技术。它能够帮助机构更好地控制风险、减少违约损失&#xff0c;并提高业务效率。通过不断优化建模方法和利用建模工具&#xff0c;金融机构的风险控制能力得到了显著提升。 在本文中&#xff0c;…...

SpringBoot发送Gmail邮件

1. 登录Gmail Gmail网址 点击右上角“小齿轮”&#xff0c;然后点击"查看所有设置" 点击“转发和 POP/IMAP”&#xff0c;按图中设置&#xff0c;然后点击保存&#xff1a; 2. 启用两步验证(https://myaccount.google.com/security) 登录上述网址&#xff0c;找…...

【小海实习日记】金融-现货以及合约理解

在股票和金融市场中&#xff0c;“单项持仓”和“双向持仓”是两个常见的概念&#xff0c;主要用于描述投资者在市场中的头寸及其策略。 单项持仓&#xff08;单向持仓&#xff09; 单项持仓是指投资者在市场中只持有一种方向的头寸&#xff08;多头或空头&#xff09;&#…...

html 添加元素如何能提升速度

在 HTML 中&#xff0c;如果你需要频繁地添加大量元素&#xff0c;需要确保你的操作能够以最佳性能进行。以下是一些有助于提高添加元素速度的方法&#xff1a; 综上所述&#xff0c;通过使用文档片段、innerHTML、虚拟滚动以及避免频繁的重排和重绘&#xff0c;你可以提高在 H…...

人工智能大模型的进化之路:探索如何让它们变得更“聪明”

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;大模型凭借其强大的处理能力和广泛的应用前景&#xff0c;已经成为研究的热点。然而&#xff0c;尽管这些模型在多个领域展现出了惊人的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战…...

【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解

&#x1f448;️上一篇:桥接模式 | 下一篇:享元模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 目 录 外观模式&#xff08;Facade Pattern&#xff09;定义英文原文直译如何理解呢&#xff1f;字面理解代码实现中的理解生活案例&#xff1a;操作多功能料理机典型案例…...

2024拼多多 最新理论+实战干货,从入门到精通全链路多角度学习-7节课

基于最新规则理论结合实际的干货 课程内容&#xff1a; 01 2024年多多防比价新规则破局理论课与实操课.mp4 02 24年多多强付费第二节课基础内功.mp4 03 24年多多强付费第三节课直通车实操 .mp4 04 24年多多强付费第一节课市场定价格段,mp4 05 24年多多自然流第一节课市场…...

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂&#xff0c;还通过其强大的扩展库支持丰富的后期处理效果&#xff0c;为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…...

高校实验室危险化学品及重大危险源安全管理系统

高校实验室危险化学品及重大危险源安全管理的重要性&#xff1a; 保障师生安全&#xff1a;通过严格管理&#xff0c;可以有效地降低这些风险&#xff0c;确保师生在实验室内的安全。 确保实验教学质量&#xff1a;良好的危化品管理能够确保实验材料的准确性和可靠性&#xff0…...

【Godot4自学手册】第四十一节背包系统(一)UI设置

各位同学&#xff0c;好久没有更新笔记了&#xff0c;今天开始&#xff0c;我准备自学背包系统。今天先学习下UI界面设置。 一、新建场景和结点 1.新建Node2D场景&#xff0c;命名为Inventory&#xff0c;保存到Scenes目录下&#xff0c;inventory.tscn。 2.新建TextureRect子…...

JS继承的方式

目录 原型链继承构造函数继承组合继承寄生组合继承ES6 Class 继承原型链继承 原理: 通过将子类的原型(prototype)设置为父类的一个实例,使得子类实例能够沿着原型链访问到父类的属性和方法。 function Parent() {this.parentProperty...

拓展虚拟世界边界,云手机可以做到吗

虚拟世界&#xff0c;AI&#xff0c;VR等词汇是21世纪最为流行的词汇&#xff0c;在科技背后&#xff0c;这些词汇的影响变得越来越大&#xff0c;已经走进了人们的世界&#xff0c;比如之前APPLE发布的vision pro&#xff0c;使人们能够更加身临其境的体验到原生os系统&#x…...

网络的功能和实现方法简介

网络的功能&#xff1a; 计算机网络是研究怎么样在两个端用户之间提供访问通路的。所以网络的功能是为网络上的任意两个端用户之间提供访问通路。 计算机通信的特点&#xff1a; 间歇性和突发性。即时而线路中没有信息流过&#xff0c;时而突来的大量数据需要迅速传输。为此计…...

npm有哪些插件包??

1.Web开发相关 Web开发相关的npm插件包涵盖了各种工具、框架和库&#xff0c;帮助开发人员简化开发流程、提高效率并实现更好的用户体验。以下是一些常见的Web开发相关的npm插件包及其功能&#xff1a; 1. webpack&#xff1a;一个现代的JavaScript应用程序的静态模块打包工具…...

SpringBoot基础篇

1&#xff1a;parent 目的&#xff1a;减少依赖配置 开发SpringBoot程序要继承spring-boot-starter-parentspring-boot-starter-parent中定义了若干个依赖管理继承parent模块可以避免多个依赖使用相同技术出现依赖版本冲突继承parent的形式也可以采用引入依赖的i形式实现效果…...

【java11】java11新特性介绍

Java11于2018年9月25日正式发布&#xff0c;Java11是继Java8之后的第一个LTS&#xff08;Long-Term-Support&#xff09;长期支持功能版本&#xff0c;与之前的版本&#xff08;Java9和Java10&#xff09;不同&#xff0c;它提供了长达3年的维护期&#xff0c;旨在提供稳定且长…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...