美文网首页
解决在阿里云服务器上面使用25端口无法发送腾讯企业邮箱邮件

解决在阿里云服务器上面使用25端口无法发送腾讯企业邮箱邮件

作者: dbc94a66f502 | 来源:发表于2019-08-01 10:36 被阅读0次
    [09:37:22] (SystemUserSelfService.java:469) - com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.exmail.qq.com, 25; timeout -1    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2118)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:712)
        at javax.mail.Service.connect(Service.java:388)
        at javax.mail.Service.connect(Service.java:246)
        at javax.mail.Service.connect(Service.java:195)
        at javax.mail.Transport.send0(Transport.java:254)
        at javax.mail.Transport.send(Transport.java:124)
        at cn.edu.scnu.ncsdc.sso.cloud.api.service.MailApi.send(MailApi.java:110)
        at cn.edu.scnu.ncsdc.sso.cloud.bussiness.service.SystemUserSelfService.sendMessage2Email(SystemUserSelfService.java:465)
        at cn.edu.scnu.ncsdc.sso.cloud.bussiness.service.SystemUserManageService.sendRegCode(SystemUserManageService.java:173)
        at cn.edu.scnu.ncsdc.sso.cloud.controller.manage.ManageSelfCtrl.sendUserRegCode(ManageSelfCtrl.java:639)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at cn.edu.scnu.ncsdc.sso.cloud.controller.filter.UserFilter.doFilter(UserFilter.java:64)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
        at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:677)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
    

    原因:

    阿里云封禁25号端口

    出于安全考虑,阿里云默认封禁TCP 25端口出方向的访问流量,即你无法在阿里云上的云服务器通过TCP 25端口连接外部地址。

    TCP 25端口的出方向封禁可能影响您通过TCP 25 端口连接第三方邮件服务商的SMTP服务器对外部发送邮件。

    如果您需要使用阿里云上的云服务器对外部发送邮件,建议您使用阿里云邮产品或者使用第三方邮件服务商提供的465端口。

    如果存在特殊场景,您必须在云服务器上使用TCP 25端口进行对外连接,请在安全管控平台中提交25端口解封申请。

    阿里云:投诉,无故封禁25端口 (2016-12-06)

    阿里云:TCP 25端口解封申请 (2018-06-27)

    解决方法

    SMTP服务器:ssl://smtp.exmail.qq.com

    
    import javax.mail.*;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMessage.RecipientType;
    import java.security.Security;
    import java.util.List;
    import java.util.Properties;
    
    
    public class MailApi extends Authenticator {
        // 发送邮件的props文件
        private Properties props = System.getProperties();
        // 发件人邮箱账号
        private String username;
        // 发件人邮箱密码
        private String password;
        // 邮箱session
        private Session session;
        // 发送网关
        private String smtp;
        //超时时间(单位:毫秒)
        private Long timeout = 20000L;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getSmtp() {
            return smtp;
        }
    
        public void setSmtp(String smtp) {
            this.smtp = smtp;
        }
    
        public Long getTimeout() {
            return timeout;
        }
    
        public void setTimeout(Long timeout) {
            this.timeout = timeout;
        }
    
        private boolean createSession() {
            if (session == null) {
                if (this.username != null && this.password != null && this.smtp != null) {
                    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
                    final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
                    props.put("mail.smtp.auth", "true");
                    props.put("mail.smtp.host", smtp);
                    props.put("mail.smtp.connectiontimeout", timeout);
                    props.put("mail.smtp.timeout", timeout);
                    props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
                    props.put("mail.smtp.socketFactory.fallback", "false");
                    props.put("mail.smtp.port", "465");
                    props.put("mail.smtp.socketFactory.port", "465");
    
                    session = Session.getInstance(props, this);
                }
            }
            if (session != null) {
                return true;
            } else {
                return false;
            }
        }
    
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    
        /**
         * 发送邮件
         *
         * @param recipient 收件人邮箱地址
         * @param subject   邮件主题
         * @param content   邮件内容
         * @throws AddressException
         * @throws MessagingException
         */
        public void send(String recipient, String subject, Object content)
                throws AddressException, MessagingException {
            if (createSession()) {
                // 创建mime类型邮件
                final MimeMessage message = new MimeMessage(session);
                // 设置发信人
                message.setFrom(new InternetAddress(this.username));
                // 设置收件人
                message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
                // 设置主题
                message.setSubject(subject);
                // 设置邮件内容
                message.setContent(content.toString(), "text/html;charset=utf-8");
                // 发送
                Transport.send(message);
            }
        }
    
        /**
         * 群发邮件
         *
         * @param recipients 收件人列表
         * @param subject    主题
         * @param content    内容
         * @throws AddressException
         * @throws MessagingException
         */
        public void send(List<String> recipients, String subject, Object content)
                throws AddressException, MessagingException {
            if (createSession()) {
                // 创建mime类型邮件
                final MimeMessage message = new MimeMessage(session);
                // 设置发信人
                message.setFrom(new InternetAddress(this.username));
                // 设置收件人们
                final int num = recipients.size();
                InternetAddress[] addresses = new InternetAddress[num];
                for (int i = 0; i < num; i++) {
                    addresses[i] = new InternetAddress(recipients.get(i));
                }
                message.setRecipients(RecipientType.TO, addresses);
                // 设置主题
                message.setSubject(subject);
                // 设置邮件内容
                message.setContent(content.toString(), "text/html;charset=utf-8");
                // 发送
                Transport.send(message);
            }
        }
    }
    
    
    <bean id="mailApi" class="xxx.MailApi">
            <!-- 发件邮箱地址  -->
            <property name="username" value="xxx"/>
            <!-- 发件邮箱密码  -->
            <property name="password" value="xxx"/>
            <!-- 发件服务器地址  -->
            <property name="smtp" value="smtp.exmail.qq.com"/>
            <!-- 超时时间(单位:毫秒) -->
            <property name="timeout" value="10000"/>
        </bean>
    

    相关文章

      网友评论

          本文标题:解决在阿里云服务器上面使用25端口无法发送腾讯企业邮箱邮件

          本文链接:https://www.haomeiwen.com/subject/tsnfdctx.html