- 环境介绍
线上环境 : 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(); } } }
属性文件:
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=发送附件的绝对目录 (会将目录下的所有文件,除文件夹添加为附件发送)
- 将写好的程序,打包为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)
-
错误原因 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)
错误原因 : jdk的版本和class版本不一致,一般是jdk版本过低
- 解决办法 : 修改idea Language level :解决开发环境1.8 jdk高于线上1.7 jdk 的问题 ,IntelliJ IDEA 对此也进行了支持,新版本一般也会向下兼容旧版本的特性
- 由于服务器jdk版本低:所以截图如下:
- 第一次打jar(将代码,与引用的外部jar,打到一个jar里<<<外部jar是以 将外部jar中的代码以提取的方式,提取到最终的那个jar里>>>)
将自己写的代码单独打一个jar的原因: 避免更新,代码更后上传程序太大(如果将所有外部jar都打到一个jar文件里,占用空间也挺大的,浪费资源)
运行jar
将外部jar 放到lib 下, 将主函数所在的jar 放到lib同级目录, 属性文件放到 运行jar 的目录下(因为代码里我获取的目录为运行jar文件的目录)
成功执行
[root@ip-172-32-1-205 email]# java -jar SendMail.jar
/usr/local/email/mail.properties
邮件标题 就等你了邮件内容 狗不理的说法
Sent message successfully....
[root@ip-172-32-1-205 email]#