web-dev-qa-db-ja.com

GmailとNodeJSを使用したNodemailer

NodeJSを使用してnodemailerを使用して連絡先フォームを実装しようとしましたが、ローカルでのみ動作し、リモートサーバーでは動作しません...

私のエラーメッセージ:

[website.fr-11 (out) 2013-11-09T15:40:26] { [AuthError: Invalid login - 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787
[website.fr-11 (out) 2013-11-09T15:40:26] 534 5.7.14 54 fr4sm15630311wib.0 - gsmtp]
[website.fr-11 (out) 2013-11-09T15:40:26]   name: 'AuthError',
[website.fr-11 (out) 2013-11-09T15:40:26]   data: '534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX\r\n534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC\r\n534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX\r\n534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r\r\n534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.\r\n534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787\r\n534 5.7.14 54 fr4sm15630311wib.0 - gsmtp',
[website.fr-11 (out) 2013-11-09T15:40:26]   stage: 'auth' }

私のコントローラー:

exports.contact = function(req, res){
    var name = req.body.name;
    var from = req.body.from;
    var message = req.body.message;
    var to = '*******@gmail.com';
    var smtpTransport = nodemailer.createTransport("SMTP",{
        service: "Gmail",
        auth: {
            user: "******@gmail.com",
            pass: "*****"
        }
    });
    var mailOptions = {
        from: from,
        to: to, 
        subject: name+' | new message !',
        text: message
    }
    smtpTransport.sendMail(mailOptions, function(error, response){
        if(error){
            console.log(error);
        }else{
            res.redirect('/');
        }
    });
}
87
tonymx227

私は次のURLに移動してこれを解決しました(メールを送信したいアカウントでGoogleに接続している間):

https://www.google.com/settings/security/lesssecureapps

そこで、安全性の低いアプリを有効にしました。

完了

118
brafdlog

NodemailerのGmail接続の公式ガイドをご覧ください。

https://community.nodemailer.com/using-gmail/

-

これを実行した後、それは私のために働いています:

  1. 安全性の低いアプリを有効にする- https://www.google.com/settings/security/lesssecureapps
  2. Captchaを一時的に無効にして、新しいデバイス/サーバーに接続できるようにします- https://accounts.google.com/b/0/displayunlockcaptcha
43
Greg T

XOAuth2トークン を使用してGmailに接続する必要があります。 Nodemailerはそれについて既に知っています。

var smtpTransport = nodemailer.createTransport('SMTP', {
    service: 'Gmail',
    auth: {
      XOAuth2: {
        user: smtpConfig.user,
        clientId: smtpConfig.client_id,
        clientSecret: smtpConfig.client_secret,
        refreshToken: smtpConfig.refresh_token,
        accessToken: smtpConfig.access_token,
        timeout: smtpConfig.access_timeout - Date.now()
      }
    }
  };

アプリを登録するには、 Google Cloud Console にアクセスする必要があります。次に、使用するアカウントのアクセストークンを取得する必要があります。そのために passportjs を使用できます。

これは私のコードでどのように見えるかです:

var passport = require('passport'),
    GoogleStrategy = require('./google_oauth2'),
    config = require('../config');

passport.use('google-imap', new GoogleStrategy({
  clientID: config('google.api.client_id'),
  clientSecret: config('google.api.client_secret')
}, function (accessToken, refreshToken, profile, done) {
  console.log(accessToken, refreshToken, profile);
  done(null, {
    access_token: accessToken,
    refresh_token: refreshToken,
    profile: profile
  });
}));

exports.mount = function (app) {
  app.get('/add-imap/:address?', function (req, res, next) {
    passport.authorize('google-imap', {
        scope: [
          'https://mail.google.com/',
          'https://www.googleapis.com/auth/userinfo.email'
        ],
        callbackURL: config('web.vhost') + '/add-imap',
        accessType: 'offline',
        approvalPrompt: 'force',
        loginHint: req.params.address
      })(req, res, function () {
        res.send(req.user);
      });
  });
};
36
Laurent Perrin

簡単な解決策:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  Host: 'smtp.gmail.com',
  auth: {
    user: '[email protected]',
    pass: 'realpasswordforaboveaccount'
  }
}));

var mailOptions = {
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Sending Email using Node.js[nodemailer]',
  text: 'That was easy!'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
});  

ステップ1:

ここに https://myaccount.google.com/lesssecureapps に移動して、安全性の低いアプリを有効にします。これが機能しない場合

ステップ2

ここに行きます https://accounts.google.com/DisplayUnlockCaptcha そしてenable/continueしてから試してください。

私にとっては、ステップ1だけでは機能しなかったため、ステップ2に進まなければなりませんでした。

nodemailer-smtp-transportパッケージも削除しようとしましたが、驚いたことに動作します。しかし、その後、システムを再起動したときに同じエラーが発生したため、安全性の低いアプリを起動する必要がありました(作業後に無効にしました)。

その後、楽しみのためにオフ(安全性の低いアプリ)で試してみましたが、再び機能しました!

30
Zaheen

同じ問題がありました。 「安全性の低いアプリ」を許可する Googleのセキュリティ設定で機能しました!

15

私にも同じ問題が起こりました。 localhostでシステムをテストし、サーバー(別の国にある)に展開してから、運用サーバーでシステムを試してみると、このエラーが発生しました。私はこれらを修正してみました:

  1. https://www.google.com/settings/security/lesssecureapps 有効にしたが、それは私の解決策ではなかった
  2. https://g.co/allowaccess 限られた時間外からのアクセスを許可し、これで問題が解決しました。
9

Gmailアカウントでキャプチャを無効にしてみてください。リクエスターのIPアドレスに基づいてトリガーされる可能性があります。参照: GMailを無料のSMTPサーバーとして使用してcaptchaを克服する方法

8
sfnd

私はポートとセキュリティを使用してこのように作業しています(セキュリティ設定なしでPHPを使用してGmailからメールを送信する問題がありました)

私は誰かを助けることを願っています。

var sendEmail = function(somedata){
  var smtpConfig = {
    Host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL, 
                  // you can try with TLS, but port is then 587
    auth: {
      user: '***@gmail.com', // Your email id
      pass: '****' // Your password
    }
  };

  var transporter = nodemailer.createTransport(smtpConfig);
  // replace hardcoded options with data passed (somedata)
  var mailOptions = {
    from: '[email protected]', // sender address
    to: '[email protected]', // list of receivers
    subject: 'Test email', // Subject line
    text: 'this is some text', //, // plaintext body
    html: '<b>Hello world ✔</b>' // You can choose to send an HTML body instead
  }

  transporter.sendMail(mailOptions, function(error, info){
    if(error){
      return false;
    }else{
      console.log('Message sent: ' + info.response);
      return true;
    };
  });
}

exports.contact = function(req, res){
   // call sendEmail function and do something with it
   sendEmail(somedata);
}

すべての構成がリストされています here (例を含む)

8
Angel M.

CreateTransport内のnodemailer-smtp-transportモジュールを使用して解決されます。

var smtpTransport = require('nodemailer-smtp-transport');

var transport = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '*******@gmail.com',
        pass: '*****password'
    }
}));
7
Girish Rathod

上記のソリューションのどれも私にとってはうまくいきませんでした。 NodeMailerのドキュメント に存在するコードを使用しました。次のようになります。

let transporter = nodemailer.createTransport({
    Host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: '[email protected]',
        serviceClient: '113600000000000000000',
        privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
}); 
6
Hamid

うまくいった:

1-インストールnodemailer、インストールされていない場合はパッケージ(cmdに入力):npm install nodemailer

2- https://myaccount.google.com/lesssecureapps に移動し、安全性の低いアプリを許可します

3-コードを書く:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: '[email protected]',
        pass: 'truePassword'
    }
});

const mailOptions = {
    from: '[email protected]', // sender address
    to: '[email protected]', // list of receivers
    subject: 'test mail', // Subject line
    html: '<h1>this is a test mail.</h1>'// plain text body
};

transporter.sendMail(mailOptions, function (err, info) {
    if(err)
        console.log(err)
    else
        console.log(info);
})

4-お楽しみください!

この記事Greg T's answer に記載されている最も簡単な方法は、アカウントの2FAを有効にした後に利用できるアプリパスワードを作成することでした。

myaccount.google.com>サインインとセキュリティ> Googleへのサインイン>アプリパスワード

これにより、アカウントの代替パスワードが提供され、nodemailerを通常のSMTPサービスとして設定するだけです。

var smtpTransport = nodemailer.createTransport({
    Host: "smtp.gmail.com",
    port: 587,
    auth: {
        user: "[email protected]",
        pass: "app password"
    }
});

GoogleはOauth2を最良のオプションとして推奨していますが、この方法は簡単であり、この質問ではまだ言及されていません。

追加のヒント:アプリの名前を「差出人」アドレスに追加できることもわかりました。別のアドレスを使用しようとした場合のように、GMailはアカウントのメールだけに置き換えません。すなわち。

from: 'My Pro App Name <[email protected]>'
4
scipilot

あなたのコードはすべて大丈夫です。残っているのはリンクに行くだけです https://myaccount.google.com/security

下にスクロールすると、[安全性の低いアプリを許可する:オン]と[オン]を続けると、エラーは見つかりません。

3

動作する「ホスト」を追加するだけです。

Host: 'smtp.gmail.com'

次に、以下のリンクをクリックして「lesssecureapps」を有効にします

https://myaccount.google.com/lesssecureapps

3
Milan Panigrahi

Expressを使用する場合、express-mailerwrapsnodemailerは非常にうまく機能し、非常に使いやすいです。

//# config/mailer.js    
module.exports = function(app) {
  if (!app.mailer) {
    var mailer = require('express-mailer');
    console.log('[MAIL] Mailer using user ' + app.config.mail.auth.user);
    return mailer.extend(app, {
      from: app.config.mail.auth.user,
      Host: 'smtp.gmail.com',
      secureConnection: true,
      port: 465,
      transportMethod: 'SMTP',
      auth: {
        user: app.config.mail.auth.user,
        pass: app.config.mail.auth.pass
      }
    });
  }
};

//# some.js
require('./config/mailer.js)(app);
app.mailer.send("path/to/express/views/some_view", {
  to: ctx.email,
  subject: ctx.subject,
  context: ctx
}, function(err) {
  if (err) {
    console.error("[MAIL] Email failed", err);
    return;
  }
  console.log("[MAIL] Email sent");
});

//#some_view.ejs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title><%= subject %></title>
  </head>
  <body>
  ... 
  </body>
</html>
3
malix
exports.mailSend = (res, fileName, object1, object2, to, subject,   callback)=> {
var smtpTransport = nodemailer.createTransport('SMTP',{ //smtpTransport
Host: 'hostname,
port: 1234,
secureConnection: false,
//   tls: {
//     ciphers:'SSLv3'
// },
auth: {
  user: 'username',
  pass: 'password'
}

});
res.render(fileName, {
info1: object1,
info2: object2
}, function (err, HTML) {

smtpTransport.sendMail({
  from: "[email protected]",
  to: to,
  subject: subject,
  html: HTML
}
  , function (err, responseStatus) {
      if(responseStatus)
    console.log("checking dta", responseStatus.message);
    callback(err, responseStatus)
  });
});
}

コードにsecureConnectionタイプを追加する必要があります。

2
aaditya

なんらかの理由で、安全性の低いアプリ設定を許可するだけでは、キャプチャーしても機能しませんでした。 IMAP構成を有効にする別の手順を実行する必要がありました。

Googleのヘルプページから: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • 右上の[設定]設定をクリックします。
  • 設定をクリックします。
  • [転送とPOP/IMAP]タブをクリックします。
  • [IMAPアクセス]セクションで、[IMAPを有効にする]を選択します。
  • [変更を保存]をクリックします。
2
mel3kings

1-クライアントブラウザを再起動する前に、低レベルの電子メールを許可するためのGmail認証は受け入れられません。

const routes = require('express').Router();
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');



routes.get('/test', (req, res) => {
  res.status(200).json({ message: 'test!' });
});

routes.post('/Email', (req, res) =>{

    var smtpTransport = nodemailer.createTransport({
        Host: "smtp.gmail.com",
        secureConnection: false,
        port: 587,
        requiresAuth: true,
        domains: ["gmail.com", "googlemail.com"],
        auth: {
            user: "your gmail account", 
            pass: "your password*"
        }
});  

  var mailOptions = {
      from: '[email protected]',
      to:'[email protected]',
      subject: req.body.subject,
      //text: req.body.content,
      html: '<p>'+req.body.content+' </p>'
  };

  smtpTransport.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log('Error while sending mail: ' + error);
    } else {
        console.log('Message sent: %s', info.messageId);
    }
    smtpTransport.close();
});  

})

module.exports = routes;
1
Hamit YILDIRIM

nodemailerの最初のインストール

npm install nodemailer  --save

jsファイルにインポート

const nodemailer = require("nodemailer");

const smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "[email protected]",
        pass: "password"
    },
    tls: {
        rejectUnauthorized: false
    }
});






 const mailOptions = {
        from: "[email protected]",
        to: [email protected],
        subject: "Welcome to ",
        text: 'hai send from me'.
    };


    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
        }
        else {
            console.log("mail sent");
        }
    });

私のアプリケーションで作業する

1
arul mb

Nodemailer 0.4.1の古いバージョンを使用していて、この問題がありました。 0.5.15に更新しましたが、すべて正常に動作しています。

Package.jsonを編集して変更を反映します

npm install
1
user1071182