javaMail学习(七)——使用javaMail发复杂邮件

包括基本的文字邮件、html邮件、有图片的、有附件的邮件。没什么可说的,直接上代码:

package com.wjl.mail.utils;

import java.io.File;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.URLDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
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;

/**
 * 邮 件 发 送 的工具类
 * 易 邮 各个账号之间互相 发 送 消息:包括简单的文字邮 件、html邮 件、图片邮 件、附件邮 件等信息
 */
public class MailUtils7 {
	private static String userName = "[email protected]";// 发 送 邮 件的人
	private static String password = "123456";// 发 送 邮 件的 账 户 的密 码
	private static String userNameForTO = "[email protected]";//接收邮 件的人
	private static String userNameForCC = "[email protected],[email protected]";//抄送人
	private static String userNameForBCC = "[email protected]";//密送人
	
	private static String port = "25";//465、587
	
	//该方法用来设置smtp 服 务 器的基本信息
	public static Properties setPropertiesForMai() throws GeneralSecurityException{
		Properties props = new Properties();
		//开 启debug调试  
        props.setProperty("mail.debug", "true");  
        //stmp 服 务 器需要进行身份验 证,也就是用 户 名和密 码的校 验,这样才能通过验 证
        props.setProperty("mail.smtp.auth", "true"); 
        // 发 送 邮 件协议名称  
        props.setProperty("mail.transport.protocol", "smtp");  
        //设置 邮 件 服 务 器主机名  
        props.setProperty("mail.host", "127.0.0.1");//本地
        //设 端 口 号(该配置可写可不写)
        props.setProperty("mail.smtp.port", port);
        return  props;
	}
	
	/**
	 * 该方法用来 发 送 邮 件
	 * @param to:给谁发邮 件
	 * @param copyTo:抄送人
	 * @param copyTo2:密送人
	 * 抄送跟密送的区别:
	 * 抄送人:所有的邮 件接受者(包括收件人、抄送人、密送人)都能看到该封邮 件抄送给了谁,不能看到密送给了谁
	 * 密送人:可以收到邮 件,也能看到收件人是谁、抄送人是谁(当你发现收件人、抄送人都没有你你却收到邮 件时,说明你是密送人,嘎嘎)
	 * 举例:user04给user03发邮 件,抄送给user01、user02,密送给Admin
	 * 那么:user03(收件人)、user01(抄送人)、user02(抄送人)、Admin(密送人)都能收到邮 件,且能看到发件人是user04、收件人是user03、抄送人是user01和user02,看不到密送人信息
	 * Admin(密送人)能收到邮 件,也能看到发件人、收件人、抄送人信息(真神奇)。
	 * **/
	public static void sendMain(String to,String copyTo,String copyTo2) throws Exception{
		//1、创建连接对象,连接到邮 箱 服 务 器
		Properties props = setPropertiesForMai();
		
		//Authenticator:认证信息
		Session session = Session.getInstance(props, new Authenticator(){
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName,password);//使用它给其他 账 户 发邮 件
			}
		});
		
		//2、创建邮 件对象
		Message message = new MimeMessage(session);
		//2.1设置发件人
		message.setFrom(new InternetAddress(userName));
		//2、2设置收件人
		message.setRecipient(RecipientType.TO, new InternetAddress(to));
		
		//2.2.1 抄送人
		if(copyTo!=null){
			message.setRecipients(RecipientType.CC,InternetAddress.parse(copyTo));
		}
		//2.2.2 密送人
		if(copyTo2!=null){
			message.setRecipients(RecipientType.BCC,InternetAddress.parse(copyTo2));
		}
		
		//2.3邮 件的主题
		message.setSubject(" 测 试 发复杂消息:有附件的邮 件");
		//2.4邮 件的正文(即邮 件的内容)
		
		/*
		//第一:文本邮 件
		message.setSubject(" 测 试 发复杂消息:文本邮 件");
		message.setText(" 测 试 文本邮 件");
		*/
		/*
		//第二:html邮 件:
		//向multipart对象中添加邮 件的各个部分内容,包括文本内容和附件
		message.setSubject(" 测 试 发复杂消息:HTML邮 件");
		Multipart multipart = new MimeMultipart();
		//设置邮 件的文本内容
		BodyPart htmlContent = new MimeBodyPart();
		htmlContent.setContent(appendHtmlForMail(), "text/html;charset=utf-8");
		multipart.addBodyPart(htmlContent);
		message.setContent(multipart);
		*/
		//第三:有附件的邮 件
		//邮 件内容
		Multipart multipart = new MimeMultipart();
		String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1515670086235&di=6adfad147f9fa257e93828dbd65a228d&imgtype=0&src=http%3A%2F%2Fpic30.nipic.com%2F20130607%2F9908282_110512457172_2.jpg";
		//文本内容
		BodyPart contentPart = new MimeBodyPart();
		contentPart.setContent("<p>这是一封有附件的邮 件</p><p>第一个附件是这个样子的:</p><img src=\""+url+"\" />","text/html;charset=utf-8");
		multipart.addBodyPart(contentPart);
		
		//附件1:网络图片
		BodyPart filePartForURL = new MimeBodyPart();
		//设置文件名称
		filePartForURL.setFileName(MimeUtility.encodeText("附件1.jpg"));//MimeUtility.encodeText:解决中文乱码
		DataSource urlDataSorce = new URLDataSource(new URL(url));
		DataHandler urlDataHandler= new DataHandler(urlDataSorce);
		filePartForURL.setDataHandler(urlDataHandler);
		multipart.addBodyPart(filePartForURL);
		
		//附件2:本地文件
		BodyPart filePartForLocal = new MimeBodyPart();
		filePartForLocal.setFileName(MimeUtility.encodeText("附件2.txt"));
		DataSource localDataSorce = new FileDataSource(new File("D:\\test.txt"));
		DataHandler localDataHandler= new DataHandler(localDataSorce);
		filePartForLocal.setDataHandler(localDataHandler);
		multipart.addBodyPart(filePartForLocal);
		
		//附件3:本地中文名称的文件
		BodyPart filePartForLocal2 = new MimeBodyPart();
		filePartForLocal2.setFileName(MimeUtility.encodeText("附件3.doc"));//该名称的后缀名与FileDataSource()中的文件名称的后缀必须一致,否则无法预览(使用foxMail进行预览)
		DataSource localDataSorce2 = new FileDataSource(new File("D:\\请假.doc"));
		DataHandler localDataHandler2= new DataHandler(localDataSorce2);
		filePartForLocal2.setDataHandler(localDataHandler2);
		multipart.addBodyPart(filePartForLocal2);
		
		//将multipart添加到message
		message.setContent(multipart);
		//3. 发 送 邮 件
		Transport trans = session.getTransport();
		//连接邮 件 服 务 器
        trans.connect(userName, password);  
		// 发 送 邮 件
        trans.sendMessage(message, message.getAllRecipients());  
        //关闭连接
        trans.close();
        
        //Transport.send(message);(两种方式都可以)
		System.out.println("发 送 成 功 ");
	}
	
	//该方法用来拼接HTML(较复杂)
	public static String appendHtmlForMail(){
		StringBuffer html = new StringBuffer(); 
		html.append("<p style=\"font-size:14px; font-family:verdana; margin:0 0 10px; line-height:22px; text-align:left\">很抱歉您 发 送 的邮 件被退回,以下是该邮 件的相关信息:</p>")
			.append("<table style=\"width:90%; border-collapse:collapse; margin:0 0 15px\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">")
			.append("<tbody><tr>")
			.append("<td style=\"width:120px; font-family:verdana; font-size:14px; font-weight:bold; text-align:center; background:#E0ECF9; border:1px solid #C1D9F3\">被退回邮 件</td>")
			.append("<td style=\"border:1px solid #C1D9F3; font-family:verdana; padding:5px 15px; line-height:20px; font-size:14px;\">主 题: 测 试 QQ与易邮之间发邮 件 <br>时 间:<span style=\"border-bottom: 1px dashed rgb(204, 204, 204); position: relative;\" t=\"5\" times=\" 10:58\">2018-01-10</span> 10:58:25 </td>")
			.append("</tr></tbody></table>")
			.append("<table style=\"width:90%; border-collapse:collapse; margin:0 0 10px\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">")
			.append("<tbody><tr>")
			.append("<td colspan=\"2\" style=\"font-size:14px;font-weight:bold;padding:5px 10px;  border:1px solid #C1D9F3; background:#C1D9F3\">无法 发 送 到 <a href=\"mailto:[email protected]\" target=\"_blank\">[email protected]</a></td>")
			.append("</tr>")
			.append("<tr>")
			.append("<td style=\"width:120px; font-size:14px;text-align:center; background:#EFF5FB; border:1px solid #C1D9F3\">退信原因</td>")
			.append("<td style=\"border:1px solid #C1D9F3; font-family:verdana; padding:5px 15px; line-height:20px; font-size:14px;\">")
			.append("无法与收件人(<a href=\"mailto:[email protected]\" target=\"_blank\">[email protected]</a>)所在服务商建立连接,收件人域名可能不存在。 <br> connect to wjl.com[103.224.182.212]: Connection refused (port 25) </td>")
			.append("</tr>")
			.append("<tr>")
			.append("<td style=\"width:120px; font-size:14px; text-align:center; background:#EFF5FB; border:1px solid #C1D9F3\">解决方案</td>")
			.append("<td style=\"border:1px solid #C1D9F3; font-family:verdana; padding:5px 15px; line-height:20px; font-size:14px;\">请确认您的收件人地址无误,稍后重新尝试 发 送 您的邮 件。 您也可以向管理员报告此退信。</td>")
			.append("</tr></tbody></table>")
			.append("<p style=\"font-size:14px; width:90%;font-family:verdana; margin:0 0 10px; line-height:22px; text-align:left\"> 发 送 尝试已经持续进行了 4 小时。不会再有任何动作来尝试 发 送 你的邮 件了。请联系你的系统管理员或先通过其它非电子邮 件的方式向你的朋友 发 送 信息以免耽误。</p>")
			.append("<p style=\"font-size:14px; font-family:verdana; margin:0 0 10px; line-height:22px; text-align:left\">此外,您还可以 <a href=\"http://service.mail.qq.com/cgi-bin/help?subtype=1&amp;&amp;id=29&amp;&amp;no=188\" target=\"_blank\">点击这里</a> 获取更多关于退信的帮助信息。</p>")
		;
		return html.toString();
	}
	
	public static void main(String[] args) {
		try {
			sendMain(userNameForTO,userNameForCC,userNameForBCC);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

 祝好运!

猜你喜欢

转载自1017401036.iteye.com/blog/2407507