java发送邮件,遇到的奇葩问题

Posted 20id

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java发送邮件,遇到的奇葩问题相关的知识,希望对你有一定的参考价值。

  • 环境介绍

          线上环境  :    java version "1.7.0_79"

         开发环境  :    java version "1.8.0_144"

         开发工具  :    IDEA

  • 编写代码

        程序需要的外部jar:   activation.jar   |||||     mail.jar

        java代码:

技术分享图片
package com.dsp;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

/**
 *@author wangyuxiang
 *@Description
 *@Date 2018/2/2 上午11:37
 **/
public class SendMail {

    public static void main(String[] args) {

        try {
            String path = System.getProperty("user.dir") + "/mail.properties";
            System.out.println(path+"");
            Properties properties = System.getProperties();
            InputStream in = new BufferedInputStream(new FileInputStream(path));

            properties.load(in);

            final String Sender = new String(properties.getProperty("Sender").getBytes("ISO8859-1"), "UTF-8");
            String host = properties.getProperty("host");
            String Recipients = new String(properties.getProperty("Recipients").getBytes("ISO8859-1"), "UTF-8");
            final String SenderPassword = new String(properties.getProperty("SenderPassword").getBytes("ISO8859-1"), "UTF-8");
            String title = new String(properties.getProperty("title").getBytes("ISO8859-1"), "UTF-8");
            String text = new String(properties.getProperty("text").getBytes("ISO8859-1"), "UTF-8");
            String fileDir = new String(properties.getProperty("fileDir").getBytes("ISO8859-1"), "UTF-8");


            // 设置邮件服务器
            properties.setProperty("mail.smtp.host", host);
            properties.put("mail.smtp.auth", "true");

            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(Sender, SenderPassword);
                }
            };

            // 获取默认的 Session 对象。
            Session session = Session.getDefaultInstance(properties, authenticator);

            MimeMessage message = new MimeMessage(session);
            System.out.println(title + text);
            message.setFrom(new InternetAddress(Sender));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(Recipients));
            message.setSubject(title, "UTF-8");

            Multipart multipart = new MimeMultipart();

            /*设置文本消息部分*/
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setContent(text, "text/html;charset=UTF-8");
            messageBodyPart.setText(text);
            multipart.addBodyPart(messageBodyPart);

            /*附件部分*/
            File file = new File(fileDir);
            File[] fileList = file.listFiles();
            for (File fl:fileList){
                if (fl.isFile()){
                    // 附件
                    messageBodyPart = new MimeBodyPart();
                    DataSource source = new FileDataSource(fl);
                    messageBodyPart.setDataHandler(new DataHandler(source));
                    messageBodyPart.setFileName(MimeUtility.encodeWord(fl.getName()));
                    multipart.addBodyPart(messageBodyPart);
                }
            }

            // 发送完整消息
            message.setContent(multipart);
            // 发送消息
            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (Exception mex) {
            mex.printStackTrace();
        }
    }
}
SendMail.java

 

        属性文件:

技术分享图片
 1 #发件人电子邮箱&密码
 2 Sender=***@126.com
 3 SenderPassword=******
 4 #发送邮件的主机
 5 host=smtp.126.com
 6 
 7 #收件人电子邮箱
 8 Recipients=***@qq.com
 9 
10 title=邮件标题
11 text=邮件内容
12 fileDir=发送附件的绝对目录 (会将目录下的所有文件,除文件夹添加为附件发送)
mail.properties

 

  • 将写好的程序,打包为jar文件
    • 第一次打jar(将代码,与引用的外部jar,打到一个jar里<<<外部jar是以  将外部jar中的代码以提取的方式,提取到最终的那个jar里>>>)
      • 截图   技术分享图片
      • 本地运行通过
      • 服务器运行报错
        技术分享图片
        Exception in thread "main" java.lang.SecurityException: no manifiest section for signature file entry javax/activation/MimeType.class
        
         at sun.security.util.SignatureFileVerifier.verifySection(SignatureFileVerifier.java:446)
        
         at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:297)
        
         at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:240)
        
         at java.util.jar.JarVerifier.processEntry(JarVerifier.java:317)
        
         at java.util.jar.JarVerifier.update(JarVerifier.java:228)
        
         at java.util.jar.JarFile.initializeVerifier(JarFile.java:348)
        
         at java.util.jar.JarFile.getInputStream(JarFile.java:415)
        
         at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:775)
        
         at sun.misc.Resource.cachedInputStream(Resource.java:77)
        
         at sun.misc.Resource.getByteBuffer(Resource.java:160)
        
         at java.net.URLClassLoader.defineClass(URLClassLoader.java:436)
        
         at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        
         at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        
         at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        
         at java.security.AccessController.doPrivileged(Native Method)
        
         at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        
         at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        
         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        
         at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        
         at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
        ERR
      • 错误原因  mail.jar有SUN公司的签名,你逆工以后没有你的签名,安全管理器禁止你使用

    • 第二次打jar包
      • 将自己编写的代码与外部jar包分离      在MANIFEST.MF 文件中指定  外部jar的相对路径
      • 本地运行通过,服务报错 
      • 技术分享图片
        Exception in thread "main" java.lang.UnsupportedClassVersionError: com/dsp/SendMail : Unsupported major.minor version 52.0
        
         at java.lang.ClassLoader.defineClass1(Native Method)
        
         at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        
         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        
         at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        
         at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        
         at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        
         at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        
         at java.security.AccessController.doPrivileged(Native Method)
        
         at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        
         at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        
         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        
         at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        
         at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
        ERR

        错误原因 : jdk的版本和class版本不一致,一般是jdk版本过低

      • 解决办法 : 修改idea   Language level :解决开发环境1.8 jdk高于线上1.7 jdk 的问题 ,IntelliJ IDEA 对此也进行了支持,新版本一般也会向下兼容旧版本的特性
      • 由于服务器jdk版本低:所以截图如下:

                           技术分享图片

 

将自己写的代码单独打一个jar的原因:  避免更新,代码更后上传程序太大(如果将所有外部jar都打到一个jar文件里,占用空间也挺大的,浪费资源)

运行jar

     将外部jar 放到lib 下, 将主函数所在的jar 放到lib同级目录,     属性文件放到   运行jar 的目录下(因为代码里我获取的目录为运行jar文件的目录)

 

成功执行

[[email protected] email]# java -jar SendMail.jar 

/usr/local/email/mail.properties

邮件标题 就等你了邮件内容 狗不理的说法

Sent message successfully....

[[email protected] email]# 

技术分享图片

 

 

 

 

 

以上是关于java发送邮件,遇到的奇葩问题的主要内容,如果未能解决你的问题,请参考以下文章

java不要登录发送邮件noReply

Javascript - 使用 HTML 片段通过电子邮件发送 JSON 输出

java发送邮件时遇到的坑

Java 遇到的奇葩问题

超实用的php代码片段

java email 在阿里云服务器发送邮件失败的解决方法