阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

接收Email

258次阅读
没有评论

共计 2936 个字符,预计需要花费 8 分钟才能阅读完成。

发送 Email 的过程我们在上一节已经讲过了,客户端总是通过 SMTP 协议把邮件发送给 MTA。

接收 Email 则相反,因为邮件最终到达收件人的 MDA 服务器,所以,接收邮件是收件人用自己的客户端把邮件从 MDA 服务器上抓取到本地的过程。

接收邮件使用最广泛的协议是 POP3:Post Office Protocol version 3,它也是一个建立在 TCP 连接之上的协议。POP3 服务器的标准端口是110,如果整个会话需要加密,那么使用加密端口995

另一种接收邮件的协议是 IMAP:Internet Mail Access Protocol,它使用标准端口 143 和加密端口993。IMAP 和 POP3 的主要区别是,IMAP 协议在本地的所有操作都会自动同步到服务器上,并且,IMAP 可以允许用户在邮件服务器的收件箱中创建文件夹。

JavaMail 也提供了 IMAP 协议的支持。因为 POP3 和 IMAP 的使用方式非常类似,这里我们只介绍 POP3 的用法。

使用 POP3 收取 Email 时,我们无需关心 POP3 协议底层,因为 JavaMail 提供了高层接口。首先需要连接到 Store 对象:

// 准备登录信息:
String host = "pop3.example.com";
int port = 995;
String username = "[email protected]";
String password = "password";

Properties props = new Properties();
props.setProperty("mail.store.protocol", "pop3"); // 协议名称
props.setProperty("mail.pop3.host", host);// POP3 主机名
props.setProperty("mail.pop3.port", String.valueOf(port)); // 端口号
// 启动 SSL:
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.port", String.valueOf(port));

// 连接到 Store:
URLName url = new URLName("pop3", host, post, "", username, password);
Session session = Session.getInstance(props, null);
session.setDebug(true); // 显示调试信息
Store store = new POP3SSLStore(session, url);
store.connect();

一个 Store 对象表示整个邮箱的存储,要收取邮件,我们需要通过 Store 访问指定的 Folder(文件夹),通常是INBOX 表示收件箱:

// 获取收件箱:
Folder folder = store.getFolder("INBOX");
// 以读写方式打开:
folder.open(Folder.READ_WRITE);
// 打印邮件总数 / 新邮件数量 / 未读数量 / 已删除数量:
System.out.println("Total messages:" + folder.getMessageCount());
System.out.println("New messages:" + folder.getNewMessageCount());
System.out.println("Unread messages:" + folder.getUnreadMessageCount());
System.out.println("Deleted messages:" + folder.getDeletedMessageCount());
// 获取每一封邮件:
Message[] messages = folder.getMessages();
for (Message message : messages) {// 打印每一封邮件:
    printMessage((MimeMessage) message);
}

当我们获取到一个 Message 对象时,可以强制转型为 MimeMessage,然后打印出邮件主题、发件人、收件人等信息:

void printMessage(MimeMessage msg) throws IOException, MessagingException {// 邮件主题:
    System.out.println("Subject:" + MimeUtility.decodeText(msg.getSubject()));
    // 发件人:
    Address[] froms = msg.getFrom();
    InternetAddress address = (InternetAddress) froms[0];
    String personal = address.getPersonal();
    String from = personal == null ? address.getAddress() : (MimeUtility.decodeText(personal) + "<" + address.getAddress() + ">");
    System.out.println("From:" + from);
    // 继续打印收件人:
    ...
}

比较麻烦的是获取邮件的正文。一个 MimeMessage 对象也是一个 Part 对象,它可能只包含一个文本,也可能是一个 Multipart 对象,即由几个 Part 构成,因此,需要递归地解析出完整的正文:

String getBody(Part part) throws MessagingException, IOException {if (part.isMimeType("text/*")) {// Part 是文本:
        return part.getContent().toString();
    }
    if (part.isMimeType("multipart/*")) {// Part 是一个 Multipart 对象:
        Multipart multipart = (Multipart) part.getContent();
        // 循环解析每个子 Part:
        for (int i = 0; i < multipart.getCount(); i++) {BodyPart bodyPart = multipart.getBodyPart(i);
            String body = getBody(bodyPart);
            if (!body.isEmpty()) {return body;
            }
        }
    }
    return "";
}

最后记得关闭 FolderStore

folder.close(true); // 传入 true 表示删除操作会同步到服务器上(即删除服务器收件箱的邮件)
store.close();

练习

使用 POP3 接收邮件。

下载练习

小结

使用 Java 接收 Email 时,可以用 POP3 协议或 IMAP 协议。

使用 POP3 协议时,需要用 Maven 引入 JavaMail 依赖,并确定 POP3 服务器的域名/端口/是否使用 SSL 等,然后,调用相关 API 接收 Email。

设置 debug 模式可以查看通信详细内容,便于排查错误。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计2936字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7817906
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
这个开源软件130k的star数!让电脑轻松管理安卓手机的神器

这个开源软件130k的star数!让电脑轻松管理安卓手机的神器

这个开源软件 130k 的 star 数!让电脑轻松管理安卓手机的神器 大家好,我是星哥。今天给大家安利一款宝...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...