如何在JAVA中通过Mailjet发送附件

时间:2019-12-27 06:18:15

标签: java spring-boot mailjet

我想通过Java中的Mailjet发送带有附件的邮件。发送没有附件的简单邮件时我没有问题,但是当我尝试添加附件时出现此错误:

400
[{"ErrorIdentifier":"314408e7-e528-469f-9361-2eb3c24b2b32","ErrorCode":"mj-0004","ErrorRelatedTo":["Messages.Attachments"],"ErrorMessage":"Type mismatch. Expected type \"Attachments\".","StatusCode":400}]

我的代码如下:

@Service
public class MailJetSenderImp implements MailJetSender {

    Message message = new Message();

    @Override
    public ResponseEntity<Message> sendMail(String To, String Body, String Subject, File attachment) throws MailjetSocketTimeoutException, JSONException, IOException {

        FileInputStream fileInputStream = new FileInputStream(attachment);
        int byteLength=(int) attachment.length(); //bytecount of the file-content
        byte[] filecontent = new byte[byteLength];
        fileInputStream.read(filecontent,0,byteLength);
        byte[] encoded = Base64.getEncoder().encode(filecontent);


        MailjetRequest email = new MailjetRequest(Emailv31.resource)

                .property(Emailv31.MESSAGES, new JSONArray()
                        .put(new JSONObject()
                                .put(Emailv31.Message.FROM, new JSONObject()
                                        .put("Email","xxxxxx@gmail.com" )
                                        .put("Name", "xxxxx"))
                                .put(Emailv31.Message.TO, new JSONArray()
                                        .put(new JSONObject()
                                                .put("Email", To)))
                                .put(Emailv31.Message.SUBJECT, Subject)
                                .put(Emailv31.Message.TEXTPART, "")
                                .put(Emailv31.Message.HTMLPART, Body)
                                    .put(Emailv31.Message.ATTACHMENTS,encoded)));

        final String mailjetApiKey = "xxxxxxxx";
        final String mailjetSecretKey = "yyyyyyyy";

        MailjetClient client = new MailjetClient(
                mailjetApiKey, mailjetSecretKey, new ClientOptions("v3.1"));


        try {
            // trigger the API call
            MailjetResponse response = client.post(email);
            // Read the response data and status
            System.out.println(response.getStatus());
            System.out.println(response.getData());
            message.setCode(response.getStatus());
            message.setMessage(response.getData().toString());
            return ResponseEntity.status(HttpStatus.OK).body(message);
        } catch (MailjetException e) {
            System.out.println("Mailjet Exception: " + e);
            message.setCode(400);
            message.setMessage("could not send email");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message);

        }
    }
}

我在(.put(Emailv31.Message.ATTACHMENTS,encoded))上收到错误消息;

1 个答案:

答案 0 :(得分:1)

这是发送邮件附件的Java代码

ATTACHMENTS数据是一个包含3个字段的JSON数组:

  
      
  1. ContentType -附件的内容类型

  2.   
  3. 文件名-收件人将看到的文件附件的名称

  4.   
  5. Base64Content -Base64编码的文件数据为字符串

  6.   

因此,将文件内容编码为String(我在这里使用了来自mailjet客户端JAR本身的Base64编码器)。 filecontentbyte[]。硬编码的PDF文件代码示例如下:

    java.nio.file.Path pdfPath = 
         java.nio.file.Paths.get("c:\\D\\sample.pdf");
    byte[] filecontent = java.nio.file.Files.readAllBytes(pdfPath);
    String fileData = com.mailjet.client.Base64.encode(filecontent);

接下来,使用此代码发送附件,其他代码保持不变。 此处的示例适用于PDF文件,请正确选择MIME类型

  .put(Emailv31.Message.ATTACHMENTS,
            new JSONArray().put(new JSONObject().put("ContentType", "application/pdf")
                           .put("Filename", "abc.pdf")
                           .put("Base64Content", fileData)))
 .put(Emailv31.Message.HTMLPART,...