zoukankan      html  css  js  c++  java
  • 【转载】SpringBoot-配置发送邮件遇到的一些问题

    前言:前一天调用163邮箱发送邮件还么有问题,今天再调用就各种发送不成功,害的我都关闭授权,还花了一毛钱短信费重新开启授权,最后百度到了一篇文章,非常贴切,在此转载下。

    本人遇到的错误代码是554,邮件主题和内容有敏感词汇(您的验证码是),或者被当作垃圾邮件,修改了一下主题和内容就OK了。

    使用springboot向163邮箱发送邮件遇到一些问题,主要归为如下几点:

    1.连接smtp.163.com异常,报错:java.net.UnknownHostException: smtp.163.com
    2.用户权限不足,报错:javax.mail.AuthenticationFailedException: 550 User has no permission
    3.认证错误,报错:javax.mail.AuthenticationFailedException: 535 Error: authentication failed
    4.发送内容错误,报错:com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM
    5.发送附件错误,报错:javax.mail.MessagingException: Empty multipart: multipart/related; 
    6.发送静态图片资源,查看邮件,图片显示不出来


    问题1:

    详细报错如下:

    org.springframework.mail.MailSendException: Mail server connection failed; nested exception is 
     
    com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com , 25; timeout 
    -1;
      nested exception is:
        java.net.UnknownHostException: smtp.163.com . Failed messages: 
    com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com , 25; timeout 
     
    -1;
      nested exception is:
        java.net.UnknownHostException: smtp.163.com ; message exception details (1) are:
    Failed message 1:
    com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com , 25; timeout 
     
    -1;
      nested exception is:
        java.net.UnknownHostException: smtp.163.com 
        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:366)
        at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport
     
    (JavaMailSenderImpl.java:501)
        at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:421)
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
        at mail.service.MailSendService.sendInlineMail(MailSendService.java:111)

    解决思路:
    1.进行telnet检查,查看telent smtp.163.com 25,发现可以正常telent成功,说明网络没问题
    2.查看配置是否正常,经查看,发现springboot的application.properties文件中spring.mail.host=smtp.163.com后面有空格,去掉空格即可

    问题2:

    详细报错如下:

    org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is

    javax.mail.AuthenticationFailedException: 550 User has no permission

      at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:424)
      at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
      at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
      at mail.service.MailSendService.sendInlineMail(MailSendService.java:111)
      at mail.test.TestMail.test(TestMail.java:43)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)


    解决思路:
    1.在cn.bing.com上搜索,发现有该问题的先例,问题原因是没有开启163邮箱的pop3/smtp协议
      参考文档:http://www.cnblogs.com/cosyer/p/6676023.html
    2.登录163邮箱->设置->POP3/SMTP/IMAP设置->开启协议,正确设置授权码

    问题3:

    详细报错如下:

    javax.mail.AuthenticationFailedException: 535 Error: authentication failed
     
        at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:424)
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
        at mail.service.MailSendService.sendInlineMail(MailSendService.java:111)
        at mail.test.TestMail.test(TestMail.java:43)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)


    解决思路:
    1.163邮箱开通smtp服务后,javaMail发送邮箱要使用授权码作为登录密码
    2.设置spring.mail.password=授权码

    问题4:

    详细报错如下:

    org.springframework.mail.MailSendException: Failed messages: 
     
    com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp11,D8CowACX7CmSHB5b3SrlCA--.26635S3 
     
    1528700051,please see http://mail.163.com/help/help_spam_16.htm?
     
    ip=182.138.102.204&hostid=smtp11&time=1528700051
        at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:474) 
     
    ~[spring-context-support-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:307) 
     
    ~[spring-context-support-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:296) 
     
    ~[spring-context-support-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at mail.service.MailSendService.sendSimpleMail(MailSendService.java:50) ~[classes/:na]
        at mail.test.TestMail.test(TestMail.java:36) [classes/:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_80]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_80]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_80]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.7.0_80]
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     
    [junit-4.12.jar:4.12]
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     
    [junit-4.12.jar:4.12]
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     
    [junit-4.12.jar:4.12]
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 


    解决思路:
    1.根据错误提示,查看如下url:
    http://mail.163.com/help/help_spam_16.htmip=182.138.102.204&hostid=smtp11&time=1528700051
     这是163邮箱提供的一个错误码对应表
    2.554 DT:SPM对应错误为:
     发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件
    3.修改邮件的主题及内容,使用合法信息,例如不要使用:test、测试这些信息

    问题5:

    详细报错如下:

    Caused by: javax.mail.MessagingException: Empty multipart: multipart/related; 
        boundary="----=_Part_2_1115361411.1528698722005"
        at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:548)
        at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
        ... 45 more

    ... 45 more
    解决思路:
    1.在cn.bing.com上搜索,问题原因是没有设置邮件内容,导致报该错误,其实和发送附件没有任何关系
    参考文章:https://stackoverflow.com/questions/32306928/sending-emails-with-attachments-empty-
    multipart

    问题6:
    无报错信息

    解决思路:

    1.检查代码,具体代码如下:

    public boolean sendInlineMail(String fromPos, String toPos, String subject, FileSystemResource file)
    {
        MimeMessage msg = mailSender.createMimeMessage();
        try
        {
            //MimeMessageHelper构造器,如果要发送附件邮件,必须指定multipart参数为true
            MimeMessageHelper helper  = new MimeMessageHelper(msg, true);
            helper.setFrom(fromPos);
            helper.setTo(toPos);
            helper.setSubject(subject);
            helper.setText("<html><body>静态资源:<img src='cid:pic' /></body></html>", true);
            helper.addInline("pic", file);
            mailSender.send(msg);
        } 
        catch (MessagingException e)
        {
            logger.error("发送附件邮件失败.", e);
            return false;
        }
        
        return true;
    }


    2.对代码进行了调整:将addInline方法要放在setText后面,进行测试发现正常了,可能原因是顺序如果不对,导致资源没有被正确引用。

    原文链接:遵循 CC 4.0 BY-SA 版权协议,https://blog.csdn.net/ignorewho/article/details/80654201

  • 相关阅读:
    用js添加网页标题时,在QQ里无效,标题栏空白
    用css3的@keyframes里设置transform:rotate(); 当控制动画暂停:animation-play-state:paused暂停,在微信和safari里无效
    Python可变序列中的一些坑,记得多注意
    你知道?Python 中的序列类型支持哪些公共操作吗?
    用 python print() 函数实现的三个特效
    教你使用python生成器重构提取数据方法,来优化你的爬虫代码
    python中主线程与子线程的结束顺序,你知道吗?
    python装饰器实现对异常代码出现进行自动监控
    Python教程:高效率遍历文件夹寻找重复文件
    python教程: filter()和reduce()函数用法详解
  • 原文地址:https://www.cnblogs.com/steveshao/p/11698749.html
Copyright © 2011-2022 走看看