项目中使用邮件功能引发的问题


1.场景一
MQ线程在处理业务时,业务出现异常,需要发送Mail. 但连接25端口超时, 造成MQ消息堆积.

以下脚本(mail.sh)复现发送邮件超时的现象.
          
[root@infuq mail]# time bash mail.sh
DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
Exception in thread "main" com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.qq.com, 25; timeout -1;
  nested exception is:
        java.net.ConnectException: Connection timed out (Connection timed out)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2209)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740)
        at javax.mail.Service.connect(Service.java:366)
        at javax.mail.Service.connect(Service.java:246)
        at javax.mail.Service.connect(Service.java:267)
        at javax.mail.Transport.send0(Transport.java:252)
        at javax.mail.Transport.send(Transport.java:174)
        at MailTest.main(MailTest.java:35)
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at java.net.Socket.connect(Socket.java:538)
        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:359)
        at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175)
        ... 7 more

real    2m8.609s
user    0m1.312s
sys     0m0.126s
          
        
发送邮件,连接25端口超时

脚本地址: https://t.infuq.com/download/mail.tar.gz

2.场景二
MQ线程在处理业务时,需要将数据通过钉钉和邮件发送给客户, 先通过钉钉已发送成功, 但发送Mail时, 由于账号问题, 导致AuthenticationFailedException异常. MQ消息需要重试, 造成钉钉消息重复发送的问题.




          
spring:
  mail:
    host: smtp.qq.com
    port:
    username: xyz@qq.com
    password: password123
    protocol: smtp
    default-encoding: UTF-8
    test-connection: false
    properties:
      mail.smtp.auth: true
      mail.smtp.starttls.enable: true
      mail.smtp.starttls.required: true
      mail.smtp.socketFactory.port: 465
      mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
      mail.smtp.socketFactory.fallback: false