feat:解码Base64邮件内容保存为可处理.eml文件
This commit is contained in:
parent
5c181d60b1
commit
2d840bcd8b
|
@ -1,9 +1,13 @@
|
||||||
package org.jeecg.common.email;
|
package org.jeecg.common.email;
|
||||||
|
|
||||||
|
import cn.hutool.core.codec.Base64;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.collection.ListUtil;
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.crypto.digest.MD5;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.sun.mail.imap.IMAPStore;
|
import com.sun.mail.imap.IMAPStore;
|
||||||
import com.sun.mail.smtp.SMTPAddressFailedException;
|
import com.sun.mail.smtp.SMTPAddressFailedException;
|
||||||
|
@ -31,8 +35,11 @@ import javax.mail.search.SearchTerm;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.zip.InflaterOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邮件服务管理器
|
* 邮件服务管理器
|
||||||
|
@ -125,13 +132,14 @@ public class EmailServiceManager {
|
||||||
properties.put("mail.store.protocol", "imap");
|
properties.put("mail.store.protocol", "imap");
|
||||||
properties.put("mail.imap.host", email.getEmailServerAddress());
|
properties.put("mail.imap.host", email.getEmailServerAddress());
|
||||||
properties.put("mail.imap.port",email.getPort());
|
properties.put("mail.imap.port",email.getPort());
|
||||||
if (email.getIsQiye() == 1) {
|
Integer isQiye = email.getIsQiye();
|
||||||
|
if (ObjectUtil.isNotNull(isQiye) && isQiye == 1) {
|
||||||
properties.put("mail.imap.ssl.enable", "true");
|
properties.put("mail.imap.ssl.enable", "true");
|
||||||
} else {
|
} else {
|
||||||
properties.put("mail.imap.ssl.enable", "false");
|
properties.put("mail.imap.ssl.enable", "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap IAM = new HashMap();
|
HashMap<String, String> IAM = new HashMap<>();
|
||||||
//带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。
|
//带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。
|
||||||
IAM.put("name","myname");
|
IAM.put("name","myname");
|
||||||
IAM.put("version","1.0.0");
|
IAM.put("version","1.0.0");
|
||||||
|
@ -530,10 +538,10 @@ public class EmailServiceManager {
|
||||||
final String from = address.substring(0,address.indexOf(StringConstant.AT));
|
final String from = address.substring(0,address.indexOf(StringConstant.AT));
|
||||||
//获取主题
|
//获取主题
|
||||||
subject = MimeUtility.decodeText(message.getSubject());
|
subject = MimeUtility.decodeText(message.getSubject());
|
||||||
if(subject.indexOf(StringConstant.SLASH) != -1){
|
if(subject.contains(StringConstant.SLASH)){
|
||||||
subject = StringUtils.replace(subject,StringConstant.SLASH,"");
|
subject = StringUtils.replace(subject,StringConstant.SLASH,"");
|
||||||
}
|
}
|
||||||
if(subject.indexOf(StringConstant.COLON) != -1){
|
if(subject.contains(StringConstant.COLON)){
|
||||||
subject = StringUtils.replace(subject,StringConstant.COLON,"");
|
subject = StringUtils.replace(subject,StringConstant.COLON,"");
|
||||||
}
|
}
|
||||||
receivedDate = message.getReceivedDate();
|
receivedDate = message.getReceivedDate();
|
||||||
|
@ -556,9 +564,36 @@ public class EmailServiceManager {
|
||||||
fileName.append(SAVE_EML_SUFFIX);
|
fileName.append(SAVE_EML_SUFFIX);
|
||||||
final String rootPath = spectrumPathProperties.getRootPath();
|
final String rootPath = spectrumPathProperties.getRootPath();
|
||||||
final String emlPath = spectrumPathProperties.getEmlPath();
|
final String emlPath = spectrumPathProperties.getEmlPath();
|
||||||
emlFile = new File(rootPath+emlPath+File.separator+fileName);
|
emlFile = new File(rootPath + emlPath + File.separator + fileName);
|
||||||
message.writeTo(new FileOutputStream(emlFile));
|
/* 如果邮件内容经过Base64编码 需要解码后再生成.eml文件 否则直接生成.eml文件 */
|
||||||
|
List<String> specified = ListUtil.toList("");
|
||||||
|
if (CollUtil.contains(specified, from)){ // 来自指定邮箱 此邮箱对邮件内容进行了Base64编码
|
||||||
|
// 先将未解码的内容保存为.eml文件
|
||||||
|
FileUtil.writeFromStream(message.getInputStream(), emlFile);
|
||||||
|
// 对正文内容进行解码
|
||||||
|
String content = (String) message.getContent();
|
||||||
|
// String content = FileUtil.readUtf8String(emlFile);
|
||||||
|
List<String> contents = ListUtil.toList(StrUtil.split(content, '|', 2));
|
||||||
|
String md5 = contents.get(0);
|
||||||
|
content = contents.get(1);
|
||||||
|
if (StrUtil.isBlank(content)) return emlFile;
|
||||||
|
content = StrUtil.cleanBlank(content);
|
||||||
|
String md5Verified = MD5.create().digestHex(content);
|
||||||
|
// 如果md5验证失败 则不进行解码
|
||||||
|
if (!StrUtil.equals(md5, md5Verified)) return emlFile;
|
||||||
|
contents = ListUtil.toList(StrUtil.split(content, "|"));
|
||||||
|
String base64 = contents.get(contents.size() - 1);
|
||||||
|
// 解码Base64字符串 并用解码后的内容覆盖未解码内容
|
||||||
|
byte[] data = Base64.decode(base64);
|
||||||
|
try (OutputStream out = Files.newOutputStream(emlFile.toPath());
|
||||||
|
InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(out)) {
|
||||||
|
inflaterOutputStream.write(data);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Create the base64 decoded file[{}] error: {}", emlFile.getAbsolutePath(), e.getMessage());
|
||||||
|
}
|
||||||
|
} else { // 直接生成.eml文件
|
||||||
|
message.writeTo(Files.newOutputStream(emlFile.toPath()));
|
||||||
|
}
|
||||||
// int bufferSize = 1024 * 1024; // 1M
|
// int bufferSize = 1024 * 1024; // 1M
|
||||||
// InputStream inputStream = message.getInputStream();
|
// InputStream inputStream = message.getInputStream();
|
||||||
// BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, bufferSize);
|
// BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, bufferSize);
|
||||||
|
@ -582,7 +617,7 @@ public class EmailServiceManager {
|
||||||
log.error(errorMsg);
|
log.error(errorMsg);
|
||||||
throw new DownloadEmailException(errorMsg);
|
throw new DownloadEmailException(errorMsg);
|
||||||
}catch (Exception e) {
|
}catch (Exception e) {
|
||||||
log.error("",e);
|
log.error("The email download failed: {}", e.getMessage());
|
||||||
}finally {
|
}finally {
|
||||||
EmailLogEvent event = new EmailLogEvent(batchesCounter,Thread.currentThread().getId(),EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETIDEML,subject,DateUtils.formatDate(receivedDate,"yyyy-MM-dd HH:mm:ss:SSS"),
|
EmailLogEvent event = new EmailLogEvent(batchesCounter,Thread.currentThread().getId(),EmailLogManager.GS_TYPE_GET,status,EmailLogManager.GETIDEML,subject,DateUtils.formatDate(receivedDate,"yyyy-MM-dd HH:mm:ss:SSS"),
|
||||||
(Objects.isNull(emlFile)?" ":emlFile.getAbsolutePath()));
|
(Objects.isNull(emlFile)?" ":emlFile.getAbsolutePath()));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user