Java学习-邮件发送

工作中,有很多使用电子邮件的功能,像注册账号时填写邮箱,然后发送系统邮件等。在java中电子邮件的使用涉及到专门的邮件服务器和传输协议。

一、邮件协议

常见的 邮件协议有: POP3 、 SMTP 、 IMAP 。

POP3

        Post Office Protocol 3, 即邮局协议,是一种用于从邮件服务器上下载电子邮件的协议。它允许用户将电子邮件从邮件服务器上下载到本地设备,并在下载后将邮件从服务器上删除。

以下是 POP3 协议的简单介绍和工作原理:

  1. 连接建立:邮件客户端通过向邮件服务器发送连接请求来建立连接。POP3 通常使用 TCP(Transmission Control Protocol)作为传输协议,并连接到服务器的110端口。

  2. 身份验证:一旦连接建立,客户端需要提供用户名和密码进行身份验证。这些凭据通常与用户在邮件服务器上的账户信息相对应。

  3. 邮件下载:验证成功后,邮件客户端可以请求从服务器上下载邮件。服务器会将邮件逐一发送到客户端,并在发送后将其从服务器上删除。通常,邮件客户端会保留一份副本在本地。

  4. 邮件处理:邮件客户端可以根据用户的操作进行邮件处理,例如阅读、删除或标记为已读等。

  5. 断开连接:邮件客户端完成邮件下载后,可以选择断开与服务器的连接。POP3 服务器通常会在一段时间后自动断开连接,但有些服务器也可能允许客户端主动断开连接。

POP3是一种离线协议,用户只能在连接到互联网时才能收取邮件。一旦邮件被下载到本地计算机,用户就可以在没有网络连接的情况下阅读和管理邮件。这使得POP3成为了一种方便的邮件协议,特别适用于那些经常需要离线查看邮件的用户。

SMTP

        全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。SMTP协议定义了电子邮件的格式和传输方式,以及邮件服务器之间的通信规则。SMTP协议使用TCP/IP协议栈作为传输层协议,通过指定目标邮件服务器的IP地址和端口号来发送邮件。

SMTP 协议的工作流程大致如下:

  1. 连接建立:发件人的电子邮件客户端通过向收件人的邮件服务器发送连接请求来建立连接。通常使用TCP(Transmission Control Protocol)作为底层传输协议,并连接到SMTP服务器的25端口。

  2. 身份验证:在连接建立后,有些邮件服务器要求发件人提供身份验证信息。这可以是用户名和密码的组合,也可能是其他形式的身份验证。

  3. 邮件传输:一旦连接建立并且发件人通过了身份验证,SMTP 客户端开始向收件人的邮件服务器发送邮件。它包括发件人地址、收件人地址、邮件主题、邮件正文等信息。

  4. 邮件投递:收件人的邮件服务器接收到邮件后,根据收件人地址将邮件投递到相应的收件箱中。如果收件人地址不存在或邮件服务器无法投递,邮件服务器可能会向发件人返回一条错误消息。

  5. 连接关闭:邮件传输完成后,SMTP 客户端和服务器之间的连接会关闭。

IMAP

        全称是Internet Mail Access Protocol,即交互式邮件存取协议 互联网消息访问协议,是一种用于电子邮件的标准协议,它允许用户通过邮件客户端从邮件服务器上读取和管理电子邮件。

IMAP 协议的工作原理和POP3类似,不过有一个邮件同步的过程:邮件客户端可以请求从服务器上同步邮件。IMAP 不会像 POP3 那样将邮件从服务器上删除,而是保留在服务器上,客户端只是在需要时从服务器上下载邮件。因此,用户可以在多个设备上查看相同的邮件,并且对邮件的操作(如已读、已删除等)会在所有设备上同步。

IMAP和POP3有以下主要区别:

  1. 邮件存储位置

    • POP3:POP3 协议通常将邮件从邮件服务器上下载到本地设备,并在下载后将邮件从服务器上删除。因此,邮件通常只存储在一个设备上。
    • IMAP:IMAP 协议在邮件服务器上保留邮件的副本,而不会将邮件从服务器上删除。因此,用户可以在多个设备上访问相同的邮件,并且对邮件的操作会在所有设备上同步。
  2. 邮件访问方式

    • POP3:POP3 是一种离线协议,它将邮件从服务器上下载到本地设备,并在下载后与服务器断开连接。因此,用户只能在一个设备上访问邮件,而且邮件客户端通常只能下载邮件的副本而无法访问原始邮件。
    • IMAP:IMAP 是一种在线协议,它在邮件服务器上保留邮件的副本,并允许客户端随时访问服务器上的邮件。因此,用户可以在多个设备上访问邮件,并且对邮件的操作会在所有设备上同步。
  3. 邮件管理功能

    • POP3:POP3 提供了基本的邮件下载功能,但不支持邮件的在线管理。用户只能下载邮件到本地设备,而不能在服务器上执行邮件管理操作。
    • IMAP:IMAP 提供了丰富的邮件管理功能,包括创建、删除、移动邮件,以及设置邮件标记等。用户可以在多个设备上执行邮件管理操作,并且操作会在所有设备上同步。

二、java发送邮件

在 Java 中发送邮件通常涉及使用 JavaMail API。JavaMail API 提供了一组类和接口,用于构建邮件消息、连接邮件服务器、发送和接收邮件等操作。

JavaMail API

以下是JavaMail API 中一些常用的类和接口:

  1. javax.mail.Session:表示 JavaMail 的会话,负责配置邮件传输的属性,例如邮件服务器的地址、端口、身份验证信息等。

  2. javax.mail.Store:表示邮件存储器,用于连接到邮件服务器并访问用户的收件箱、发件箱等邮件存储。

  3. javax.mail.Folder:表示邮件文件夹,用于表示收件箱、发件箱、草稿箱等邮件文件夹,并提供了管理邮件文件夹中邮件的方法。

  4. javax.mail.Message:表示邮件消息,包含邮件的各种信息,如发件人、收件人、主题、内容等。

  5. javax.mail.internet.MimeMessage:MimeMessage 是 Message 接口的实现类,用于表示 MIME 格式的邮件消息。

  6. javax.mail.Transport:用于发送邮件消息到邮件服务器。

  7. javax.mail.internet.InternetAddress:表示电子邮件地址,用于表示邮件的发件人、收件人等地址信息。

  8. javax.mail.internet.MimeMultipart:表示多部分 MIME 消息,用于处理包含附件的邮件消息。

  9. javax.mail.internet.MimeBodyPart:表示 MIME 消息的一部分,可以是邮件的主体、附件等内容。

  10. javax.mail.Authenticator:用于身份验证的抽象类,可以用来提供用户名和密码给邮件服务器进行身份验证。

 JavaMail API 支持多种邮件协议,包括 SMTP、POP3、IMAP 等,因此可以与不同类型的邮件服务器进行通信。

简单示例

以下是一个简单的示例,演示如何使用 JavaMail API 发送电子邮件:

package com.gaotu.java.share.java2.learnMail;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.MimeMessageHelper;

@Slf4j
public class SendMail {
    // 发件人邮箱和密码
    private static final String from = "userName@example.com";
    private static final String password = "yourPassword";
    // 接收人邮箱地址
    private String to = "toName@example.com";
    public static Session getDefaultSession(){
        // 设置邮件属性
        Properties properties = new Properties();
        // SMTP 服务器地址
        properties.put("mail.smtp.host", "smtp-yourSmtpHost.com");
        // 启用 SMTP 服务器的身份验证
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.port",8080);       // SMTP 服务器端口
        properties.put("mail.smtp.encoding","utf-8");// 设置邮件内容的字符编码为 UTF-8
        // 获取 Session 对象
        Session session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(from, password);
            }
        });
        return session;
    }

    public static void sentTextMail(List<String> toList){
        try {
            // 创建 MimeMessage 对象
            MimeMessage message = new MimeMessage(getDefaultSession());
            // 设置发件人
            message.setFrom(new InternetAddress(from));
            // 设置收件人
            for (String to : toList){
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            }
            // 设置邮件主题
            message.setSubject("Text Email");
            // 设置邮件内容
            message.setText("This is a test email sent from Java.");
            // 发送邮件
            Transport.send(message);
            log.info("Email sent successfully!");
        } catch (Exception e) {
            log.info("error: {}",e);
            e.printStackTrace();
        }
    }
    public void sendHtmlMail(String to){
        try {
            // 创建 MimeMessage 对象
            MimeMessage message = new MimeMessage(getDefaultSession());
            // 设置发件人
            message.setFrom(new InternetAddress(from));
            // 设置收件人
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            // 设置邮件主题
            message.setSubject("Text Email");
            //邮件内容可是是html格式
            message.setContent("<html><body><h1>This is an HTML email</h1><p>Hello, World!</p></body></html>","text/html");
            // 发送邮件
            Transport.send(message);
            log.info("HTML Email sent successfully!");
        } catch (Exception e) {
            log.info("error: {}",e);
            e.printStackTrace();
        }
    }
    public static void sendFileMail(String to){

        try {
            // 创建 MimeMessage 对象
            MimeMessage message = new MimeMessage(getDefaultSession());
            // 设置发件人
            message.setFrom(new InternetAddress(from));
            // 设置收件人
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            // 设置邮件主题
            message.setSubject("Text Email");
            // 创建一个多部分消息 可以包含多种类型消息包括文本、附件、html
            Multipart multipart = new MimeMultipart();
            // 创建附件部分
            MimeBodyPart attachmentPart = new MimeBodyPart();
            attachmentPart.attachFile("/learnMail/text.txt"); // 替换为实际的附件路径
            // 将部分添加到多部分消息中
            multipart.addBodyPart(attachmentPart);
            // 将多部分消息设置为邮件内容
            message.setContent(multipart);
            Transport.send(message);
            log.info("attachment Email sent successfully!");
        }catch (Exception e){
            log.error("e-> {}",e);
        }
    }
    public static void main(String[] args) {
        List<String> to = Arrays.asList("test@example.com".split(","));
//        sentTextMail(to);
        sendFileMail("test@example.com");
    }
}

JavaMail API 的工作原理就是通过创建邮件会话、构建邮件消息、连接邮件服务器、发送邮件消息等步骤,实现了邮件的发送功能。使用 JavaMail API 发送邮件本质上就是 MUA(Mail User Agent,邮件用户代理)通过 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)协议将邮件发送到 MTA(Mail Transfer Agent,邮件传输代理)服务器。MUA 是邮件客户端软件,它负责创建、编辑和发送邮件;MTA 是邮件服务器软件,它负责接收、传输和投递邮件。

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值