修复 邮件监听在复杂邮件下无法识别主体内容

This commit is contained in:
wind 2023-09-19 16:04:14 +08:00
parent 2f5cbf6e5c
commit c1a4482797

View File

@ -5,13 +5,19 @@ import org.dromara.email.comm.config.MailImapConfig;
import org.dromara.email.comm.entity.MonitorMessage; import org.dromara.email.comm.entity.MonitorMessage;
import org.dromara.email.comm.errors.MailException; import org.dromara.email.comm.errors.MailException;
import javax.mail.BodyPart;
import javax.mail.Flags; import javax.mail.Flags;
import javax.mail.Folder; import javax.mail.Folder;
import javax.mail.Message; import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart; import javax.mail.Multipart;
import javax.mail.Session; import javax.mail.Session;
import javax.mail.Store; import javax.mail.Store;
import javax.mail.search.FlagTerm; import javax.mail.search.FlagTerm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties; import java.util.Properties;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -47,7 +53,7 @@ public class MonitorService{
private void startListening() { private void startListening() {
try { try {
Folder inbox = store.getFolder("Inbox"); Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY); inbox.open(Folder.READ_WRITE);
Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false)); Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
for (Message message : messages) { for (Message message : messages) {
MonitorMessage monitorMessage = new MonitorMessage(); MonitorMessage monitorMessage = new MonitorMessage();
@ -57,9 +63,25 @@ public class MonitorService{
monitorMessage.setTitle(message.getSubject()); monitorMessage.setTitle(message.getSubject());
// 获取邮件的内容 // 获取邮件的内容
if (message.isMimeType("text/plain")) { if (message.isMimeType("text/plain")) {
monitorMessage.setText(message.getContent().toString()); Object content = message.getContent();
if (content == null){
StringBuilder stringBuilder = getStringBuilder(message);
content = stringBuilder.toString();
}
monitorMessage.setText(content.toString());
} else if (message.isMimeType("multipart/*")) { } else if (message.isMimeType("multipart/*")) {
Multipart mp = (Multipart) message.getContent(); Multipart mp = (Multipart) message.getContent();
for (int i = 0; i < mp.getCount();i++){
BodyPart bodyPart = mp.getBodyPart(i);
String contentType = bodyPart.getContentType().toLowerCase();
if (contentType.startsWith("text/plain")) {
// 纯文本内容
monitorMessage.setText(bodyPart.getContent().toString());
} else if (contentType.startsWith("text/html")) {
// HTML内容
monitorMessage.setText(bodyPart.getContent().toString());
}
}
monitorMessage.setBody(mp); monitorMessage.setBody(mp);
} }
monitorMessage.setMessageIndex(message.getMessageNumber()); monitorMessage.setMessageIndex(message.getMessageNumber());
@ -75,6 +97,20 @@ public class MonitorService{
} }
} }
private static StringBuilder getStringBuilder(Message message) throws IOException, MessagingException {
InputStream inputStream = message.getInputStream();
// 解析输入流以获取内容
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
}
return stringBuilder;
}
public MonitorService start(){ public MonitorService start(){
Timer timer = new Timer(); Timer timer = new Timer();
this.timer = timer; this.timer = timer;