邮件通知,引发的线上的S级故障

Springboot中使用mail邮件 对于复杂消息,我们可以编辑html消息模板,以及实现动态解析的功能。另外还能够携带多附件。对于以上的内容,我们需要来把它整合成一个工具来使用。这里使用的是QQ邮箱,进入设置-账户,开启下服务。开启后获取授权码,保存自己客户端授权码。以上配置好了,我们可以写一些demo。 阅读详情

平台奖励创作,可能会升级VIP文章,可以移步我的公众号:【编程朝花夕拾】,且可获取首发内容。

01 引言

好的架构设计,报警通知必不可少。但是报警用不好,也会造成线上的S级故障。故障的等级各公司的定义标准不一样,总之S级故障在我们公司就是最高级别的故障,需要放下手头所有的事情,全力解决问题。这类故障类似的阿里的P0级故障。

本文将以邮件报警通知为例,因为邮件通知不花钱,哈哈哈…

02 SpringBoot集成邮件

之前领导特别注重报警机制,领导的意思就是,我们一定要早于业务或者用户收到异常的报警,然后紧急处理,让业务或用户无感使用。于是我在业务项目中,引入了短信报警,但由于短信花钱,后来又改成了邮件报警了。

2.1 邮件的Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2.2 邮件的配置

这里的配置以网易邮箱为例。官网的端口如图:

spring.mail.host=smtp.163.com
spring.mail.username=your-email@163.com
# 这里不是密码,配置的授权码
spring.mail.password=your-password
# ssl配置
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.auth = true
spring.mail.properties.mail.smtp.starttls.enable = true
spring.mail.properties.mail.smtp.starttls.required = true

以网易邮箱为例,授权码获取方式:

2.3 项目实战

@Autowired
private JavaMailSender javaMailSender;

@Test
void mailTest() {
    SimpleMailMessage msg = new SimpleMailMessage();
    // 发送人
    msg.setFrom("send@163.com");
    // 接收人
    msg.setTo("target@qq.com");
    // 邮件主题
    msg.setSubject("【异常报警】");
    // 邮件内容
    msg.setText("测试:系统异常了,赶快去处理吧");
    javaMailSender.send(msg);
}

测试结果:

03 故障发生

3.1 起因

故障的发生往往是不经意间,因为要监控系统是否正常,所以特意引入了健康检查。它会自动检查是部分服务是否异常,如果有异常就会报警。依赖如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

健康检查内置了自动检查的服务。其中一项有包括了我们今天讲的邮件服务,然后故障发生前,我们对健康检查的对象并没有清楚的了解,只知道要监控异常。自然监控的越多越好。

这也为后续故障埋下了定时炸弹。

3.2 故障产生

因为线上真正使用的是CoreMail服务商的邮箱,一直都没有问题。突然有一天CoreMail服务商的服务器宕机了,他们也没有通知我们。

首先我们运维团队收到CPU飙升的报警,经过日志查询发现,系统在不停地连接邮箱服务器。联系了CoreMail服务商之后,确认是他们服务宕机了。在等待CoreMail恢复的过程中,我们的服务器因为不停地重试,导致我们自己的服务也宕机了。这个生产事故妥妥的S级故障。

在复盘的时候发现,就是因为健康检查发现邮箱服务异常,触发重试机制导致的。

3.3 问题解决

问题解决也很简单,关闭邮件的健康检查即可。官网文档也给出了说明。

# 关闭邮箱的健康检查
management.health.mail.enabled=false

当然也可以通过更换集成Mail的方式来解决。上面的方式是Springboot配置的方式,我们可以采用工具类的方式,框架也就检查不到了。

@Test
void testMail() {
    JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setProtocol("smtp");  // 协议
    javaMailSender.setHost("smtp.163.com"); // SMTP服务器地址
    javaMailSender.setPort(465); // SMTP服务器端口
    javaMailSender.setUsername("**@163.com"); // 发件人邮箱地址
    javaMailSender.setPassword("*****"); // 发件人邮箱密码
    javaMailSender.setDefaultEncoding("UTF-8"); // 设置默认字符编码

    Properties props = new Properties();
    // 开启SSL加密配置
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.starttls.required", "true");


    javaMailSender.setJavaMailProperties(props);

    SimpleMailMessage msg = new SimpleMailMessage();
    msg.setFrom("**@163.com");
    msg.setTo("**@autostreets.com");
    msg.setSubject("【异常报警】");
    msg.setText("测试:系统异常了,赶快去处理吧");
    javaMailSender.send(msg);
}

04 小结

在职场中,我们经常会踩这样那样的坑。踩坑我们不要怕,积累起来就是自己的经验。正因为踩的坑比较多,当别人遇到问题咨询时,你会发现,基本都是自己踩过的坑,自然而然就变成了大家眼里的有经验的人了。

重要的是,踩过的坑要积累填坑的经验,光踩坑了,不填坑,那么为了避坑,路只会越走越窄,各行各业亦是如此。

使用 Spring 配置邮件服务器 在现代的企业应用开发中,邮件发送是一个常见的需求。Spring 提供了强大的邮件支持,使得配置和发送邮件变得非常简单。本文将介绍如何在 Spring 应用中配置邮件服务器并发送电子邮件。 阅读详情

相关推荐

不止于看板:用Prometheus+Grafana为Nginx配置邮件告警,故障第一时间知道

本文详细介绍了如何利用Prometheus+Grafana为Nginx配置邮件告警系统,实现故障第一时间通知。通过Nginx-exporter采集关键指标,结合Alertmanager的智能告警路由和SMTP邮件服务,构建高效、精准的告警体系,显著提升运维响应速度。

weixin_30918633的博客 440

定时任务发送邮件

定时任务发送邮件(其他) centos 在最初着手做的时候确实让自己摸不着头脑,最终发现也就是那么几步而已,一直是自己在走坑,就把该做的流程写下来。 涉及知识:crontab,sh,vim操作 方式:使用163邮箱作为外部邮箱服务器,而并非自身搭建服务器,省去配置上的麻烦和进存的消耗。 SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,

weixin_45454398的博客 1156

Linux命令行邮件:从系统级通信机制到生产级配置实战

Linux命令行邮件并非简单的工具调用,而是深度耦合内核网络栈、MTA服务、DNS解析与安全策略的系统级通信机制。其底层依赖SMTP协议交互、TLS加密握手、SPF/DKIM身份验证及邮件队列调度等核心原理,技术价值在于为运维自动化、监控告警与CI/CD通知提供轻量、可靠、可审计的通信通道。典型应用场景包括服务器健康检查、备份状态推送、容器化服务通知及云原生API集成。本文聚焦postfix配置、msmtp客户端、swaks调试与SendGrid API四大技术路线,深入剖析DNS解析失败、发件域伪造、TL

weixin_33749131的博客 374

SpringBoot项目发送邮件&邮箱配置

配置,这里展示的是网易邮箱,任何邮箱都是需要配置此处,可以自行查找配置。使用邮箱发送需要自行手动开通邮箱的。

学习/总结 1825

Ubuntu 20.04 Postfix生产级配置与故障排查指南

Postfix是Linux系统中关键的邮件传输代理(MTA),负责系统后台服务(如cron、fail2ban、APT)的静默邮件投递。其核心原理在于分层解耦设计:运行时环境校验、网络协议绑定、认证路由策略及队列管理,每一层均面向安全与可靠性强化。在Ubuntu 20.04这一广泛使用的LTS版本中,systemd-resolved DNS解析机制变更、AppArmor默认策略收紧、以及Postfix 3.4对TLS和SASL的严格校验,共同构成典型兼容性断层。掌握Postfix配置不仅关乎邮件发送成功,更直

weixin_30945039的博客 341

Ubuntu 18.04 Postfix 部署实战:本地邮件通知系统搭建与排障

邮件传输代理(MTA)是Linux系统告警、日志归档和自动化通知的核心基础设施;Postfix凭借轻量、安全、可审计等特性,成为Ubuntu环境下首选MTA。其工作原理涉及DNS解析、TLS加密协商、本地用户路由及队列状态机管理;技术价值在于不依赖云服务即可实现高可靠内部通知,规避第三方限频风险。典型应用场景包括cron任务失败告警、fail2ban封禁通知、CI/CD构建结果推送等。本文聚焦Ubuntu 18.04这一广泛使用的长期维护版本,深入解析debconf预设、systemd-resolved兼容

weixin_34055787的博客 498

Java发送邮件 SpringBoot

可以设置发送邮件debug模式这样在发送时可以在控制台中输出相关信息。

Bunny的博客 2385

从零构建生产级垃圾邮件分类器:文本预处理到可解释部署

垃圾邮件分类是典型的文本二分类任务,其核心在于将非结构化邮件内容转化为机器可理解的特征向量,并建立高精度、低延迟、可追溯的判别模型。原理上依赖文本预处理(RFC2822解析、编码识别、HTML清洗)、统计型特征工程(TF-IDF加n-gram与领域停用词优化)及轻量级概率模型(朴素贝叶斯)的协同;技术价值体现在数据主权可控、决策路径透明、CPU实时推理与增量更新能力;广泛应用于企业邮件网关、SaaS安全中台、合规审计系统等场景。本文以真实运行三年、日均处理23万封邮件的端到端项目为蓝本,深入拆解文本预处理陷

weixin_34087307的博客 408

SpringBoot邮件报警系统故障复盘:从健康检查到服务雪崩的警示

理解工具原理:在使用任何框架或组件前,必须深入理解其工作原理和潜在影响防御性编程:对第三方服务依赖要保持警惕,设计合理的超时和重试策略监控的智慧:监控并非越多越好,需要权衡覆盖范围与系统稳定性容量规划:充分考虑异常场景下的资源消耗,做好容量预留。

2501_93078354的博客 808

Ubuntu下Postfix配置实战:从本地通知到邮件中继

Postfix是Linux系统中最主流的邮件传输代理(MTA),其核心价值在于高可靠、低开销的邮件接力传递,而非简单发信工具。它通过队列管理、TLS加密、DNS验证与反垃圾策略,在复杂网络中保障投递稳定性。技术原理上,Postfix依赖`main.cf`关键参数(如`inet_interfaces`、`relayhost`、`mynetworks`)实现网络边界控制与路由决策,配合SASL认证和Maildir存储提升安全性与并发能力。典型应用场景包括服务器监控告警、Web应用通知、CI/CD构建反馈等轻量级

weixin_34413103的博客 392

Ubuntu 18.04 下 Postfix 邮件服务器生产级部署与加固指南

SMTP 服务器是企业内部通信与系统告警的核心基础设施,其核心价值在于确定性、可审计性与协议兼容性。Postfix 作为最成熟的开源 SMTP 实现,凭借简单安全的设计哲学和精细的配置控制能力,成为 Zabbix、Prometheus、Jenkins 等运维工具直连发信的首选。在 Ubuntu 18.04 这一长期稳定平台下,Postfix 不仅规避了新版 TLS 栈的兼容风险,更通过 loopback-only 监听、STARTTLS 时序校验、SASL 认证集成等机制,满足内部系统告警、遗留 ERP 对

weixin_34380948的博客 379

Dify平台如何设置异常告警通知?邮件/Webhook推送配置

通过邮件和Webhook实现Dify平台的实时异常监控,支持SMTP邮件通知与飞书、钉钉等Webhook集成,提升AI应用的可观测性与故障响应效率。结合重试机制、HMAC签名与分级告警策略,构建稳定可靠的生产级告警体系。

weixin_29069575的博客 890

昇腾集群秒级故障检测:基于MindCluster与Configmap的K8s原生方案

在AI基础设施中,硬件可观测性是保障大规模分布式训练稳定性的基石。昇腾NPU缺乏GPU级的标准健康监控生态,传统轮询式故障检测存在30秒以上延迟,导致NCCL超时、任务反复失败。本文聚焦‘秒级故障检测’这一核心能力,解析其底层原理——利用MindCluster对NPU设备层的深度探针能力,结合K8s Configmap的高并发更新、inotify实时通知与轻量存储特性,构建低延迟、高可靠、强解耦的状态分发机制。该方案不依赖Event或Custom Metrics等易受性能瓶颈制约的扩展对象,而是回归K8s原

weixin_30239339的博客 481

为什么你的通知总延迟?Python智能体邮件集成瓶颈全解析

解决通知延迟难题,深入剖析Python智能体邮件通知集成的常见瓶颈。涵盖高并发场景下的异步处理、SMTP连接优化与错误重试机制,提升系统响应速度与稳定性。适用于自动化运维、告警系统等场景,显著增强消息实时性,值得收藏。

StepLens的博客 743

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具链中的sgdc约束文件解决跨时钟域(CDC)报错问题。从基础约束文件架构到复杂场景调试,涵盖了时钟域定义、复位信号约束、Waiver策略等关键技巧,并附有常见错误排查方法,帮助工程师高效处理CDC验证挑战。

loss4bartender的博客 1149

(学习笔记)机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

一、Rviz的安装 Rviz是一个

qq_59475883的博客 5057

Prometheus告警通知配置、Alertmanager高可用-Day03

主要讲如何实现告警通知

qq_42515722的博客 2813

Qt之QSqlTableModel:高效数据库操作与视图绑定的实战指南

本文深入探讨了Qt框架中的QSqlTableModel组件,它作为连接数据库与Qt视图的智能中介,能极大简化数据库的增删改查操作。通过实战代码演示,详细讲解了如何快速构建可编辑的数据表格、理解并设置关键的数据编辑策略(如OnManualSubmit),以及实现数据过滤、排序等高级功能。文章还提供了性能优化、事务处理及常见避坑指南,帮助开发者高效、稳健地开发数据库驱动的桌面应用。

y4z5a6b7的博客 440

prometheus监控之alertmanager安装配置(2)及接入电话告警、微信、短信、邮件等告警

电话报警使用OPSALERT点击了解更多(支持电话报警、短信报警、邮件告警、微信报警)直接使用webhook配置即可,比较简单。 介绍 Prometheus 将数据采集和报警分成两个模块。报警规则配置在Prometheus Servers上,然后发送报警信息到AlertManger,Alertmanager 对收到的告警信息进行处理,包括去重,降噪,分组,沉默,抑制,策略路由,告警通知。 流程 Alertmanager 接收到告警,根据labels判断属于哪些Route(可存在多个Route,...

akzp123的博客 1万+

manimgl安装

安装manimgl

happytree001的博客 710

头歌操作系统2023春季课堂练习2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少?本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?2.此时 bochs 虚拟机输出的 0/1 字符串是什么?(只填写数字,不填写空格!根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。

weixin_64821608的博客 8136

ESX修复Linux虚拟机重启只读模式

当我们在服务器中检测到错误的时候,因此都会将inux服务器上的文件系统配置成重启后的只读模式,那么你知道如何配置吗? 下面我们就去看看ESX修复Linux虚拟机重启只读模式的方法。   在检测到错误时,将Linux服务器上的文件系统配置成重启后的只读模式是常见做法。 不过,这种设置在结合使用VMware VI3时可能有意想不到的结果。   在发生错误时,Linux文件系统能配置成三种不同的模式: ...

qq2453939845的博客 820

Pytorch CIFAR10图像分类 EfficientNet v1篇

EfficientNet源自Google Brain的论文EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. 从标题也可以看出,这篇论文最主要的创新点是. 论文提出了,混合缩放,把网络缩放的三种方式:深度、宽度、分辨率,组合起来按照一定规则缩放,从而提高网络的效果。EfficientNet在网络变大时效果提升明显,把精度上限进一步提升,成为了当前最强网络。

风信子的猫Redamancy的快乐星球 1852

AT&T iPhone手机激活系统超负荷引发故障

iPhone 4S的出货量远超iPhone 4,这导致苹果和运营商的服务器接连出现问题,继苹果iCloud频频出错及软银出现销售系统的拒绝服务后,最大的iPhone运营商AT&T也出现了同样的问题,他们的iPhone激活服务器由于人数过多也出现拒绝服务的情况。公司被迫向用户发送邮

520

I2C 协议在 Camera Sensor 驱动中的典型配置方式与实战应用

在 Linux Camera 系统中,Sensor 与主控之间的控制信令几乎都依赖于 I2C 总线完成。I2C 协议不仅承载了 Sensor 初始化、模式切换、AE/AF 等关键功能的指令传输,也是构建 v4l2\_subdev 驱动框架的核心基础。本文将围绕 Sensor 驱动中的 I2C 通信机制展开分析,从设备树节点声明到驱动代码中的传输接口调用,结合主流平台工程实战经验,详解如何构建稳定、高效、可维护的 I2C 控制路径。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1716

YOLOv11改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)

本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv11n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨,其非常适合轻量化的读者来使用,同时精度也有一定程度的上涨)。本文通过介绍其主要框架原理,然后教你如何添加该网络结构到网络模型中。

Snu77的博客 3389
上一篇: 1分钟,带你了解一个项目的开发周期
下一篇: 京东外卖,探索「距离最近」排序背后的秘密
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值