支持附件以链接的形式发送

This commit is contained in:
2025-07-16 16:05:08 +08:00
parent 2b92610ba4
commit 2ca2993613
2 changed files with 110 additions and 62 deletions

View File

@@ -31,6 +31,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;
import com.ruoyi.oa.mapper.OaFurnitureTableMapper;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@@ -141,87 +143,106 @@ public class OaEmailAccountServiceImpl implements IOaEmailAccountService {
if (account == null) {
return "发件人邮箱账号不存在";
}
// 通过furnitureIds查找所有邮箱
List<String> emailList = oaFurnitureTableMapper.selectEmailsByFurnitureIds(request.getFurnitureIds());
int type = account.getType() == null ? -1 : account.getType().intValue();
int success = 0, fail = 0;
StringBuilder failList = new StringBuilder();
if (type == 0 || type == 1) {
// 网易/QQ邮箱 SMTP方式
for (String to : emailList) {
try {
boolean isHtml = request.getContent() != null &&
(request.getContent().contains("<html") ||
request.getContent().contains("<div") ||
request.getContent().contains("<p>"));
boolean hasAttachments = request.getAttachmentPaths() != null && !request.getAttachmentPaths().isEmpty();
boolean hasInlineImages = request.getInlineImagePaths() != null && !request.getInlineImagePaths().isEmpty();
if (hasAttachments && hasInlineImages) {
if (isHtml) {
String processedContent = emailUtil.processHtmlWithInlineImages(request.getContent(), request.getInlineImagePaths());
emailUtil.sendHtmlMailWithAttachmentsAndDynamicConfig(account, to, request.getSubject(), processedContent, request.getAttachmentPaths());
} else {
emailUtil.sendMailWithAttachmentAndDynamicConfig(account, to, request.getSubject(), request.getContent(), request.getAttachmentPaths().get(0));
}
} else if (hasAttachments) {
if (isHtml) {
emailUtil.sendHtmlMailWithAttachmentsAndDynamicConfig(account, to, request.getSubject(), request.getContent(), request.getAttachmentPaths());
} else {
emailUtil.sendMailWithAttachmentAndDynamicConfig(account, to, request.getSubject(), request.getContent(), request.getAttachmentPaths().get(0));
}
} else if (hasInlineImages) {
if (isHtml) {
emailUtil.sendHtmlMailWithInlineImagesAndDynamicConfig(account, to, request.getSubject(), request.getContent(), request.getInlineImagePaths());
} else {
emailUtil.sendMailWithDynamicConfig(account, to, request.getSubject(), request.getContent());
}
// 处理附件如果是http/https链接先下载
List<File> attachmentFiles = new ArrayList<>();
try {
if (request.getAttachmentPaths() != null && !request.getAttachmentPaths().isEmpty()) {
for (String path : request.getAttachmentPaths()) {
if (path.startsWith("http://") || path.startsWith("https://")) {
attachmentFiles.add(EmailUtil.downloadUrlToTempFile(path));
} else {
if (isHtml) {
emailUtil.sendHtmlMailWithDynamicConfig(account, to, request.getSubject(), request.getContent());
} else {
emailUtil.sendMailWithDynamicConfig(account, to, request.getSubject(), request.getContent());
}
attachmentFiles.add(new File(path));
}
success++;
} catch (Exception e) {
fail++;
failList.append(to).append(", ");
}
}
} else if (type == 2) {
for (String to : emailList) {
try {
boolean result = sendAliyunMail(account, to, request.getSubject(), request.getContent());
if (result) {
if (type == 0 || type == 1) {
for (String to : emailList) {
try {
boolean isHtml = request.getContent() != null &&
(request.getContent().contains("<html") ||
request.getContent().contains("<div") ||
request.getContent().contains("<p>"));
boolean hasAttachments = !attachmentFiles.isEmpty();
boolean hasInlineImages = request.getInlineImagePaths() != null && !request.getInlineImagePaths().isEmpty();
if (hasAttachments && hasInlineImages) {
if (isHtml) {
String processedContent = emailUtil.processHtmlWithInlineImages(request.getContent(), request.getInlineImagePaths());
emailUtil.sendHtmlMailWithAttachmentsAndDynamicConfig(account, to, request.getSubject(), processedContent, toPathList(attachmentFiles));
} else {
emailUtil.sendMailWithAttachmentAndDynamicConfig(account, to, request.getSubject(), request.getContent(), attachmentFiles.get(0).getAbsolutePath());
}
} else if (hasAttachments) {
if (isHtml) {
emailUtil.sendHtmlMailWithAttachmentsAndDynamicConfig(account, to, request.getSubject(), request.getContent(), toPathList(attachmentFiles));
} else {
emailUtil.sendMailWithAttachmentAndDynamicConfig(account, to, request.getSubject(), request.getContent(), attachmentFiles.get(0).getAbsolutePath());
}
} else if (hasInlineImages) {
if (isHtml) {
emailUtil.sendHtmlMailWithInlineImagesAndDynamicConfig(account, to, request.getSubject(), request.getContent(), request.getInlineImagePaths());
} else {
emailUtil.sendMailWithDynamicConfig(account, to, request.getSubject(), request.getContent());
}
} else {
if (isHtml) {
emailUtil.sendHtmlMailWithDynamicConfig(account, to, request.getSubject(), request.getContent());
} else {
emailUtil.sendMailWithDynamicConfig(account, to, request.getSubject(), request.getContent());
}
}
success++;
} else {
} catch (Exception e) {
fail++;
failList.append(to).append(", ");
}
} catch (Exception e) {
fail++;
failList.append(to).append(", ");
}
}
} else if (type == 3) {
for (String to : emailList) {
try {
boolean result = sendFeishuMail(account, to, request.getSubject(), request.getContent());
if (result) {
success++;
} else {
} else if (type == 2) {
for (String to : emailList) {
try {
boolean result = sendAliyunMail(account, to, request.getSubject(), request.getContent());
if (result) {
success++;
} else {
fail++;
failList.append(to).append(", ");
}
} catch (Exception e) {
fail++;
failList.append(to).append(", ");
}
} catch (Exception e) {
fail++;
failList.append(to).append(", ");
}
} else if (type == 3) {
for (String to : emailList) {
try {
boolean result = sendFeishuMail(account, to, request.getSubject(), request.getContent());
if (result) {
success++;
} else {
fail++;
failList.append(to).append(", ");
}
} catch (Exception e) {
fail++;
failList.append(to).append(", ");
}
}
} else {
return "不支持的邮箱类型";
}
} catch (Exception e) {
return "附件处理失败:" + e.getMessage();
} finally {
// 删除所有临时文件
for (File file : attachmentFiles) {
if (file != null && file.exists() && file.getName().startsWith("mail_attach_")) {
file.delete();
}
}
} else {
return "不支持的邮箱类型";
}
// 邮件发送逻辑结束后统计success>0时批量更新所有furnitureId
if (success > 0 && request.getFurnitureIds() != null) {
for (Long furnitureId : request.getFurnitureIds()) {
oaFurnitureTableMapper.updateEmailSendInfo(furnitureId);
@@ -229,6 +250,15 @@ public class OaEmailAccountServiceImpl implements IOaEmailAccountService {
}
return "发送成功" + success + "封,失败" + fail + "" + (fail > 0 ? (",失败邮箱:" + failList) : "");
}
// 辅助方法File列表转路径列表
private List<String> toPathList(List<File> files) {
List<String> paths = new ArrayList<>();
for (File f : files) {
if (f != null) paths.add(f.getAbsolutePath());
}
return paths;
}
private boolean sendAliyunMail(OaEmailAccount account, String to, String subject, String content) {
try {
DefaultProfile profile = DefaultProfile.getProfile(

View File

@@ -355,4 +355,22 @@ public class EmailUtil {
return processedHtml;
}
/**
* 下载网络文件到本地临时文件
* @param url 文件的http/https链接
* @return 本地临时文件
*/
public static File downloadUrlToTempFile(String url) throws Exception {
File tempFile = File.createTempFile("mail_attach_", null);
try (java.io.InputStream in = new java.net.URL(url).openStream();
java.io.OutputStream out = new java.io.FileOutputStream(tempFile)) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
return tempFile;
}
}