最近在pinpoint2.2.1版本上配置了对监控服务的邮件告警功能,发现不是想象中的那么简单,尤其是我们使用的qq企业邮箱,一直报异常
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1
记录一下配置的过程,希望对遇到相同问题的人一些帮助。
1.首先需要知道pinpoint admin用户,最后自己顺着校验的方法源码找到了地方:
在web工程的pinpoint-web-root.properties文件里有一行,这里就是密码,默认的密码就是admin,大家记得部署的时候在自定义的配置文件里修改掉,如果不改的话就是admin,谁都可以上去添加和删除账号
2.因为告警是web的功能,所以只需要修改pinpoint的web配置就可以了,如下图标注有几点要注意的,尤其是在腾讯企业邮箱上。
标1的位置和2的位置,这两个地方必须一样,否则安全验证不通过,这个是邮箱防止你发送与发件人地址不同的回复地址。
标3的位置一会儿详细说,这里直接配置是不行的,还需要修改源码,这个也就是腾讯企业邮箱必须配置的地方,否则会报"Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1" 这样的错误
标4的位置这个是在发送出去的邮件里会有一个链接地址,可以跳到pinpoint页面上便于查看的,这里配置错误不影响使用,只是无法跳转
3.来谈谈socketFactory
配置邮箱过程中,按照网上的教程配置好以后无论怎么运行都是"Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1" 这一个错误,感觉再尝试下去也是徒劳,作为一个程序员必须从源码上下手(pinpoint的编译环境搭建其实也是挺折腾人的),有本地可以运行通过的mail示例和源码一定是可以找出解决方法的
首先发送邮件的实现类是:SpringSmtpMailSender,pinpoint里有2个同名的实现类:com.navercorp.pinpoint.web.alarm和com.navercorp.pinpoint.batch.alarm,根据输出的错误日志分析可以知道是来源于com.navercorp.pinpoint.web.alarm.SpringSmtpMailSender,这个类已经标明@Deprecated,应该是后期会把功能迁移到batch上(从后面的配置上就可以看出)。
从下图可以看出实即执行发送使用的是org.springframework.mail.javamail.JavaMailSenderImpl,所有发送参数都在这里面。
这里面的参数是如何设置的呢?当然是通过参数注入。在applicationContext-batch-sender.xml这个文件里,这个文件在batch和web工程下都有同名的,当前版本2.2.1使用的是web工程下的
修改配置文件,增加一行即可
有了注入的定义,还需要配置变量的配置文件,文件也一样在batch和web工程下存在两处同名文件,只需要修改web下的batch-root.properties,看名字以及发送提醒的功能需要在配置文件里打开batch,我觉得以后这些都会迁移到batch里
这样在服务启动的时候就会在参数里添加上alarm.mail.smtp.socketFactory.class这个属性,编译成新的jar包,再看日志,成功发送了。