JavaMail 发送一封简单邮件

简单邮件就是里面只包含了文字

很多概念性的东西都是来自下面的一篇文章里:
https://my.oschina.net/itblog/blog/298379

SMTP & POP3:

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

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

先了解一下几个类:
发送邮件之前需要创建一个Session对象 (会话对象)

Session是一个很容易被误解的类,这归咎于混淆视听的类名。千万不要以为这里的Session像HttpSession一样代表真实的交互会话,但创建Session对象时,并没有对应的物理连接,它只不过是一对配置信息的集合。Session的主要作用包括两个方面:
1)接收各种配置属性信息:通过Properties对象设置的属性信息;
2)初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。(比如 Transport Message)

保存各种配置信息的 Properties(属性对象)

由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,

        //我使用的是QQ邮箱 
	Properties props = new Properties();
	props.setProperty("mail.transport.protocol", "smtp"); //协议
	props.setProperty("mail.smtp.host", "smtp.qq.com"); // 服务器地址
	props.setProperty("mail.smtp.port", "465");  //端口
	props.setProperty("mail.smtp", "true");  //验证
	//如果是163邮箱的话 上面的就已经可以了  但是qq邮箱还需要进行SSL验证
	props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
	props.setProperty("mail.smtp.socketFactory.fallback", "false");
	props.setProperty("mail.smtp.socketFactory.port", "465");

连接对象 Transport

	//创建连接对象
	Transport transport = session.getTransport();
	//创建连接    其中密码以 “授权码”的形式体现  设置 账户 POP3/SMTP服务
	transport.connect("[email protected]", "jyfmavkhxjpfebic");  //账户名 密码
	//发送邮件
	transport.sendMessage(msg, msg.getAllRecipients()); // 邮件 , 邮件的所有接收者
	//关闭连接
	transport.close();

上面的授权码:
在这里插入图片描述

在这里插入图片描述
发一个短信之后点击【我已发送】 就会出来一个授权码

邮件 Message (消息对象)

一旦获得 Session 对象,就可以继续创建要发送的消息。这由 Message 类来完成。因为 Message 是个抽象类,您必需用一个子类,多数情况下为 javax.mail.internet.MimeMessage。MimeMessage 是个能理解 MIME 类型和头的电子邮件消息,正如不同 RFC 中所定义的。虽然在某些头部域非 ASCII 字符也能被译码,但 Message 头只能被限制为用 US-ASCII 字符。
要创建一个 Message,请将 Session 对象传递给 MimeMessage 构造器:

/* session send recipent 都是自定义的*/
	//创建Message对象
	MimeMessage msg = new MimeMessage(session);

	//邮件里面包含的内容
	Address address1 = new InternetAddress(send, "发件人", "UTF-8");
	Address address2 = new InternetAddress(recipient, "收件人", "UTF-8");
	msg.setFrom(address1);  // 发送人
	msg.setSubject("邮件的标题", "UTF-8");  
	// .TO:普通收件人    CC 抄件人  BBC密送人 
	msg.setRecipient(MimeMessage.RecipientType.TO, address2); // 收件人
	msg.setContent("邮件的主体", "text/html;charset=utf-8");
    // 不能直接写UTF_8  邮件的主体在显示的时候是以HTML格式显示的 
    // 所以用的字符集也应该是html所支持的格式写法

下面的测试代码:
先要导入 javax.mail.jar 包

package com.testjavamail;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;

public class TestMail {
	public static void main(String[] args) throws Exception{
		Properties props = createProperty();
		Session session = Session.getInstance(props);// Session类的构造器私有
		//创建邮件
		MimeMessage msg = createMimeMessage(session, "[email protected]", "[email protected]");
		// 发送邮件 首先  创建连接对象
		Transport transport = session.getTransport();
		//创建连接    其中密码以 “授权码”的形式体现  设置 账户 POP3/SMTP服务
		transport.connect("[email protected]", "(自己的授权码)"); 
		//发送邮件
		transport.sendMessage(msg, msg.getAllRecipients());
		//关闭连接
		transport.close();
	}
	
	public static MimeMessage createMimeMessage(Session session, String send, String recipient) throws Exception{
		MimeMessage msg = new MimeMessage(session);
		//邮件里面包含的内容
		Address address1 = new InternetAddress(send, "发件人", "UTF-8");
		Address address2 = new InternetAddress(recipient, "收件人", "UTF-8");
		msg.setFrom(address1);
		msg.setSubject("邮件的标题", "UTF-8");
		msg.setRecipient(MimeMessage.RecipientType.TO, address2);
		msg.setContent("邮件的主体", "text/html;charset=utf-8");
		msg.setSentDate(new Date());  //设置发送时间
		msg.saveChanges(); // 保存邮件
		return msg;
	}
	
	public static Properties createProperty(){
		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "smtp"); //协议
		props.setProperty("mail.smtp.host", "smtp.qq.com"); //地址
		props.setProperty("mail.smtp.port", "465"); //端口
		props.setProperty("mail.smtp", "true"); //验证
		//如果是163邮箱的话 上面的就已经可以了  但是qq邮箱还需要进行SSL验证
		props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.setProperty("mail.smtp.socketFactory.fallback", "false");
		props.setProperty("mail.smtp.socketFactory.port", "465");
		return props;
	}
}

猜你喜欢

转载自blog.csdn.net/zf2015800505/article/details/84701287