You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Base64编码图片邮件附件投递异常问题排查求助

问题分析与解决方案

你的问题和图片尺寸无关,核心是Multipart邮件的格式构造错误,不同邮件服务器对格式错误的容忍度不同,导致投递结果不稳定。

代码里的关键错误点:

  1. Boundary结构错误:在邮件头字段(Content-Type等)之后,需要先加一个空行(\r\n)分隔头部和附件内容,而不是直接追加Boundary字符串。
  2. 多余的Boundary分隔符:附件内容结束后,直接使用--boundary_text--即可,不需要额外加一行--boundary_text。
  3. 重复追加换行符: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,提问作者오윤아

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:52:48