如何使用Java代码发送一个“Java Email”?

Java Email

  Email就是电子邮件,我,们经常用来收发邮件的软件有:Outlook,网易邮箱,Foxmail,QQ邮箱等。当然,使用Java程序也可以收发电子邮件。我们先来了解一下电子邮件的发送过程,例如Outlook,发送到邮件服务器,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。

MUA =》 MTA =》 MTA =》 MDA 《= MUA

  • MUA(Mail User Agent):类似于Outlook这样的邮件软件,给用户服务的邮局代理;
  • MTA(Mail Transfer Agent):邮局服务器,邮件中转的代理;
  • MDA(Mail Delivery Agent):最终到达的邮局服务器,邮件到达的代理。

邮件协议

  常见的邮件协议有:POP3SMTPIMAP

POP3

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

SMTP

  SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循 SMTP协议的发送邮件服务器。

IMAP

  IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,你在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上。

POP3和IMAP有什么区别?

  POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上。比如:通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
  IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

发送邮件

  接下来进入实战环节。以POP3/SMTP为例,基于SMTP协议由126邮箱向QQ邮箱发送邮件。
  1.导jar包(javax.mail-1.6.2.jar):将相关的jar包加入项目。
  2.登录126邮箱,在设置里开启POP3/SMTP协议
在这里插入图片描述
注意:服务器地址:

  • POP3服务器: pop.126.com
  • SMTP服务器: smtp.126.com
  • IMAP服务器: imap.126.com

  3.准备工作做好后,接下来在项目中编写代码:

  (1)将STMP服务的连接信息存入Properties
  创建一个Properties类型的对象,用来存SMTP服务的连接信息。将SMTP的主机名、主机端口号、是否需要用户认证、启用TLS加密通过Properties的put()方法将键和值存进去。

注意:这些值一般都固定不变的,所以习惯于把这些数据以键值对的方式存到一个Properties对象中。Properties类继承自Hashtable类,而Hashtable实现了Map接口。所以Properties可以存取键值对(Key-Value)。

  (2)创建Session会话
  调用Session类的静态方法getInstance(),将存入Properties的STMP服务的连接信息和用户认证对象传入。然后调用SetDebug()方法,参数为true。
  (3)创建邮件对象(Message抽象类的子类对象)
  将发件人、收件人、标题、内容调用各自的set方法传入。
  (4)发送邮箱
  调用Transport类的send()方法将邮件对象传入。
这里我将存STMP服务的连接信息和创建Session会话封装到一个工具类里,减少冗余代码。
代码示例如下:
JavaMailUtils类

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.126.com";

		// 邮箱账号和授权密码
		String userName = "************@126.com";
		String userPassword = "************";

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

		// 创建session
		// 参数1.SMTP服务的连接信息
		// 参数2.用户认证对象
		Session session = Session.getInstance(properties, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, userPassword);
			}
		});
		// 开始调试模式
		session.setDebug(true);
		return session;
	}
}

测试类

import java.io.IOException;

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

//发送邮件
public class Demo02 {
	public static void main(String[] args) {
		try {
			// 1.创建Session会话
			Session session = JavaMailUtils2.createSession();

			// 2.创建邮件对象(Message抽象类的子类对象 )
			MimeMessage message = new MimeMessage(session);// 传入Session
			message.setFrom(new InternetAddress("************@126.com"));// 发件人
			message.setRecipient(RecipientType.TO, new InternetAddress("**********@qq.com"));// 收件人
			message.setSubject("这是一封测试邮件!", "utf-8"); // 标题
			message.setText("你好啊!", "utf-8", "html");// 内容
			// 3.发送邮箱

			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

	}
}

运行结果:
在这里插入图片描述

发送附件

  要发送附件,那么就不能直接调用message.setText()方法,而是要调用message.setContent()传入一个Multipart对象。一个Multipart对象可以添加若干个BodyPart。BodyPart可调用setContent()添加正文。
代码示例如下:

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.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.util.ByteArrayDataSource;

//发送邮件(文字+附件)
public class Demo03 {
	public static void main(String[] args) {
		try {
			// 1.创建Session会话
			Session session = JavaMailUtils.createSession();

			// 2.创建邮件对象(Message抽象类的子类对象 )
			MimeMessage message = new MimeMessage(session);// 传入Session
			message.setFrom(new InternetAddress("************@126.com"));// 发件人
			message.setRecipient(RecipientType.TO, new InternetAddress("**********@qq.com"));// 收件人
			message.setSubject("请不要打开这封邮件", "utf-8"); // 标题

			// 邮件内容(复合对象)
			Multipart multipart = new MimeMultipart();

			// 正文
			BodyPart textPart = new MimeBodyPart();
			// 参数一:正文内容
			// 参数二:内容类型;字符编码集
			textPart.setContent("你今天<b>卷</b>了吗?", "text/html;charset=utf-8");

			// 附件
			BodyPart imagePart = new MimeBodyPart();
			imagePart.setFileName("hello.jpg");// 设置附件文件显示名称
			// 数据处理对象(从本地磁盘读取附件文件)
			imagePart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(
											Paths.get("E:\\image\\hello.jpg")),
									"appication/octet-stream")));

			// 添加至邮件内容
			multipart.addBodyPart(textPart);
			multipart.addBodyPart(imagePart);

			// 设置邮件内容
			message.setContent(multipart);

			// 3.发送邮箱
			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

查看邮件:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值