JavaEmail--发送html格式的电子邮件!

一、SMTP服务器:

SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。可增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。

  • 网易163邮箱(mail.163.com):SMTP服务器地址:smtp.163.com(端口:25)
  • 网易126邮箱(mail.126.com):SMTP服务器地址:smtp.126.com(端口:25)
  • 移动139邮箱(mail.10086.cn):SMTP服务器地址:smtp.139.com(端口:25)
  • 腾讯QQ邮箱(mail.qq.com):SMTP服务器地址:smtp.qq.com (端口:25)
		//SMTP服务器连接信息
		Properties props=new Properties();
		props.put("mail.smtp.host", "smtp.163.com");  //SMTP主机名
		props.put("mail.smtp.port", "25");  //主机端口号
		props.put("mail.smtp.auth", "true");  //是否需要用户认证
		props.put("mail.smtp.starttls.enable", "true");  //启动TLS加密

二.创建Session会话

当发送邮件时,我们每次都要先创建Session,再输入邮箱的账号密码,建立连接信息,过于繁琐,所以我们可以在这里创建一个JavaMailUtils类,每次创建连接时,只需要调用JavaMailUtils类里的createsession()方法即可,大大减少了代码的冗余。

   public final class JavaMailUtils {
	public JavaMailUtils() {}
	public static Session createSession() {

		// 邮箱账号信息
		String userName = "151********@163.com"; // 邮箱发送账号
		String password = "********"; // 账号授权密码

		// SMTP服务器连接信息
		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.163.com"); // SMTP主机名
		props.put("mail.smtp.port", "25"); // 主机端口号
		props.put("mail.smtp.auth", "true"); // 是否需要用户认证
		props.put("mail.smtp.starttls.enable", "true"); // 启动TLS加密

		// 创建Session会话
		// 参数1:smtp服务器连接参数u
		// 参数2:账号和密码的授权认证对象
		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);
			}
		});
		return session;
	}
}

三.发送邮件

1、发送HTML纯文字内容邮件

  • 首先,我们还是要创建Session,当然这次我们只需调用JavaMailUtils的createsession()方法 就行。然后创建Message对象,因为Message类是一个抽象类,所以我们只能创建其子类对象,然后将session传入。
  • 接着调用setFrom()方法选择发件人,setRecipient()方法选择收件人,收件人可以是一个或者多个;当接收方是个多个,要对邮箱账号设置成一个InternetAddress[ ]数组。(RecipientType.TO代表收件人,RecipientType.CC代表抄送人。)
  • setSubject()方法选择输入邮件的标题;
  • setText()方法输入邮件的正文.发送正文带有"html"标签的邮件,可以在需要修改的内容前后加上html的修饰符进行修改。
    例:让"好饿"两个字加粗。
  • 最后通过Transport的send()方法完成发送邮件。
// 1.创建Session会话
		Session session = JavaMailUtils.createSession();
		// 2.创建邮件对象
		try {
			MimeMessage message = new MimeMessage(session);
			 //设置发送方
            message.setFrom(new InternetAddress("151********@163.com"));
            //设置接收方(1个)
            message.setRecipient(RecipientType.TO, new  InternetAddress("********@qq.com"));
            //当接收方是多个时抄送,设置成数组类型
            message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("*********@qq.com"),new InternetAddress("**********@qq.com") }); 
		    //设置标题
			message.setSubject("测试邮件!!!");  
			//发送内容,邮件正文内容包含html内容
			message.setText("我好饿啊!", "utf-8", "html");  		
			//发送
			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}

2、发送带有附件的HTML邮件

当发送带有附件的邮件时需要创建邮件内容"复合"对象,Multipart类的MimeMultipart实现类,然后再创建BodyPart类的MimeBodyPart实现类。
textPart用于存储正文内容,调用setContent()方法,参数1为正文内容,参数2为内容类型;字符编码集。
filePart用于存储附件,先调用setFileName()方法设置附件文件的显示名称(显示名称可以与原名不一致)。再调用setDataHandler(),其中添加一个DataHandler()方法,使用Files工具类的readAllBytes()方法,可以把文件读取成字节数据, 最后,通过setContent()把Multipart添加到Message中,即可发送邮件。

application/octet-stream:浏览器在请求资源时,会通过http返回头中的content-type决定如何显示/处理将要加载的数据,Content-Type: application/octet-stream,告知浏览器这是一个字节流,浏览器处理字节流的默认方式就是下载。

        // 正文
		BodyPart textPart = new MimeBodyPart();
		textPart.setContent("我从山中来,带着兰花草!", "text/html;charset=utf-8");

		// 附件
		BodyPart filePart = new MimeBodyPart();
		filePart.setFileName("测试文件");
		
		// 上传附件文件
		filePart.setDataHandler(new DataHandler(new 
			ByteArrayDataSource(Files.readAllBytes(Paths.get("D:\\test\\maomao\\mao.jpg")),
						"application/octet-stream")));

		// 将正文+附件组装成Multipart对象
		Multipart multipart=new MimeMultipart();
		multipart.addBodyPart(textPart);
		multipart.addBodyPart(filePart);
		
		//放入邮件
		message.setContent(multipart);
		//发送邮件
		Transport.send(message);

3、发送内嵌图片的HTML邮件

与发送带有附件的邮件类似,也是两部分。一部分是textPart,一部分是图片内容imagePart。
imagePart用于存储图片,先调用setFileName()方法设置图片的显示名称。再调用setDataHandler(),其中添加一个DataHandler()方法,使用Files工具类的readAllBytes()方法,可以把文件读取成字节数据。
这里通过StringBuilder定义了一个字符串,将文字内容和图片内容通过字符串的拼接形成一个整体。邮件正文部分中用,附件名通过.setHeader(“Content-ID”, “<别名>”)的方法设置。

    // 创建Session会话
	Session session = JavaMailUtils.createSession();
	try {
	    // 创建邮件对象
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress("151********@163.com"));
		message.setRecipient(RecipientType.TO, new InternetAddress("*********@qq.com"));
		message.setSubject("测试邮件!!!"); 

		// 邮件正文
		BodyPart textPart = new MimeBodyPart();
		StringBuilder contentText = new StringBuilder();
		contentText.append("

哈吉咪

"
); contentText.append("

hhhhhhhhhhhh

"
); // 通过内容ID引用附件图片 contentText.append(""); textPart.setContent(contentText.toString(), "text/html;charset=utf-8"); //附件 BodyPart imagePart = new MimeBodyPart(); imagePart.setFileName("测试图片"); //上传图片文件 imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource( Files.readAllBytes(Paths.get("D:\\test\\maomao\\mao.jpg")), "application/octet-stream"))); //图片的内容id imagePart.setHeader("Content-ID", "cbkj"); //将正文+附件组装成Multipart对象 Multipart multipart = new MimeMultipart(); multipart.addBodyPart(textPart); multipart.addBodyPart(imagePart); // 放入邮件 message.setContent(multipart); // 发送邮件 Transport.send(message); } catch (MessagingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

你可能感兴趣的:(html,java)