Java电子邮件处理开发指南
立即解锁
发布时间: 2025-08-18 02:37:47 阅读量: 4 订阅数: 12 

Java核心技术与实战指南
### Java 电子邮件处理开发指南
#### 1. 引言
在当今数字化的时代,电子邮件已经成为人们日常沟通和业务交流的重要工具。对于 Java 开发者来说,如何在 Java 程序中实现电子邮件的读取和发送功能是一个常见的需求。本文将详细介绍如何使用 JavaMail API 来实现这些功能,包括读取邮件、构建邮件阅读器和邮件客户端等。
#### 2. 读取邮件的问题与解决方案
在 Java 中读取邮件时,我们可能会遇到一些问题,例如如何连接到邮件服务器、如何获取邮件列表以及如何显示邮件内容等。为了解决这些问题,我们可以使用 JavaMail API 中的 Store 类。
##### 2.1 使用 JavaMail Store 读取邮件的步骤
以下是使用 Store 读取邮件的基本步骤:
1. **获取 Session 对象**:使用 `Session.getDefaultInstance()` 方法获取一个 Session 对象,并可以传递 `System.getProperties()` 作为 Properties 参数。
```java
Session session = Session.getDefaultInstance(System.getProperties(), null);
session.setDebug(false);
```
2. **从 Session 对象获取 Store**:根据指定的协议从 Session 对象中获取一个 Store 对象。
```java
Store store = session.getStore(protocol);
store.connect(host, user, password);
```
3. **获取根 Folder**:根据根文件夹的名称获取相应的 Folder 对象。
```java
Folder rf;
if (root.length() != 0) {
System.out.println("Getting folder " + root + ".");
rf = store.getFolder(root);
} else {
System.out.println("Getting default folder.");
rf = store.getDefaultFolder();
}
rf.open(Folder.READ_WRITE);
```
4. **列出子文件夹(如果有)**:如果根文件夹可以包含子文件夹,则列出这些子文件夹。
```java
if (rf.getType() == Folder.HOLDS_FOLDERS) {
Folder[] f = rf.list();
for (int i = 0; i < f.length; i++)
listFolder(f[i], "", recursive);
} else
listFolder(rf, "", false);
```
5. **获取邮件消息**:对于每个可以包含邮件消息的文件夹,调用 `getMessages()` 方法获取邮件消息数组。
```java
Message[] msgs = folder.getMessages();
```
6. **处理邮件消息**:通常,我们会显示邮件的头部信息,并让用户选择要查看的邮件。
```java
for (int i = 0; i < msgs.length; i++) {
Message m = msgs[i];
Address from = m.getFrom()[0];
String fromAddress;
if (from instanceof InternetAddress)
fromAddress = ((InternetAddress)from).getAddress();
else
fromAddress = from.toString();
StringBuffer sb = new StringBuffer();
fromFmt.format(fromAddress, sb, null);
sb.append(" ");
subjFmt.format(m.getSubject(), sb, null);
System.out.println(sb.toString());
}
```
##### 2.2 示例代码:MailLister.java
以下是一个完整的示例代码,用于列出指定邮箱中的所有邮件:
```java
import com.darwinsys.util.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
/**
* List all available folders.
*/
public class MailLister {
static StringAlign fromFmt =
new StringAlign(20, StringAlign.JUST_LEFT);
static StringAlign subjFmt =
new StringAlign(40, StringAlign.JUST_LEFT);
public static void main(String[] argv) throws Exception {
String fileName = MailConstants.PROPS_FILE_NAME;
String protocol = null;
String host = null;
String user = null;
String password = null;
String root = null;
// If argc == 1, assume it's a Properties file.
if (argv.length == 1) {
fileName = argv[0];
FileProperties fp = new FileProperties(fileName);
fp.load();
protocol = fp.getProperty(MailConstants.RECV_PROTO);
host = fp.getProperty(MailConstants.RECV_HOST);
user = fp.getProperty(MailConstants.RECV_USER);
password = fp.getProperty(MailConstants.RECV_PASS);
root = fp.getProperty(MailConstants.RECV_ROOT);
}
// If not, assume listing all args in long form.
else if (argv.length == 5) {
protocol = argv[0];
host = argv[1];
user = argv[2];
password = argv[3];
root = argv[4];
}
// Otherwise give up.
else {
System.err.println(
"Usage: MailLister protocol host user pw root");
System.exit(0);
}
boolean recursive = false;
// Start with a Session object, as usual
Session session = Session.getDefaultInstance(
System.getProperties(), null);
session.setDebug(false);
// Get a Store object for the given protocol
Store store = session.getStore(protocol);
store.connect(host, user, password);
// Get Folder object for root, and list it
// If root name = "", getDefaultFolder( ), else getFolder(root)
Folder rf;
if (root.length() != 0) {
System.out.println("Getting folder " + root + ".");
rf = store.getFolder(root);
} else {
System.out.println("Getting default folder.");
rf = store.getDefaultFolder();
}
rf.open(Folder.READ_WRITE);
if (rf.getType() == Folder.HOLDS_FOLDERS) {
Folder[] f = rf.list();
for (int i = 0; i < f.length; i++)
listFolder(f[i], "", recursive);
} else
listFolder(rf, "", false);
}
static void listFolder(Folder folder, String tab, boolean recurse)
throws Exception {
folder.open(Folder.READ_WRITE);
System.out.println(tab + "Name: " + folder.getName() + '(' +
folder.getFullName() + ')');
if (!folder.isSubscribed())
System.out.println(tab + "Not Subscribed");
if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) {
if (folder.hasNewMessages())
System.out.println(tab + "Has New Messages");
else
System.out.println(tab + "No New Messages");
Message[] msgs = folder.getMessages();
for (int i = 0; i < msgs.length; i++) {
Message m = msgs[i];
Address from = m.getFrom()[0];
String fromAddress;
if (from instanceof InternetAddress)
fromAddress = ((InternetAddress)from).getAddress();
else
fromAddress = from.toString();
StringBuffer sb = new StringBuffer();
fromFmt.format(fromAddress, sb, null);
sb.append(" ");
subjFmt.format(m.getSubject(), sb, null);
System.out.println(sb.toString());
}
}
if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0) {
System.out.println(tab + "Is Directory");
if (recurse) {
Folder[] f = folder.list();
for (int i = 0; i < f.length; i++)
listFolder(f[i], tab + "", recurse);
}
}
}
}
```
#### 3. 构建邮件阅读器
为了更方便地查看邮件,我们可以构建一个邮件阅读器。以下是一个使用 Swing GUI 组件和 JavaMail API 构建的邮件阅读器示例:
##### 3.1 MailReaderBean.java
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.mail.*;
import javax.mail.internet.*;
/**
* Display a mailbox or mailboxes.
* This is the generic version in javasrc/email, split off from
* JabaDex because of the latter's domain-specific "implements module" stuff.
*/
public class MailReaderBean extends JSplitPane {
private JTextArea bodyText;
/* Construct a mail reader bean with all defaults. */
public MailReaderBean() throws Exception {
this("smtp", "mailhost", "user", "nopasswd", "/");
}
/* Construct a mail reader bean with all values. */
public MailReaderBean(
String protocol,
String host,
String user,
String password,
String rootName)
throws Exception {
super(VERTICAL_SPLIT);
boolean recursive = false;
// Start with a Mail Session object
Session session = Session.getDefaultInstance(
System.getProperties(), null);
session.setDebug(false);
// Get a Store object for the given protocol
Store store = session.getStore(protocol);
store.connect(host, user, password);
// Get Folder object for root, and list it
// If root name = "", getDefaultFolder( ), else getFolder(root)
FolderNode top;
if (rootName.length() != 0) {
// System.out.println("Getting folder " + rootName + ".");
top = new FolderNode(store.getFolder(rootName));
} else {
// System.out.println("Getting default folder.");
top = new FolderNode(store.getDefaultFolder());
}
if (top == null || !top.f.exists()) {
System.out.println("Invalid folder " + rootName);
return;
}
if (top.f.getType() == Folder.HOLDS_FOLDERS) {
Folder[] f = top.f.list();
for (int i = 0; i < f.length; i++)
listFolder(top, new FolderNode(f[i]), recursive);
} else
listFolder(top, top, false);
// Now that (all) the foldernodes and treenodes are in,
// construct a JTree object from the top of the list down,
// make the JTree scrollable (put in JScrollPane),
// and add it as the MailComposeBean's Northern child.
JTree tree = new JTree(top);
JScrollPane treeScroller = new JScrollPane(tree);
treeScroller.setBackground(tree.getBackground());
this.setTopComponent(treeScroller);
// The Southern (Bottom) child is a textarea to display the msg.
bodyText = new JTextArea(15, 80);
this.setBottomComponent(new JScrollPane(bodyText));
// Add a notification listener for the tree; this will
// display the cli
```
0
0
复制全文


