在 Java 中使用 Gmail API 创建一个以 PDF 文件作为附件的草稿

Create a draft with PDF file as attachment using Gmail API in Java

我正在尝试使用 Gmail API 在 Java 中创建带有附件的 草稿

创建基本草稿有效,因此我消除了所有权限问题。 我使用代码 here 作为灵感,但无法让它发挥作用。

这是我目前所做的:

public String generateGmailDraft(EmailRequestDto emailRequestDto, String quoteId) 
        throws MessagingException, IOException, GeneralSecurityException {
    // The attachment is a PDF file
    AttachmentDto lastQuoteData = getLastQuotePdfData(quoteId);

    MimeMessage email = createMimeMessage(emailRequestDto, lastQuoteData);
    Message messageWithEmail = createMessageWithEmail(email);

    Draft draft = new Draft();
    draft.setMessage(messageWithEmail);

    // this works
    Gmail gmail = gmail(googleGmailCredentialProperties);

    log.debug("attempting to send mail");
    draft = gmail.users().drafts().create(emailRequestDto.getFrom(), draft).execute();

    log.debug("Draft id: {}", draft.getMessage().getId());
    log.debug(draft.toPrettyString());

    return draft.getMessage().getId();
}


从 Google 示例中,我创建了一个 MIME 消息,但这可能是问题所在:

/**
 * Create a MimeMessage using the parameters provided
 * @return the MimeMessage to be used to send email
 * @throws MessagingException
 */
private MimeMessage createMimeMessage(EmailRequestDto requestDto, AttachmentDto attachment)
        throws MessagingException, IOException {
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);

    MimeMessage email = new MimeMessage(session);
    email.setFrom(new InternetAddress(requestDto.getFrom()));
    email.addRecipient(javax.mail.Message.RecipientType.TO, ew InternetAddress(requestDto.getTo()));
    email.setSubject(requestDto.getSubject());

    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setHeader("Content-Type", "multipart/alternative");
    messageBodyPart.setText(requestDto.getBody());  // Setting the actual message

    // Create a multipart message and set text message part
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Try to add an attachment
    MimeBodyPart attachmentBP = new MimeBodyPart();
    attachmentBP.setFileName(attachment.fileName);

    ByteArrayOutputStream baos = attachmentToByteArrayOutputStream(attachment.file);
    DataSource dataSrc = new ByteArrayDataSource(baos.toByteArray(), "application/pdf");
    attachmentBP.setDataHandler(new DataHandler(dataSrc));
    multipart.addBodyPart(attachmentBP);

    // Send the complete message parts
    email.setContent(multipart);

    return email;
}


这个私有 class 希望提供附件所需的一切,在使用时,所有私有字段都被正确填充。

/**
AttachmentDTO returns everything needed to create an attachment
- file
- mimeype
- filename
- inputstream : used because file can come from different sources in the app.
*/ 
private static final class AttachmentDto {

    private final InputStream inputStream;
    private final String fileName;
    private File file;
    private String mimeType;

    private AttachmentDto(InputStream inputStream, String fileName) {
        this.inputStream = inputStream;
        this.fileName = fileName;

        File outputFile = new File(fileName);
        try (OutputStream out = new FileOutputStream(outputFile)) {
            IOUtils.copy(inputStream, out);
            file = outputFile;
            mimeType = Files.probeContentType(outputFile.toPath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public String getFileName() {
        return fileName;
    }

    public File getFile() {
        return file;
    }

    public String getMimeType() {
        return mimeType;
    }
}


当前状态:

感谢任何帮助,谢谢。

尝试类似的操作:

private MimeMessage createEmailWithAttachment(String to,
        String subject,
        String bodyText,
        File file) throws MessagingException, IOException {
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);

    MimeMessage email = new MimeMessage(session);

    email.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(to));
    email.setSubject(subject);

    MimeBodyPart mimeBodyPart = new MimeBodyPart();
    mimeBodyPart.setContent(bodyText, "text/plain");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(mimeBodyPart);

    mimeBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(file);

    mimeBodyPart.setDataHandler(new DataHandler(source));
    mimeBodyPart.setFileName(file.getName());

    multipart.addBodyPart(mimeBodyPart);
    email.setContent(multipart);

    return email;
}