一.概述
Email即为电子邮件,在生活很常见,那它是怎样进行传输的呢,例如Outlook,是从用户电脑的邮件软件发送到邮件服务器,可能会经过若干个邮件服务器中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件;
┌─────────┐ ┌─────────┐ ┌─────────┐
│░░░░░░░░░│ │░░░░░░░░░│ │░░░░░░░░░│
┌───────┐ ├─────────┤ ├─────────┤ ├─────────┤ ┌───────┐
│░░░░░░░│ │░░░░░░░░░│ │░░░░░░░░░│ │░░░░░░░░░│ │░░░░░░░│
├───────┤ ├─────────┤ ├─────────┤ ├─────────┤ ├───────┤
│ │───>│O ░░░░░░░│───>│O ░░░░░░░│───>│O ░░░░░░░│<───│ │
└───────┘ └─────────┘ └─────────┘ └─────────┘ └───────┘
MUA MTA MTA MDA MUA
二.邮件协议:
MTA和MDA这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部是如何运行的。更多的需求场景,是需要发送邮件。例如:促销商品邮件、验证码邮件、消息通知邮件等。常见的邮件协议有:POP3、SMTP、IMAP。
1.POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
2.SMTP
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。
SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。
3.IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
4.IMAP和POP3有什么区别?
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。
IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
三.Java程序实现邮件发送:
1.准备SMTP登录信息
常见邮件的服务商的SMTP信息:
QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587
163邮箱:SMTP服务器是smtp.qq.com,端口是465/587
126邮箱:SMTP服务器是smtp.126.com,端口是25
Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587
2.创建session类(方便session实例的复用),再创建一个message对象,然后使用Transport.send()方法进行邮件发送。
创建Session代码实现:
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public class JavaMailUtils {
public static Session creatSession() {
// SMTP服务器地址
String smtp = "smtp.126.com";
// 邮箱账号和授权密码
String userName = "xyr25110712@126.com";
String passward = "MVKFGYHPXEGFNNQV";
// SMTP服务器的连接信息
Properties pro = new Properties();
pro.put("mail.smtp.host", smtp); // STMP主机名
pro.put("mail.smtp.port", "25"); // 主机端口号
pro.put("mail.smtp.auth", "true"); // 是否需要用户认证
pro.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
// 创建Session
// 参数(SMTP服务器的连接信息,用户认证对象Authenticator接口的匿名实现类)
Session session = Session.getInstance(pro, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName,passward);
}
});
// 开启调试模式
session.setDebug(true);
return session;
}
}
创建message对象,填充发送内容,并发送代码实现:(以162向QQ邮箱发送邮件为例)
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;
import javax.mail.internet.MimeMessage.RecipientType;
public class Demo04 {
public static void main(String[] args) {
try {
// 创建session
Session session = JavaMailUtils.creatSession();
// 创建邮件对象(message抽象类的子类对象)
MimeMessage message = new MimeMessage(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("你猜谁是世界上最聪明的人", "text/html;charset=utf-8");
// 附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("a.jpg");
imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\text Java\\netTest\\tt.jpg")), "application/octet-stream")));
// 添加至邮件内容
multipart.addBodyPart(textpart);
multipart.addBodyPart(imagePart);
// 设置邮件内容
message.setContent(multipart);
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}