Sendgrid-nodejs: Como anexar PDF de URL para e-mail usando @ sendgrid / mail?

Criado em 22 jan. 2018  ·  10Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

Resumo do problema

Quero anexar url ao e-mail Usei algumas soluções como obter url em pdf por solicitação ou ler como arquivo, mas não funcionou.

Detalhes técnicos:

  • sendgrid-nodejs Versão: @ sendgrid / mail: ^ 6.2.1
  • Versão Node.js: 9.2.1
easy hacktoberfest help wanted help wanted question up for grabs up-for-grabs

Comentários muito úteis

@ShahrokhNiakan, uma vez que o pdf é binário em vez de uma string, acho que você deve especificar encoding: null nas opções que passar para request, para que a biblioteca de solicitações não tente decodificá-lo como uma string utf-8.
Por exemplo:

request = require('request');

request.get( url, { encoding: null } function(err, res) {
 var base64File = new Buffer(res.body).toString('base64');
 ...
});

Citando o README do pedido :

codificação - codificação a ser usada em setEncoding de dados de resposta. Se nulo, o corpo é retornado como um buffer. Qualquer outra coisa (incluindo o valor padrão de undefined) será passado como o parâmetro de codificação para toString () (o que significa que é efetivamente utf8 por padrão). (Observação: se você espera dados binários, deve definir a codificação: nulo. )

Todos 10 comentários

Olá @ShahrokhNiakan ,

Você já tentou o exemplo aqui ? Em caso afirmativo, você poderia compartilhar o código para que possamos tentar reproduzi-lo?

Obrigado!

Obrigado pela atenção,

Elmer

@thinkingserious Corrigi -o baixando a url do pdf e depois li o arquivo e anexei ao e-mail, mas não é um bom caminho!
Aqui está meu código de exemplo, isso é apenas para teste :)
Obrigado

const sgMail = require('@sendgrid/mail');
    sgMail.setApiKey("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

    var download = require('download-file'),
        fs = require('fs'),
        array = [],
        temp = [],
        files = [];

    array.push('https://www.antennahouse.com/XSLsample/pdf/sample-link_1.pdf');
    array.push('https://www.antennahouse.com/XSLsample/pdf/sample-link_1.pdf');
    array.push('https://www.antennahouse.com/XSLsample/pdf/sample-link_1.pdf');


    array.forEach(function(url) {

        temp++;

        var options = {
            directory: "./pdf",
            filename: temp.toString() + Date.now() + ".pdf"
        };

        download(url, options, function(err, res) {

            console.log( __dirname + '/pdf/' + options.filename );

            files.push(res);

            if ( array.length == files.length ) {

                // console.log( "hello" );

                var counter = 0,
                    attach = [];
                files.forEach( function(name, index) {

                    name = name.substring(1, name.length );

                    fs.readFile(__dirname + name, function(err, file) {

                        console.log( file );

                        var base64File = new Buffer(file).toString('base64');
                        counter++;

                        attach.push({
                            content : base64File,
                            filename : 'Report.pdf'
                        });

                        console.log( attach );


                    const msg = {
                            to: '[email protected]',
                            from: '[email protected]',
                            subject: 'Test',
                            text: 'this is test',
                            html: '<strong>Hello World</strong>',
                            attachments: attach,
                    };

                    // console.log( msg );

                  if ( counter == files.length )
                      sgMail.send(msg);

                    });


                });

                }

              });

    });

Olá @ShahrokhNiakan ,

Obrigado por compartilhar sua solução.

Que tal pegar o arquivo da url assim ?

Obrigado pela atenção,

Elmer

@thinkingserious eu testei, mas o arquivo PDF às vezes não está OK e não pode ser lido em anexo de email.
Obrigado

request = require('request');

request.get( url, function(err, res) {
 var base64File = new Buffer(res.body).toString('base64');
 ...

});

Olá @ShahrokhNiakan ,

Você está testando com o mesmo PDF ou com outros diferentes?

Nos casos em que o PDF não é legível, é possível verificar se o PDF de origem não está corrompido?

Olá @ShahrokhNiakan ,

Obrigado. Isso agora está na minha lista de pendências para uma revisão.

Nesse ínterim, você pode considerar que talvez esteja enfrentando limitações de tamanho .

Obrigado pela atenção,

Elmer

@ShahrokhNiakan, uma vez que o pdf é binário em vez de uma string, acho que você deve especificar encoding: null nas opções que passar para request, para que a biblioteca de solicitações não tente decodificá-lo como uma string utf-8.
Por exemplo:

request = require('request');

request.get( url, { encoding: null } function(err, res) {
 var base64File = new Buffer(res.body).toString('base64');
 ...
});

Citando o README do pedido :

codificação - codificação a ser usada em setEncoding de dados de resposta. Se nulo, o corpo é retornado como um buffer. Qualquer outra coisa (incluindo o valor padrão de undefined) será passado como o parâmetro de codificação para toString () (o que significa que é efetivamente utf8 por padrão). (Observação: se você espera dados binários, deve definir a codificação: nulo. )

@brafdlog sua solução funcionou para mim! obrigado!

O módulo SendGrid anterior tinha suporte para especificar URLs para anexos. Isso foi muito conveniente. Por que todo remetente deveria se preocupar em enviar conteúdo base64 volumoso? Sendgrid deve ser capaz de fazer isso.

Esta página foi útil?
0 / 5 - 0 avaliações