Exceptionless 5.x 无法正常发送邮件的问题解决
你有碰到过通过docker部署Exceptionless无法发送邮件的问题吗?此解决办法适用于Exceptionless 5.x版本(如果你不想升级6.x的话)。
1、问题起因
去年这个时候,得知Exceptionless 5.0版本发布,我立即将一直部署在Windows Server上的线上Exceptionless迁移到了Linux上。但是,期间发现按照wiki配置好Email却一直无法发送邮件,但由于不影响使用,我也就没有深究(其实还是懒),发布了一篇快速的部署Exceptionless 5.0的博文在博客园上并发出了求助,结果各个园友的帮助回答都没有解决我的问题。
近两个月发现容器化的Exceptionless的账号没有经过验证,经常两三周账号数据就会丢失,于是就花了一点时间排查了一下。想着肯定有人跟我碰到了同样的问题,于是直接去github上搜了搜issue,果然有很多chinese friends都提了问题,但是大家的描述都不到位,终于找到了两个issue和我问题比较match,于是尝试了大家给的办法并且验证可行,所以也分享给大家。
2、问题描述与解决
无法发送验证邮件
我们应该都看过Exceptionless的wiki文档上介绍,通过docker-compose.yml中为api和job两个服务配置一下这个参数配置就可以发送邮件:
EX_ConnectionStrings__Email: smtps://itc-dev%40qq.com:your-password@smtp.qq.com:465
其中,smtps代表使用SSL安全协议,itc-dev%40qq.com是我的账号名,其中%40是转义字符,代表@号,即itc-dev@qq.com。
但是通过docker-compose up -d启动起来之后,你会发现所有服务都正常,但就是在“My Account”页面中点击发送验证邮件始终无法收到验证邮件。通过查看logs发现Mailkit报错,通过查询issues中了解到,如果不想改代码的话就需要额外再配置一个参数EX_SmtpFrom(给api和job项目都配置一下):
EX_ConnectionStrings__Email: smtps://itc-dev%40qq.com:your-password@smtp.qq.com:465EX_SmtpFrom: itc-dev@qq.com
这个EX_SmtpFrom是你需要通过SMTP协议登录的发送者邮箱,这里不再需要转移字符了,直接配置上即可。
重新启动,你会发现,你可以收到验证邮件了。
更多细节,请参考:https://github.com/exceptionless/Exceptionless/issues/545
点击验证邮件链接无法真正验证邮箱
前面收到了邮件链接,我想终于可以激活了我的账号邮箱了,结果没想到通过验证链接过去还是没有真正激活我的账号。于是,我又去issue里面找了一下,发现需要更改一下BASE_URL的配置(也是同样给api和job项目都配置一下):
EX_BaseURL: http://192.168.16.180:5100/#!
原配置:EX_BaseURL: http://192.168.16.180:5100,需要加上 /#! 符号,因为如果你没有使用url重写,需要给BaseURL加上这个符号。后续6.x版本应该已经解决了这个问题了,但是5.x版本应该还是存在。
更多细节,请参考:https://github.com/exceptionless/Exceptionless/issues/295
3、启用邮件之后
每日项目简报
Exceptionless的强大之后就在于它提供了这个功能,对于线上环境特别有用。
呼呼,我一般只选择通过我严重错误。
新的异常错误通知
对于线上环境,一些可以避免的异常及时通知,可以帮助我们尽早在下个版本发布前修正。
4、小结
最后,如果你也在用Exceptionless 5.x,希望可以帮到你。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring5新特性
- 进阶!MyBatis-Plus(基于 Springboot 演示)
- 运维人员常用的Linux命令总结
- Java反射机制的原理及在Android下的简单应用
- 温故而知新:MySQL存储引擎入门介绍
- 终于明白 Java 为什么要加 final 关键字了!
- 学习git这一篇就够了!!!
- 如何在nodejs中实现兄弟进程通信
- Python异常处理
- Python装饰器实现函数动态类型检查
- 如何自动填充SQL语句中的公共字段
- 面试官喜欢问的Java编译期与运行期问题总结全了
- 面试5年25K程序员回答不出来为什么Java的main方法必须是public static void?
- Python装饰器
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的“正确姿势”