簡體   English   中英

使用 Java Gmail API 發送帶有多個(大)附件的電子郵件

[英]Use Java Gmail API to send an email with multiple (large) attachments

我正在嘗試使用 Google Gmail API (Java) 創建包含多個附件的電子郵件。 使用下面的代碼,如果附件總數小於 5MB(Google 的簡單文件上傳閾值),我可以發送多個嵌入在 MimeMessage 中的附件。

com.google.api.services.gmailGmail service = (... defined above ...)
javax.mail.internet.MimeMessage message = (... defined above with attachments embedded ...)

// Send the email
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
mimeMessage.writeTo(buffer);
byte[] bytes = buffer.toByteArray();
String encodedEmail = Base64.encodeBase64URLSafeString(bytes);
Message message = new Message();
message.setRaw(encodedEmail);

message = service.users().messages().send("me", message).execute();

但是,我無法弄清楚如何使用 Gmail Java API 將多個文件正確附加到電子郵件中。 下面的方法看起來很有希望,但它似乎只接受 1 個 File/InputStream (mediaContent)。

Gmail.Users.Messages.Send send(userId, Message content, AbstractInputStreamContent mediaContent)

有人知道如何使用 API 正確實現多文件上傳嗎?

如您所述, 簡單文件上傳的最大附件大小為 5 MB

結論:

您需要使用Multipart uploadResumable upload

使用分段上傳發送電子郵件的示例:

public static MimeMessage createEmailWithAttachment(String to, String from, String subject,
                                      String bodyText,String filePath) throws MessagingException{
    File file = new File(filePath);
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);
    MimeMessage email = new MimeMessage(session);
    Multipart multipart = new MimeMultipart();
    InternetAddress tAddress = new InternetAddress(to);
    InternetAddress fAddress = new InternetAddress(from);
    email.setFrom(fAddress);
    email.addRecipient(javax.mail.Message.RecipientType.TO, tAddress);
    email.setSubject(subject);
    if (file.exists()) {
        source = new FileDataSource(filePath);
        messageFilePart = new MimeBodyPart();
        messageBodyPart = new MimeBodyPart();
        try {
            messageBodyPart.setText(bodyText);
            messageFilePart.setDataHandler(new DataHandler(source));
            messageFilePart.setFileName(file.getName());

            multipart.addBodyPart(messageBodyPart);
            multipart.addBodyPart(messageFilePart);
            email.setContent(multipart);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }else
        email.setText(bodyText);
    return email;
}

在這里,您可以找到許多其他有用的示例,用於使用 Java 中的 Gmail API 發送電子郵件。

事實證明我的 MimeMessage 生成正確,但是,如果 MimeMessage 中包含的附件​​大於 5MB,則需要使用不同的 Gmail API send() 方法。 API 文檔非常令人困惑,因為它們似乎聲明您需要多次調用其余端點才能上傳多個文件。 事實證明,Gmail Java Api 根據提交的 MimeMessage 為您完成所有工作。

下面的代碼片段展示了如何使用兩種方法:“簡單上傳”和“分段上傳”。

com.google.api.services.gmailGmail service = (... defined above ...)
javax.mail.internet.MimeMessage message = (... defined above with attachments embedded ...)

/**
 * Send email using Gmail API - dynamically uses simple or multipart send depending on attachments size
 * 
 * @param mimeMessage MimeMessage (includes any attachments for the email)
 * @param attachments the Set of files that were included in the MimeMessage (if any).  Only used to calculate total size to see if we should use "simple" send or need to use multipart upload.
 */
void send(MimeMessage mimeMessage, @Nullable Set<File> attachments) throws Exception {

    Message message = new Message();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    mimeMessage.writeTo(buffer);

    // See if we need to use multipart upload
    if (attachments!=null && computeTotalSizeOfAttachments(attachments) > BYTES_5MB) {

        ByteArrayContent content = new ByteArrayContent("message/rfc822", buffer.toByteArray());
        message = service.users().messages().send("me", null, content).execute();

    // Otherwise, use "simple" send
    } else {

        String encodedEmail = Base64.encodeBase64URLSafeString(buffer.toByteArray());
        message.setRaw(encodedEmail);
        message = service.users().messages().send("me", message).execute();
    }

    System.out.println("Gmail Message: " + message.toPrettyString());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM