Java中的邮件发送——Java Email

电子邮件

        电子邮件是一种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。

        电子邮件可以是文字、图像、声音等多种形式。同时,用户可以得到大量免费的新闻、专题邮件,并轻松实现轻松的信息搜索。电子邮件的存在极大地方便了人与人之间的沟通与交流,促进了社会的发展。

邮件协议

SMTP协议

        SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。 SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

POP3协议

        POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

IMAP协议

        IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留 在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。

POP3协议与IMAP协议两者都是接收协议,那么两者的区别是什么?

        POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

        IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

邮件发送代码实现

在发送邮件之前,每次都会创建Session连接,这里可以定义一个JavaMailUtils工具类,每次创建连接时,只需要调用createSession()方法,不必频繁写重复代码了。作者使用的是网易邮箱,在发送之前,为了密码的安全性,可以在官网上申请授权密码,这里使用授权密码就可以了,在创建连接时,使用Properties对象,本质上是一个map集合,可以有效地把服务器的信息存起来。比如:主机名,主机端口号,是否需要用户认证,是否需要启用TLS加密等。

package com.fulain.demo;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class JavaMailUtils {
	
	public static Session createSession() {
		// SMTP服务器地址
		String smtp = "smtp.163.com";

		// 邮箱账号和密码(授权密码)
		String userName = "";
		String password = "";

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

		// 创建Session
		// 参数1 : SMTP服务器的连接信息
		// 参数2 : 用户认证对象(Authenticator()接口的匿名实现类)
		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);
			}
		});

		// 开启调试模式
		session.setDebug(true);

		return session;
	}
}

发送普通邮件

        发送邮件时,我们需要构造一个Message对象,setFrom()方法指定发件人,setRecipient()方法指定收件人,RecipientType这个枚举类提供了常量,RecipientType.TO代表收件人,RecipientType.CC代表抄送人,setSubject()方法表示设置标题,setText()方法表示设置正文内容。然后调用Transport.send(Message)即可完成发送:绝大多数邮件服务器要求发送方地址和登录用户名必须一致,否则发送将失败。

package com.fulain.demo;

import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Demo02 {
	public static void main(String[] args) {
		
		try {
			// 1.创建session会话
			Session session = JavaMailUtils.createSession();
			
			// 2.发送
			MimeMessage msg = new MimeMessage(session); // 传入session
			msg.setFrom(new InternetAddress("发件人邮箱")); // 发件人
			msg.setRecipient(RecipientType.TO, new InternetAddress("收件人邮箱")); // 收件人 
			msg.setRecipient(RecipientType.CC, new InternetAddress("抄送人邮箱")); // 抄送人
			msg.setSubject("这是一份测试邮件" , "utf-8"); // 标题
			msg.setText("下雨天要注意保暖,好好吃饭呦!","utf-8"); // 正文
			
			// 3,发送邮件
			Transport.send(msg);
			
		
		} catch (AddressException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

发送邮件并带有附件

        发送附件时,要构造一个Multipart对象。一个Multipart对象可以添加若干个BodyPart,其中第一个BodyPart是文本,即邮件正文,后面的BodyPart是附件。BodyPart依靠setContent()决定添加的内容,用setContent("...", "text/html;charset=utf-8")添加HTML文本。如果添加附件,需要设置文件名(不一定和真实文件名一致),并且添加一个DataHandler(),使用Files工具类的readAllBytes()方法,可以更方便的从本地磁盘中读取文件并读取成字节数据,并传入文件的MIME类型(application/octet-stream), 最后,通过setContent()把Multipart添加到Message中,即可发送。

package com.fulain.demo;

import javax.mail.Message.RecipientType;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;


public class Demo03 {
	public static void main(String[] args) {
		
		try {
			// 1.创建session会话
			Session session = JavaMailUtils.createSession();
			
			// 2.发送
			MimeMessage msg = new MimeMessage(session); // 传入session
			msg.setFrom(new InternetAddress("发件人邮箱地址")); // 发件人
			msg.setRecipient(RecipientType.TO, new InternetAddress("收件人邮箱地址")); // 收件人 
			
			msg.setSubject("这是一份测试邮件" , "utf-8"); // 标题
			
			// 3.邮件内容“复合”对象
			Multipart multipart = new MimeMultipart();
			
			// 正文
			BodyPart textPart = new MimeBodyPart();
			// 参数1 : 正文类型
			// 参数2 : 内容类型;字符编码集
			textPart.setContent("大小姐<b>驾到</b>,统统闪开!来一发子弹吗?","text/html;charset=utf-8");
			
			// 附件
			BodyPart imagePart = new MimeBodyPart();
			imagePart.setFileName("sweet.jpg");
			// 数据处理对象(读取附件文件从本地磁盘进行读取)
			imagePart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("d:\\test\\image\\tangcuyv.jpg")),
									"application/octet-stream")));
			
			// 添加至邮件内容
			multipart.addBodyPart(textPart); // 添加正文
			multipart.addBodyPart(imagePart); // 添加附件
			
			// 设置邮件内容
			msg.setContent(multipart);

			// 4.发送邮件
			Transport.send(msg);
			
		
		} catch (AddressException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

发送内嵌图片的HTML邮件

        如果需要在HTML邮件中内嵌图片,可以选择在邮件中加入<img src=" cid=附件别名">,附件别名通过.setHeader("Content-ID", "<别名>")方法设置。

            // 邮件正文部分
			BodyPart textBodyPart = new MimeBodyPart();
			StringBuilder body = new StringBuilder();
			body.append("<h1>托尼史塔克</h1>");
			body.append("<img src=\"cid:tony\"/>");
			textBodyPart.setContent(body.toString(), "text/html;charset=utf-8");
			
			// 邮件附件部分
			BodyPart imageBodyPart = new MimeBodyPart();
			imageBodyPart.setFileName("iron_Man.jpg");
			imageBodyPart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("d:\\test\\image\\me2.jpg")), 
									"application/octet-stream")));
			imageBodyPart.setHeader("Content-ID", "<tony>");
			

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙草不加料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值