Sendgrid-nodejs: ¿Cómo adjuntar un PDF desde una URL a un correo electrónico usando @ sendgrid / mail?

Creado en 22 ene. 2018  ·  10Comentarios  ·  Fuente: sendgrid/sendgrid-nodejs

Resumen de asuntos

Quiero adjuntar la URL al correo electrónico. Utilicé algunas soluciones, como obtener la URL en PDF a pedido o leerla como un archivo, pero no funcionó.

Detalles técnicos:

  • sendgrid-nodejs Versión: @ sendgrid / mail: ^ 6.2.1
  • Versión de Node.js: 9.2.1
easy hacktoberfest help wanted help wanted question up for grabs up-for-grabs

Comentario más útil

@ShahrokhNiakan dado que el pdf es binario en lugar de una cadena, creo que debería especificar encoding: null en las opciones que pasa a solicitar para que la biblioteca de solicitudes no intente decodificarlo como una cadena utf-8.
P.ej:

request = require('request');

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

Citando del README de la solicitud :

codificación: codificación que se utilizará en setEncoding de datos de respuesta. Si es nulo, el cuerpo se devuelve como un búfer. Cualquier otra cosa (incluido el valor predeterminado de undefined) se pasará como parámetro de codificación a toString () (lo que significa que efectivamente es utf8 por defecto). (Nota: si espera datos binarios, debe establecer la codificación: nula )

Todos 10 comentarios

Hola @ShahrokhNiakan ,

¿Has probado el ejemplo aquí ? Si es así, ¿podría compartir el código para que podamos intentar reproducirlo?

¡Gracias!

Con los mejores deseos,

Elmer

@thinkingserious Lo arreglé descargando la URL del pdf y luego leí el archivo y lo
Aquí está mi código de ejemplo, esto es solo para prueba :)
Gracias

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);

                    });


                });

                }

              });

    });

Hola @ShahrokhNiakan ,

Gracias por compartir su solución.

¿Qué tal tomar el archivo de la URL así ?

Con los mejores deseos,

Elmer

@thinkingserious Lo probé, pero el archivo PDF a veces no está bien y no se puede leer en el archivo adjunto de correo.
Gracias

request = require('request');

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

});

Hola @ShahrokhNiakan ,

¿Está probando con el mismo PDF o con diferentes?

En los casos en los que el PDF no se puede leer, ¿es posible verificar que el PDF de origen no esté dañado?

Hola @ShahrokhNiakan ,

Gracias. Esto ahora en mi backlog para una revisión.

Una cosa que puede considerar mientras tanto es que quizás se esté enfrentando a limitaciones de tamaño .

Con los mejores deseos,

Elmer

@ShahrokhNiakan dado que el pdf es binario en lugar de una cadena, creo que debería especificar encoding: null en las opciones que pasa a solicitar para que la biblioteca de solicitudes no intente decodificarlo como una cadena utf-8.
P.ej:

request = require('request');

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

Citando del README de la solicitud :

codificación: codificación que se utilizará en setEncoding de datos de respuesta. Si es nulo, el cuerpo se devuelve como un búfer. Cualquier otra cosa (incluido el valor predeterminado de undefined) se pasará como parámetro de codificación a toString () (lo que significa que efectivamente es utf8 por defecto). (Nota: si espera datos binarios, debe establecer la codificación: nula )

@brafdlog ¡ tu solución funcionó para mí! ¡Gracias!

El módulo SendGrid anterior tenía soporte para especificar URL para archivos adjuntos. Eso fue muy conveniente. ¿Por qué todos los remitentes deberían preocuparse por enviar contenido voluminoso en base64? Sendgrid debería poder hacer eso.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

prasoonjalan picture prasoonjalan  ·  3Comentarios

thinkingserious picture thinkingserious  ·  4Comentarios

amlcodes picture amlcodes  ·  4Comentarios

kiranshashiny picture kiranshashiny  ·  4Comentarios

danielflippance picture danielflippance  ·  4Comentarios