2014-05-20 154 views
0

我正在尝试生成pdf并附加到电子邮件并发送。 我正在使用salesforce和sendgrid。 我能够发送电子邮件,但问题是当我尝试附加pdf,电子邮件是附件,但这是坏了,文件不是空的,但pdf说是坏了(我认为是一个问题在这里转换) 是代码通过sendgrid在salesforce中发送带附件的电子邮件

Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment(); 
    PageReference pdf = Page.include_attachment; 
    pdf.getParameters().put('id', 'xxxxxxxxxxxxxxxxxx'); 
    blob fileBody = pdf.getContentAsPDF(); 
    efa.setBody(fileBody); 
    efa.setFileName('test.pdf'); 
    efa.setContentType('application/pdf;charset=UTF-8;'); 
    send('[email protected]','Test','Body Test', fileBody); 

我使用

pdf.getContentAsPDF(); 

pdf.getContent(); 

tryied但结果是一样的。

发送方法

public static void send(String emailRecipient, String emailSubject, String emailBody, Blob att){ 
    Boolean success=true; 

    //construct the body of the request 
    String requestBody=''; 
    requestBody += 'to='+EncodingUtil.urlEncode(emailRecipient,'UTF-8'); 
    requestBody += '&from='+EncodingUtil.urlEncode(user.Email,'UTF-8'); 
    requestBody += '&fromname='+EncodingUtil.urlEncode(user.Name,'UTF-8'); 
    requestBody += '&subject='+EncodingUtil.urlEncode(emailSubject,'UTF-8'); 
    requestBody += '&text='+EncodingUtil.urlEncode(emailBody.trim(),'UTF-8'); 
    requestBody += '&html='+EncodingUtil.urlEncode(emailBody.trim(),'UTF-8'); 
    requestBody += '&api_user=xxxxx'; 
    requestBody += '&api_key=xxxxx'; 
    requestBody += '&files[attachment.pdf][email protected]'+ EncodingUtil.base64Encode(att); 

    //construct request 
    HttpRequest req = new HttpRequest(); 
    req.setEndpoint('https://sendgrid.com/api/mail.send.json'); 
    req.setMethod('POST'); 
    req.setBody(requestBody); 
    try{ 
     //send request 
     Http h = new Http(); 
     HttpResponse res = h.send(req); 
     //check response 
     String status = res.getStatus(); 
     if(status.toUpperCase()=='OK'){ 
      success=true; 
     } 
     else{ 
      success=false; 
     } 
    } 
    catch(Exception e){ 
     success=false; 
    } 
} 

谢谢

+1

您可能需要联系[斯科特莫特(https://twitter.com/scottmotte)。他正在创建一个与Salesforce的SendGrid一起工作的库。 发送方法的主体是什么样的? –

+0

非常感谢您的评论@Daniel,我发布了发送方法。 – agusgambina

+1

像[Daniel Ballinger](http://stackoverflow.com/users/54026/daniel-ballinger)说我现在在图书馆工作。丹尼尔一直在帮忙。我现在没有答案,但今天正在处理这个问题。 – scottmotte

回答

3

现在有一个图书馆/ devtoolkit为你做到这一点。在撰写本文时,它处于测试阶段,但它正在工作。免责声明:我在SendGrid工作,刚刚开发了这个库。

sendgrid-apex

你可以重写你的代码:

... 
Blob att = pdf.getContentAsPDF(); 
public static void send(String emailRecipient, String emailSubject, String emailBody, Blob att){ 

    SendGrid sendgrid = new SendGrid('username', 'password'); 

    SendGrid.email email = new SendGrid.Email(); 
    email.addTo(emailRecipient); 
    email.setFrom(user.Email); 
    email.setFromName(user.Name); 
    email.setSubject(emailSubject); 
    email.setText(emailBody.trim()); 
    email.setHtml(emailBody.trim()); 
    email.addAttachmentStream("attachment.pdf", att); 

    String response = sendgrid.send(email); 
} 
+0

非常感谢您的工作!我试图实现你的解决方案,当我附加一个txt时工作,但不是当我尝试在Salesforce中生成pdf时,然后附加它(我得到的错误是BLOB不是有效的UTF-8字符串),有道理,但也许有办法解决这个问题,我会继续努力解决。谢谢。 – agusgambina

+1

好的,这可能是一个错误(在我的理解如何处理blob)。导致该错误的代码是[here](https://github.com/scottmotte/sendgrid-apex/blob/master/src/classes/SendGrid.cls#L143)。它试图将其转换为String,但不会以UTF-8的形式返回。我已经把它作为一个问题[在这里](https://github.com/scottmotte/sendgrid-apex/issues/1)发布,并将解决它。 – scottmotte

+0

@scottmotte,有没有解决这个问题的解决方案? – Hrushi

相关问题