Base64编码图片邮件附件投递异常问题排查求助
问题分析与解决方案
你的问题和图片尺寸无关,核心是Multipart邮件的格式构造错误,不同邮件服务器对格式错误的容忍度不同,导致投递结果不稳定。
代码里的关键错误点:
- Boundary结构错误:在邮件头字段(Content-Type等)之后,需要先加一个空行(
\r\n)分隔头部和附件内容,而不是直接追加Boundary字符串。 - 多余的Boundary分隔符:附件内容结束后,直接使用
--boundary_text--即可,不需要额外加一行--boundary_text。 - 重复追加换行符:
sendCommand方法会给整个命令再追加\r\n,但你的buf里已经包含了正确的换行,这会导致多余的空行破坏邮件结构。
修正后的代码:
String base64EncodedImage = base64EncodeImage(sendMailRequestDTO.getFile()); int lineLength = 76; buf.delete(0, buf.length()) // 起始Boundary .append("--boundary_text\r\n") .append("Content-Type: image/png; name=\"image.png\"\r\n") .append("Content-Disposition: attachment; filename=\"image.png\"\r\n") .append("Content-Transfer-Encoding: base64\r\n") // 头部与内容之间必须加空行 .append("\r\n"); // 分块写入Base64内容 for (int i = 0; i < base64EncodedImage.length(); i += lineLength) { int end = Math.min(i + lineLength, base64EncodedImage.length()); buf.append(base64EncodedImage.substring(i, end)) .append("\r\n"); } // 结束Boundary buf.append("--boundary_text--\r\n"); // 注意:修改sendCommand,不再额外追加\r\n sendCommand(writer, buf.toString()); // 修正sendCommand方法 private static void sendCommand(BufferedWriter writer, String command) throws IOException { log.debug("command ::>> {}", command); writer.write(command); writer.flush(); } private static String base64EncodeImage(MultipartFile file) { try { byte[] imageBytes = file.getBytes(); return Base64.getEncoder().encodeToString(imageBytes); } catch (IOException e) { e.printStackTrace(); return ""; } }
补充说明:
- 建议使用
image/png作为Content-Type,比application/octet-stream更符合邮件规范,帮助邮件客户端正确识别附件类型。 - 去掉
sendCommand里额外的\r\n,因为你的buf已经构造了完整的符合SMTP规范的邮件内容,重复追加会导致格式错误。
内容的提问来源于stack exchange,提问作者오윤아
相关产品推荐
相关产品推荐

