Sendgrid-nodejs: Как прикрепить PDF-файл из URL-адреса к электронной почте с помощью @ sendgrid / mail?

Созданный на 22 янв. 2018  ·  10Комментарии  ·  Источник: sendgrid/sendgrid-nodejs

Резюме проблемы

Я хочу прикрепить URL-адрес к электронной почте. Я использовал некоторые решения, такие как получение URL-адреса pdf по запросу или чтение его как файла, но это не сработало.

Технические подробности:

  • sendgrid-nodejs Версия: @ sendgrid / mail: ^ 6.2.1
  • Node.js Версия: 9.2.1
easy hacktoberfest help wanted help wanted question up for grabs up-for-grabs

Самый полезный комментарий

@ShahrokhNiakan, поскольку pdf является двоичным, а не строкой, я думаю, вы должны указать encoding: null в параметрах, которые вы передаете для запроса, чтобы библиотека запросов не пыталась декодировать его как строку utf-8.
Например:

request = require('request');

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

Цитата из README запроса :

encoding - кодировка, которая будет использоваться при setEncoding данных ответа. Если null, тело возвращается как буфер. Все остальное (включая значение по умолчанию undefined) будет передано в качестве параметра кодирования toString () (что означает, что по умолчанию это фактически utf8). (Примечание: если вы ожидаете двоичных данных, вы должны установить encoding: null. )

Все 10 Комментарий

Привет @ShahrokhNiakan!

Вы пробовали здесь пример? Если да, не могли бы вы поделиться кодом, чтобы мы могли его воспроизвести?

Спасибо!

С наилучшими пожеланиями,

Элмер

@thinkingserious Я исправил это, загрузив URL-адрес pdf, а затем прочитал файл и прикрепил его к почте, но это не лучший способ!
Вот мой пример кода, это просто для проверки :)
Спасибо

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

                    });


                });

                }

              });

    });

Привет @ShahrokhNiakan ,

Спасибо, что поделились своим решением.

Как насчет того, чтобы взять файл с URL-адреса таким образом ?

С наилучшими пожеланиями,

Элмер

@thinkingserious Я тестировал его, но PDF-файл иногда не работает и не читается во вложении к письму.
Спасибо

request = require('request');

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

});

Привет @ShahrokhNiakan!

Вы тестируете один и тот же PDF-файл или разные?

В случаях, когда PDF-файл не читается, можно ли убедиться, что исходный PDF-файл не поврежден?

Привет, дорогой @thinkingserious

Я протестировал эту ссылку PDF ниже:

http://www.africau.edu/images/default/sample.pdf
http://www.pdf995.com/samples/pdf.pdf
https://www.ets.org/Media/Tests/GRE/pdf/gre_research_validity_data.pdf

Привет @ShahrokhNiakan!

Спасибо. Это сейчас в моем журнале для обзора.

В то же время вы можете подумать о том, что, возможно, вы столкнулись с ограничениями по размеру .

С наилучшими пожеланиями,

Элмер

@ShahrokhNiakan, поскольку pdf является двоичным, а не строкой, я думаю, вы должны указать encoding: null в параметрах, которые вы передаете для запроса, чтобы библиотека запросов не пыталась декодировать его как строку utf-8.
Например:

request = require('request');

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

Цитата из README запроса :

encoding - кодировка, которая будет использоваться при setEncoding данных ответа. Если null, тело возвращается как буфер. Все остальное (включая значение по умолчанию undefined) будет передано в качестве параметра кодирования toString () (что означает, что по умолчанию это фактически utf8). (Примечание: если вы ожидаете двоичных данных, вы должны установить encoding: null. )

@brafdlog ваше решение сработало для меня! Спасибо!

В более раннем модуле SendGrid была поддержка указания URL-адресов для вложений. Это было очень удобно. Зачем каждому отправителю беспокоиться об отправке громоздкого содержимого base64. Sendgrid должен уметь это делать.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги