Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SendGrid emailing API , send email attachment

Tags:

java

sendgrid

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

like image 248
shareef Avatar asked Jul 26 '16 20:07

shareef


2 Answers

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.

like image 81
shareef Avatar answered Nov 16 '22 11:11

shareef


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;
    }
like image 6
Nayan Avatar answered Nov 16 '22 09:11

Nayan