2017-05-18 18 views
0

非同期で複数のメールをユーザーに送信したい。ノードjsのループでバルクメールを非同期に送信するにはどうすればよいですか?

  • user.jsのはemailUtilは=( "./ emailUtil.js")を必要と

    VARファイル。 var userdata [100];

    //それは、I = 0ましょう(100

    も聞かせて、ユーザデータ内に複数のデータがあると仮定し、私はemailBodyは= 'メールの本文' 聞かせて 、emailSubjectは= 'SGTスケジュール'; emailUtil .sendEmail(emailBody、 ''、emailSubject、 ''、 ''、user_data.email、 'あなたの名前'、 '');}

私は機能

を送る私の電子メールを書き、他のファイルで
  • emailUtil.js

    //メールUtilのファイル

    var nodemailer = require('nodemailer'); 
    
    // Not the movie transporter! 
        var transporter = nodemailer.createTransport({ 
         service: 'gmail', 
         auth: { 
          user: 'email id', // Your email id 
          pass: '*******' // Your password 
         } 
        }); 
    
    
    
    
        module.exports = 
    
    { 
    
        sendEmail: function sendMail(varhtml,vartext, 
         varsubject,varfrom, varfrom_name,varto, varto_name, 
         reply_to_email) { 
    
    
        //setup e-mail data with unicode symbols 
        var mailOptions = { 
    
         to: [varto], // list of receivers 
         subject: varsubject, // Subject line 
         text: vartext, // plaintext body 
         html: varhtml // html body 
        }; 
    
    
        console.log(mailOptions); 
    
        // send mail with defined transport object 
        transporter.sendMail(mailOptions, function (error, info) { 
         if (error) { 
          return console.log(error); 
         }else{ 
         return console.log(info); 
         } 
        }); 
    

    }}

私はすぐに応答を送信します。私は電子メールを待つ必要はありません これを行うために、私はループを使用してメールを送信することを考えていますが、非同期です。

Currenlty、私はメールを送信する前に私の応答を送っていますし、メール機能を呼び出すだけですか?誰かがそのapiに別のリクエストを送ると、node.jsがシングルスレッドであり、このスレッドがコードを実行するのを待っているので(通常のapi呼び出しでメールを送信中)、それは見ないでしょうそのファイルの別のインスタンスを作成するだけで、スレッドを作成できます。

希望私の質問を正しく説明することができます。所望の結果を達成するために、この関数は次のように呼び出すことができる任意の懸念

+0

forループ(または他のループ)を実行中にsendEmail関数を呼び出すと、必要な処理が実行されます。すべてのメールをループループ(LOL)として発火させ、運送業者については何も言わないでください。sendEmailの結果 – yBrodsky

+0

Currenlty、私はメールを送信する前に私の応答を送信し、その後メール機能を呼び出しますか?私はそれのための質問を更新する –

+0

それは動作しません。もしあなたがtransporter.sendEmailのような非同期関数を持っているなら、コールバックや約束を実装する必要があります。 examplifyへの回答を投稿させてください – yBrodsky

答えて

0
sendEmail: (somevariables balbla) { 
    //some code 
    transporter.sendEmail((err, res) => { 
    console.log(err); 
    console.log(res); 
    }); 
} 

があれば私に教えてください:

for(let i = 0; i < 100; i++) { 
    sendEmail(someParams); 
} 

それは思いやりのない、100回と呼ばれるも応答を待っている。 は今、あなたの電子メール機能はこのようなものだった場合:

sendEmail: (somevariables balbla, callback) { 
    //some code 
    transporter.sendEmail((err, res) => { 
    console.log(err); 
    console.log(res); 
    return callback(err, res); 
    }); 
} 

あなたはまだループでそれを呼び出すことができますし、コールバックによって返されるものは何でも無視します。あなたの関数は次のように同じである場合:

sendEmail: (somevariables balbla, callback) { 
    return new Promise((resolve, reject) => { 
    //some code 
    transporter.sendEmail((err, res) => { 
     console.log(err); 
     console.log(res); 
     return resolve(res); 
    }); 
    }); 
} 

TL; DRは、ループ内で、あなたの関数を呼び出すと、それはあなたがやりたいだろう。あなたが望むなら、あなたの関数は、その結果を待ついくつかの他のシナリオの場合に備えて、約束またはコールバックを返すことができます。

+0

私は自分の関数を呼び出して応答を待たずにコードを変更しません。右 ? –

+0

はい。それでも、あなたのコードには決してうまくいきません。将来必要になる場合に備えて、これらの変更を行って約束またはコールバックを返すことができます。 – yBrodsky

関連する問題