17
votes

Am using sendgrid to send emails and it works fine using the following code but its without attachment.

package sendgrid;

import com.sendgrid.Content;
import com.sendgrid.Email;
import com.sendgrid.Mail;
import com.sendgrid.Method;
import com.sendgrid.Request;
import com.sendgrid.Response;
import com.sendgrid.SendGrid;
import java.io.IOException;

public class SendEmail {
    public static void main(String[] args) throws IOException {
    Email from = new Email("[email protected]");
    String subject = "Hello World from the SendGrid Java Library!";

    Email to = new Email("[email protected]");
    Content content = new Content("text/plain", "Hello, Email!");
    Mail mail = new Mail(from, subject, to, content);

    SendGrid sg = new SendGrid("SG.rIEh84OgQBybYEJcOMie1wd.AZqqdWNYXbOqTarUJcG-iSg0UtHJtCto4oe6tVzn6es");
    Request request = new Request();
    try {

      request.method = Method.POST;
      request.endpoint = "mail/send";
      request.body = mail.build();

      Response response = sg.api(request);
      System.out.println(response.statusCode);
      System.out.println(response.body);
      System.out.println(response.headers);

    } catch (IOException ex) {
      throw ex;
    }
  }

}

But what i need is to send attachments with it so i searched github source and the web documentation API , and for some reason there is no javadocs but there was an example GitHub sendgrid so am trying until it works , i narrowed down some exceptions and response code , at first i was getting unauthorized the forbidden and it got better to response 202 , means valid and queued (check here) any way here is my code that dose send an email and with attachments but when you open the attachment its zero size and says cannot open or preview the file !

 package sendgrid;

    import com.sendgrid.Attachments;
    import com.sendgrid.Content;
    import com.sendgrid.Email;
    import com.sendgrid.Mail;
    import com.sendgrid.MailSettings;
    import com.sendgrid.Method;
    import com.sendgrid.Request;
    import com.sendgrid.SendGrid;
    import com.sendgrid.Setting;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;


    public class SendEmailAttachmentV2 {

        public static void main(String[] args) throws IOException {
            sendmail();
        }

        // Fully populated Mail object
        public static void sendmail() throws IOException {

            com.sendgrid.Response response1;

            Email from = new Email("[email protected]");
            String subject = "Hello World from the SendGrid Java Library!";

            Email to = new Email("[email protected]");
            Content content = new Content("text/plain", "Hello, Email!");
            Mail mail = new Mail(from, subject, to, content);

            File file = new File("C:\\x.png");
            byte[] fileData = null;
            try {
                fileData = org.apache.commons.io.IOUtils.toByteArray(new FileInputStream(file));
            } catch (IOException ex) {
            }

            Attachments attachments3 = new Attachments();            
            attachments3.setContent(new String(fileData, 0, (int) file.length(), "UTF-8"));
            attachments3.setType("image/png");//"application/pdf"
            attachments3.setFilename("x.png");
            attachments3.setDisposition("attachment");
            attachments3.setContentId("Banner");
            mail.addAttachments(attachments3);


            MailSettings mailSettings = new MailSettings();
            Setting sandBoxMode = new Setting();
            sandBoxMode.setEnable(true);
            mailSettings.setSandboxMode(sandBoxMode);

            SendGrid sg = new SendGrid("SG.1Hg78VK0TJ6kexUnByZUYg.LAa5A4GufssZ9lpPQdV6PcZCY6SZ9Xq6LvqfMRG0wesKw");
            Request request1 = new Request();
            try {
                request1.method = Method.POST;
                request1.endpoint = "mail/send";

                request1.body = mail.build();

                response1 = sg.api(request1);
                System.out.println(response1.statusCode);
                System.out.println(response1.body);
                System.out.println(response1.headers);

            } catch (IOException ex) {
                System.out.println(ex);
            }
        }

    }

FYI: use your generated API key that generated from the console of sendgrid

3
You should remove the key from your code example - IcedDante
yes thanks @IcedDante i have put random one not real one i will re random it any way - shareef
hi, @shareef can you tell me how many emails that I can send in one go, is there any limit on java sdk for sendgrid? - Onkar Musale
Hi @OnkarMusale, you can check their site for updated info docs, or just do live chat they are very responsive! - shareef
@shareef Thank you so much for your response, I just found out that we can send 10k to 15k per second, but recommended is 1k per second. - Onkar Musale

3 Answers

15
votes

When i executed the code i got the following message in logs in netbeans

 202
 
 {X-Frame-Options=DENY, Server=nginx, Connection=keep-alive,
 X-Message-Id=vqVw2RtUShSVQ_ymVEVqaw, Content-Length=0, Date=Tue, 26
 Jul 2016 20:05:54 GMT, Content-Type=text/plain; charset=utf-8}

The trick to solve the issue is to encode the attachment using commons apache codec commons-codec-1.8.jar and its encodeAsString method from package

org.apache.commons.codec.binary.Base64

Attachments attachments3 = new Attachments();
Base64 x = new Base64();
String imageDataString = x.encodeAsString(fileData);
attachments3.setContent(imageDataString);
attachments3.setType("image/png");//"application/pdf"
attachments3.setFilename("x.png");
attachments3.setDisposition("attachment");
attachments3.setContentId("Banner");
mail.addAttachments(attachments3);

Even the content-length was retruned as 0 in response it worked.

6
votes

This is the way you can send attachments using SendGrid API.

Mail mail = createEmail();
    Attachments attachments = new Attachments();
    Base64 x = new Base64();
    String encodedString = x.encodeAsString(loadPdfFromClasspath());
    attachments.setContent(encodedString);
    attachments.setDisposition("attachment");
    attachments.setFilename("xyx.pdf");
    attachments.setType("application/pdf");
    mail.addAttachments(attachments);


try {
        request.method = com.sendgrid.Method.POST;
        request.endpoint = "mail/send";
        request.body = mail.build();
        // Uncomment once connectivity with sendgrid is resolved
        Response response = sg.api(request);

}catch (IOException ex) {
        throw ex;
    }
0
votes

It works for me (the latest maven version SendGrid Java ยป 4.4.1):

        import com.sendgrid.helpers.mail.objects.Attachments;
        import com.sendgrid.helpers.mail.objects.Content;
        import com.sendgrid.helpers.mail.objects.Email;
        import com.sendgrid.helpers.mail.Mail;

        ......

        Content content = new Content("text/html", body);
        Mail mail = new Mail(from, subject, to, content);
        Path file = Paths.get(filePath);
        Attachments attachments = new Attachments();
        attachments.setFilename(file.getFileName().toString());
        attachments.setType("application/pdf");
        attachments.setDisposition("attachment");

        byte[] attachmentContentBytes = Files.readAllBytes(file);
        String attachmentContent = Base64.getMimeEncoder().encodeToString(attachmentContentBytes);
        attachments.setContent(attachmentContent);
        mail.addAttachments(attachments);

        SendGrid sg = new SendGrid(apiKey);
        Request request = new Request();

        request.setMethod(Method.POST);
        request.setEndpoint("mail/send");
        request.setBody(mail.build());
        Response response = sg.api(request);