java_邮件
Posted 幻影黑子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java_邮件相关的知识,希望对你有一定的参考价值。
导包:activation.jar、mail.jar
1、测试代码:(这里使用的是QQ邮箱主机)
package com.canzhen.demo.simple; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; import java.io.UnsupportedEncodingException; import java.util.Properties; public class SimpleEmail { public static void main(String[] args) { // 收件人电子邮箱 String to = "XXX@qq.com"; // 发件人电子邮箱 String from = "XXX@qq.com"; // 指定发送邮件的服务器为 QQ邮箱主机 String host = "smtp.qq.com"; // 获取系统属性 Properties properties = System.getProperties(); // 设置邮件服务器 properties.setProperty("mail.smtp.host", host); //设置是否认证 properties.put("mail.smtp.auth", "true"); //认证 Authenticator authenticator = new Authenticator(){ public PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名、授权码(使用第三方时需要提供授权码,而不是密码) return new PasswordAuthentication("XXX@qq.com", "XXX"); } }; // 获取默认session对象 Session session = Session.getDefaultInstance(properties,authenticator); try{ // 创建默认的 MimeMessage 对象 MimeMessage message = new MimeMessage(session); // Set From: 发件人,头部头字段 message.setFrom(new InternetAddress(from)); // Set To: 收件人,头部头字段,单发 message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); //多发 // void addRecipients(Message.RecipientType type, // Address[] addresses) //throws MessagingException // 下面是对于参数的描述: // //type:要被设置为 TO, CC 或者 BCC,这里 CC 代表抄送、BCC 代表秘密抄送。举例:Message.RecipientType.TO // //addresses: 这是 email ID 的数组。在指定电子邮件 ID 时,你将需要使用 InternetAddress() 方法。 // Set Subject: 主题,头部头字段 message.setSubject("This is the Subject Line!"); // 设置消息体,邮件内容 //setText进入源码,可以看到底层调用setContent,而setContent会new一个DataHandler,所以会覆盖掉之前的setContent // message.setText("This is actual message"); // 发送 html 消息, 可以插入html标签 // message.setContent("<h1>This is actual message</h1>", // "text/html" ); //发送带有附件的 E-mail // 创建文本消息部分 BodyPart messageBodyPart = new MimeBodyPart(); // 消息 messageBodyPart.setText("This is message body"); // 创建多重消息 Multipart multipart = new MimeMultipart(); // 设置文本消息部分 multipart.addBodyPart(messageBodyPart); // 创建附件部分 messageBodyPart = new MimeBodyPart(); String filename = "E:\桌面壁纸\哈哈.png"; DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); //就只这行可以防止文件名乱码 String newFileName = MimeUtility.encodeText(source.getName(),"utf-8",null); messageBodyPart.setFileName(newFileName); multipart.addBodyPart(messageBodyPart); // 发送完整消息 message.setContent(multipart ); // 发送消息 Transport.send(message); System.out.println("Sent message successfully...."); }catch (MessagingException | UnsupportedEncodingException mex) { mex.printStackTrace(); } } }
2、邮件工具:
package com.canzhen.demo.util; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.Authenticator; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; import java.io.UnsupportedEncodingException; import java.util.Properties; public class MultiEmailUtil { private Properties props;//用来存储一些邮件的属性,设置几个等待时间什么的。 private String[] params = new String[2];//用来存储发件人和授权码 /** * @param transportType 邮件发送方式 * @param serviceType 服务器类型 * @param servicePort 服务器端口号 * @param fromEMail 发件人 * @param authPassword 授权码 */ public MultiEmailUtil(String transportType,String serviceType,String servicePort,String fromEMail ,String authPassword) { // // 获取默认的 Session 对象。 // 1.创建一个程序与邮件服务器会话对象 Session Properties tProps = new Properties(); tProps.put("mail.transport.protocol", transportType); tProps.put("mail.smtp.host",serviceType );//smtp.exmail.qq.com 这个例子是qq的企业邮箱的服务器 tProps.put("mail.smtp.port", servicePort);//一般默认都是 25 // 指定验证为true tProps.setProperty("mail.smtp.auth", "true"); // props.setProperty("mail.smtp.timeout","1000"); tProps.put("mail.smtp.timeout", 100000);//这几个参数很有必要 tProps.put("mail.smtp.connectiontimeout", 100000);//这几个参数很有必要 tProps.put("mail.smtp.writetimeout",100000);//这几个参数很有必要 props = (Properties) tProps.clone(); params[0]=fromEMail;//如果可以最好弄一个加密的方式 params[1]=authPassword;//如果可以最好弄一个加密的方式 } /*** * * @param mailTO 收件人集合,这个不可以为空,哈哈哈 * @param mailCC 抄送人集合,可以传null,若果是null就当做没有抄送 * @param contentTop 邮件标题,可以传null,默认值是 "您有,一封邮件待查收" * @param contentText 邮件正文,可以传null,默认值是 "各位好:" * @param fileName 附件的绝对地址,可以传null,如果是null就默认当做不添加附件 */ public boolean sendEmail(String[] mailTO,String[] mailCC,String contentTop,String contentText,String fileName) { //收件人不能是空 if (mailTO == null || mailTO.length == 0) return false; // 认证 Authenticator auth = new Authenticator() { @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(params[0], params[1]); } }; Session session = Session.getInstance(props, auth);//居然发现了一个final的类,和String一样,哈哈 try{ // 创建默认的 MimeMessage 对象。 MimeMessage message = new MimeMessage(session); // Set From: 发件人,头部头字段 message.setFrom(new InternetAddress(params[0])); Address addressesTO[] = new Address[mailTO.length]; //循环收件人 for (int i = 0; i < mailTO.length ; i++) { addressesTO[i] = (Address) new InternetAddress(mailTO[i]).clone(); } message.addRecipients(Message.RecipientType.TO,addressesTO);//设置收件人 //对抄送人进行处理 if( ! (mailCC == null|| mailCC.length == 0)) { Address addressesCC[] = new Address[mailCC.length]; //循环抄送人 for (int i = 0; i < mailCC.length; i++) { addressesCC[i] = (Address) new InternetAddress(mailCC[i]).clone(); } message.addRecipients(Message.RecipientType.CC, addressesCC);//设置抄送人 } // Set Subject: 头字段 if(contentTop == null || contentTop.equals("")) { message.setSubject("您有,一封邮件待查收"); }else { message.setSubject(contentTop); } // 创建消息部分 BodyPart messageBodyPart = new MimeBodyPart(); // 消息 if(contentText == null || contentText.equals("")){ messageBodyPart.setText("各位好:"); }else{ messageBodyPart.setText(contentText); } // 创建多重消息 Multipart multipart = new MimeMultipart(); // 设置文本消息部分 multipart.addBodyPart(messageBodyPart); // String tFileName = fileName; //目前没有对目录做校验,后续再添加吧 if (!( fileName == null || fileName.equals(""))){ // 附件部分 messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(fileName); messageBodyPart.setDataHandler(new DataHandler(source)); //就只这行可以防止乱码 String newFileName = MimeUtility.encodeText(source.getName(),"utf-8",null); messageBodyPart.setFileName(newFileName); multipart.addBodyPart(messageBodyPart); } // 发送完整消息 message.setContent(multipart,"text/html;charset=utf-8"); // 发送消息 Transport.send(message); System.out.println("Sent message successfully...."); }catch (MessagingException | UnsupportedEncodingException mex) { mex.printStackTrace(); } return true; } }
测试:
package com.canzhen.demo.test; import com.canzhen.demo.util.MultiEmailUtil; public class UtilTest { public static void main(String[] args) { String[] mailTO = {"XXX@qq.com"};//收件人 String[] mailCC = {"XXX@qq.com"};//抄送人 String contentTop = "这是一个邮件的题目"; String contentText = "这是这个邮件的正文"; String fileName = "E:\桌面壁纸\哈哈.png";//如果有附件的话这填写地址 new MultiEmailUtil("SMTP","smtp.qq.com","25","XXX@qq.com", "XXX").sendEmail(mailTO,mailCC,contentTop,contentText,fileName); } }
以上是关于java_邮件的主要内容,如果未能解决你的问题,请参考以下文章