在 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;
}
}
当前状态:
- 代码卡在
gmail.users().drafts().create(emailRequestDto.getFrom(), draft).execute();
上,永远不会 returns
按照上面的link,我也尝试将附件编码为Base64,然后使用
public Gmail.Users.Drafts.Create create(
String userId,
Draft content,
AbstractInputStreamContent mediaContent) throws java.io.IOException
我想这是当你有附件时使用的对应物。
当我使用它时,在我的邮箱中创建了草稿,但没有附件。
感谢任何帮助,谢谢。
尝试类似的操作:
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;
}
我正在尝试使用 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;
}
}
当前状态:
- 代码卡在
gmail.users().drafts().create(emailRequestDto.getFrom(), draft).execute();
上,永远不会 returns 按照上面的link,我也尝试将附件编码为Base64,然后使用
public Gmail.Users.Drafts.Create create( String userId, Draft content, AbstractInputStreamContent mediaContent) throws java.io.IOException
我想这是当你有附件时使用的对应物。
当我使用它时,在我的邮箱中创建了草稿,但没有附件。
感谢任何帮助,谢谢。
尝试类似的操作:
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;
}