如何閱讀郵件正文內的文本
一、簡介
在本教程中,我們將探討如何使用 Java 讀取電子郵件正文中的文字。我們將使用 JavaMail API 連接到電子郵件伺服器、檢索電子郵件並讀取電子郵件正文中的文字。
2. 設定
在開始之前,我們需要將jakarta.mail
依賴項新增到pom.xml
檔案中:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail-api</artifactId>
<version>2.0.1</version>
</dependency>
JavaMail API 是一組類別和接口,它們提供了用 Java 讀取和發送電子郵件的框架。該庫允許我們處理與電子郵件相關的任務,例如連接到電子郵件伺服器和閱讀電子郵件內容。
3. 連接電子郵件伺服器
要連接到電子郵件伺服器,我們需要建立一個Session
對象,它充當我們應用程式的郵件會話。此會話使用Store
物件建立與電子郵件伺服器的連線。
以下是我們如何設定 JavaMail API 並連接到電子郵件伺服器:
// Set up the JavaMail API
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your_email", "your_password");
}
});
// Connect to the email server
try (Store store = session.getStore("imaps")){
store.connect("imap.gmail.com", "your_email", "your_password");
// ...
} catch (MessagingException e) {
// handle exception
}
首先,我們使用有關 SMTP 伺服器的詳細資訊來設定郵件會話的屬性,包括主機、連接埠、驗證和 TLS 設定。然後,我們使用這些屬性建立一個Session
物件以及一個提供用於身份驗證的電子郵件地址和密碼的Authenticator
物件。
Authenticator
物件用於向電子郵件伺服器進行身份驗證,並傳回包含電子郵件地址和密碼的PasswordAuthentication
物件。一旦我們有了Session
對象,我們就可以使用它透過getStore()
方法連接到電子郵件伺服器,該方法傳回一個Store
對象。我們使用try
-with-resources 來管理Store
物件。這可以確保store
在我們使用完後自動關閉。
4.檢索電子郵件
成功連接到電子郵件伺服器後,下一步是從收件匣檢索電子郵件。這涉及使用Folder
類別存取inbox
資料夾,然後取得其中包含的電子郵件。
以下是我們從inbox
資料夾中檢索電子郵件的方法:
//... (same code as above to connect to email server)
// Open the inbox folder
try (Folder inbox = store.getFolder("inbox")){
inbox.open(Folder.READ_ONLY);
// Retrieve emails from the inbox
Message[] messages = inbox.getMessages();
} catch (MessagingException e) {
// handle exception
}
我們使用Store
物件來取得代表收件匣的Folder
實例。 getFolder(“inbox”)
方法存取收件匣資料夾。然後,我們使用Folder.READ_ONLY
以唯讀模式開啟此資料夾,這允許我們在不進行任何變更的情況下閱讀電子郵件。
getMessages()
方法取得收件匣資料夾中的所有訊息。這些訊息儲存在Message
物件數組中。
5.閱讀電子郵件內容
一旦我們有了message
物件數組,我們就可以迭代它們來存取每封電子郵件。要讀取每封電子郵件的內容,我們需要使用Message
類及其相關類,例如Multipart
和BodyPart
。
以下是如何閱讀電子郵件內容的範例:
void retrieveEmails() throws MessagingException {
// ... connection and open inbox folder
for (Message message : messages) {
try {
Object content = message.getContent();
if (content instanceof Multipart) {
Multipart multipart = (Multipart) content;
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if (bodyPart.getContentType().toLowerCase().startsWith("text/plain")) {
plainContent = (String) bodyPart.getContent();
} else if (bodyPart.getContentType().toLowerCase().startsWith("text/html")) {
// handle HTML content
} else {
// handle attachement
}
}
} else {
plainContent = (String) content;
}
} catch (IOException | MessagingException e) {
// handle exception
}
}
}
在此範例中,我們迭代數組中的每個Message
物件並使用etContent()
方法來取得其內容。此方法傳回一個Object
,它可以是純文字的String
,也可以是包含多個部分的電子郵件的Multipart
。
如果內容是String
的實例,則表示電子郵件是純文字格式。我們可以簡單地將內容轉換為String.
否則,
如果內容是一個Multipart
對象,我們需要單獨處理每個部分。我們使用getCount()
方法來迭代各個部分並相應地處理它們。
對於Multipart
中的每個BodyPart
,我們使用getContentType()
方法檢查其內容類型。如果正文部分是文字部分,我們使用getContent()
方法來取得其內容並檢查它是純文字還是 HTML 內容。然後我們就可以對文字內容進行對應的處理。否則,我們將其作為附件文件處理。
6. 處理 HTML 內容
除了純文字和附件之外,電子郵件正文還可以包含 HTML 內容。為了處理 HTML 內容,我們可以使用 Jsoup 等函式庫來解析 HTML 並提取文字內容。
以下是如何使用 Jsoup 處理 HTML 內容的範例:
try (InputStream inputStream = bodyPart.getInputStream()) {
String htmlContent = new String(inputStream.readAllBytes(), "UTF-8");
Document doc = Jsoup.parse(htmlContent);
htmlContent = doc.text();
} catch (IOException e) {
// Handle exception
}
在這個例子中,我們使用Jsoup來解析HTML內容並提取文字內容。然後我們根據需要處理文字內容。
7. 嵌套MultiPart
在 JavaMail 中,一個Multipart
物件可以包含另一個Multipart
對象,稱為嵌套多部分訊息。為了處理這種情況,我們需要使用遞歸。這種方法允許我們遍歷整個巢狀結構並從每個部分提取文字內容。
首先,我們建立一個方法來取得Message
物件的內容:
String extractTextContent(Message message) throws MessagingException, IOException {
Object content = message.getContent();
return getTextFromMessage(content);
}
接下來,我們建立一個方法來處理content
物件。如果內容是Multipart
,我們會迭代每個BodyPart
並遞歸地從每個部分中提取內容。否則,如果content
是純文本,我們直接將文本附加到StringBuilder
:
String getTextFromMessage(Object content) throws MessagingException, IOException {
if (content instanceof Multipart) {
Multipart multipart = (Multipart) content;
StringBuilder text = new StringBuilder();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
text.append(getTextFromMessage(bodyPart.getContent()));
}
return text.toString();
} else if (content instanceof String) {
return (String) content;
}
return "";
}
8. 測試
在本節中,我們透過發送包含三部分的電子郵件來測試retrieveEmails()
方法:純文字內容和HTML內容:
在測試方法中,我們會擷取電子郵件並驗證是否正確讀取並從電子郵件中提取純文字內容和 HTML 內容:
EmailService es = new EmailService(session);
es.retrieveEmails();
assertEquals("This is a text body", es.getPlainContent());
assertEquals("This is an HTML body", es.getHTMLContent());
9. 結論
在本教程中,我們學習如何使用 Java 讀取電子郵件正文中的文字。我們討論了設定 JavaMail API、連接到電子郵件伺服器以及提取電子郵件內容。
與往常一樣,範例的原始程式碼可 在 GitHub 上取得。