Sendgrid-nodejs: @ sendgrid / mailを使用してURLからEメールにPDFを添付する方法は?

作成日 2018年01月22日  ·  10コメント  ·  ソース: sendgrid/sendgrid-nodejs

問題の概要

メールにURLを添付したいリクエストでPDFのURLを取得したり、ファイルとして読み取ったりするなどの解決策を使用しましたが、機能しませんでした。

技術的な詳細:

  • 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は文字列ではなくバイナリであるため、リクエストライブラリがutf-8文字列としてデコードしようとしないように、リクエストに渡すオプションでencoding: nullを指定する必要があると思います。
例えば:

request = require('request');

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

リクエスト

encoding-応答データのsetEncodingで使用されるエンコーディング。 nullの場合、本文はバッファとして返されます。 それ以外のもの(undefinedのデフォルト値を含む)は、エンコードパラメータとしてtoString()に渡されます(これは、デフォルトでは事実上utf8であることを意味します)。 (注:バイナリデータが必要な場合は、encoding:nullを設定する必要があります。

全てのコメント10件

こんにちは@ShahrokhNiakan

ここで例を試しまし

ありがとう!

敬具、

エルマー

@thinkingserious pdf urlをダウンロードして修正し、ファイルを読んでメールに添付しましたが、良い方法ではありません。
これが私のサンプルコードです。これはテスト用です:)
ありがとうございました

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が読めない場合、ソース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

ありがとうございました。 これはレビューのために私のバックログにあります。

その間に考慮できることの1つは、おそらくサイズ制限に直面しているということです。

敬具、

エルマー

@ShahrokhNiakan pdfは文字列ではなくバイナリであるため、リクエストライブラリがutf-8文字列としてデコードしようとしないように、リクエストに渡すオプションでencoding: nullを指定する必要があると思います。
例えば:

request = require('request');

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

リクエスト

encoding-応答データのsetEncodingで使用されるエンコーディング。 nullの場合、本文はバッファとして返されます。 それ以外のもの(undefinedのデフォルト値を含む)は、エンコードパラメータとしてtoString()に渡されます(これは、デフォルトでは事実上utf8であることを意味します)。 (注:バイナリデータが必要な場合は、encoding:nullを設定する必要があります。

@brafdlogあなたのソリューションは私のために働いた! ありがとう!

以前のSendGridモジュールでは、添付ファイルのURLを指定することがサポートされていました。 とても便利でした。 すべての送信者がかさばるbase64コンテンツの送信を気にする必要があるのはなぜですか。 Sendgridはそれを実行できるはずです。

このページは役に立ちましたか?
0 / 5 - 0 評価