programing

Gmail과 NodeJS가 있는 이메일러 없음

codeshow 2023. 9. 24. 13:11
반응형

Gmail과 NodeJS가 있는 이메일러 없음

NodeJS를 사용하여 연락처 양식을 구현하기 위해 nodeemailer를 사용하려고 하지만 로컬에서만 작동하며 원격 서버에서는 작동하지 않습니다...

내 오류 메시지:

[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('/');
        }
    });
}

다음 url로 이동하여 해결하였습니다(메일을 보내고 싶은 계정으로 Google에 연결되어 있는 상태에서).

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

거기서 보안이 덜한 앱을 활성화했습니다.

다 했어요.

Gmail 연결에 대한 이메일 발송자의 공식 가이드를 참조하십시오.

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

-

이렇게 하면 효과가 있습니다.

  1. 보안이 덜한 앱 사용 - https://www.google.com/settings/security/lesssecureapps
  2. 새 디바이스/서버를 연결할 수 있도록 일시적으로 Captcha를 사용하지 않도록 설정 - https://accounts.google.com/b/0/displayunlockcaptcha

쉬운 솔루션:

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

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  host: 'smtp.gmail.com',
  auth: {
    user: 'somerealemail@gmail.com',
    pass: 'realpasswordforaboveaccount'
  }
}));

var mailOptions = {
  from: 'somerealemail@gmail.com',
  to: 'friendsgmailacc@gmail.com',
  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단계로 가야 했어요.

또한 노데메일러-smtp-transport 패키지를 제거하려고 했는데 놀랍게도 작동합니다. 그러나 시스템을 재시작했을 때 동일한 오류가 발생하여 보안이 덜한 앱을 켜야 했습니다(작업 후 비활성화했습니다).

그런 다음 재미로 오프(보안성이 낮은 앱)로 시도해봤는데 다시 작동했습니다!

Gmail에 접속하려면 XOAuth2 토큰을 사용해야 합니다.걱정할 필요 없습니다. 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);
      });
  });
};

정상 작동됨:

1 - node memailer 설치, 설치되지 않은 경우 패키지 설치(cmd 입력):npm install nodemailer

2- https://myaccount.google.com/lesssecureapps 로 이동하여 Allow less secure apps를 켭니다.

3- 쓰기 코드:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'trueUsername@gmail.com',
        pass: 'truePassword'
    }
});

const mailOptions = {
    from: 'any@any.com', // sender address
    to: 'true@true.com', // 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- 즐겨요!

저도 같은 문제가 있었습니다.구글 보안 설정에서 "보안이 덜한 앱"을 허용하면 작동됩니다!

위의 어떤 해결책도 저에게 효과가 없었습니다.NodeMailer의 설명서에 있는 코드를 사용했습니다.다음과 같습니다.

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

저도 같은 문제가 생겼습니다.localhost에서 시스템을 테스트한 다음 (다른 국가에 위치한) 서버에 배포한 다음 프로덕션 서버에서 시스템을 시도할 때 이 오류가 발생했습니다.고치기 위해 이것들을 시도했습니다.

  1. https://www.google.com/settings/security/lesssecureapps 활성화했지만 내 해결책은 아니었습니다.
  2. https://g.co/allowaccess 나는 제한된 시간 동안 외부에서 접근을 허용했고 이것이 나의 문제를 해결했습니다.

나는 Greg T의 답변에서 언급된 이 기사에서 설명된 가장 간단한 방법은 계정에 대해 2FA를 켠 후 사용 가능한 앱 비밀번호를 만드는 것이었습니다.

myaccount.google.com > 로그인 & 보안 > Google 로그인 > 앱 비밀번호

이렇게 하면 계정에 대한 대체 암호가 제공되고 일반 SMTP 서비스로 nodeemailer를 구성할 수 있습니다.

var smtpTransport = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    auth: {
        user: "username@gmail.com",
        pass: "app password"
    }
});

구글은 Oauth2를 최선의 옵션으로 추천하지만, 이 방법은 쉽고 아직 이 질문에서 언급되지 않았습니다.

추가 팁:또한 "발신지" 주소에 앱 이름을 추가할 수 있으며 지메일은 다른 주소를 사용하려고 할 때처럼 계정 이메일만으로 대체하지 않는다는 사실도 알게 되었습니다.

from: 'My Pro App Name <username@gmail.com>'

많은 답변들은 솔직히 깨끗한 해결책이 아닌 덜 안전한 앱을 허용하라고 조언합니다.

대신 다음 용도에 전용 앱 암호를 생성해야 합니다.

  1. Google 계정에 로그인합니다.
  2. 보안으로 이동
  3. Google 로그인에서 2단계 확인 활성화
  4. Google 로그인에서 App password를 클릭합니다.
  5. 이제 새 암호를 생성합니다.앱을 메일로, 디바이스를 기타(Custom name)로 선택하고 이름을 지정합니다.
  6. 앱 비밀번호 저장

이제 로그인 비밀번호 대신 이 앱 비밀번호를 사용할 수 있습니다.

합니다를 합니다.nodemailer-smtp-transportmodule inside createTransport.

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

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

gmail 계정에서 captchas를 비활성화해 보십시오. 아마도 요청자의 IP 주소를 기반으로 트리거 될 수 있습니다.참조: GMail을 무료 SMTP 서버로 사용하고 captcha를 극복하는 방법

저는 포트 및 보안을 사용하여 이러한 방식으로 작업하고 있습니다(보안 설정 없이 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: 'xxxx@gmail.com', // sender address
    to: 'yyyy@gmail.com', // 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);
}

모든 구성이 여기에 나열되어 있습니다(예 포함).

익스프레스를 쓰시면.express-mailer싸다nodemailer매우 훌륭하고 사용하기 매우 쉽습니다.

//# 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>

어떤 이유에서인지 보안이 덜한 앱 구성을 허용하는 것은 캡차를 허용하는 것조차 저에게는 통하지 않았습니다.IMAP 구성을 사용 가능으로 설정하는 다른 단계를 수행해야 했습니다.

Google의 도움말 페이지: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • 오른쪽 상단에서 Settings Settings(설정)을 클릭합니다.
  • [설정]을 누릅니다.
  • Forwarding and POP/IMAP 탭을 클릭합니다.
  • [IMAP Access] 섹션에서 [IMAP 사용]을 선택합니다.
  • 변경사항 저장을 클릭합니다.

당신의 모든 코드는 괜찮습니다. 남은 것들은 https://myaccount.google.com/security 링크로 이동하는 것뿐입니다.

아래로 스크롤하면 Allow less secure apps: ON and keep on 오류가 없습니다.

그냥 "host"를 추가하면 됩니다.

host: 'smtp.gmail.com'

그런 다음 아래 링크를 클릭하여 "보안성이 낮은 앱"을 활성화합니다.

https://myaccount.google.com/lesssecureapps

Google이 덜 안전한 앱 액세스를 비활성화했습니다. 아래는 Nodejs에서 Gmail을 사용하는 새로운 프로세스입니다.

  1. 이제 Google에서 2단계 검증을 활성화해야 합니다(2단계 인증을 활성화하는 방법).
  2. 앱 특정 암호를 생성해야 합니다.Google계정으로 이동 > 보안
  3. App Password > Select Other를 클릭하시면 App Password가 나옵니다.
  4. 일반 smtp를 이메일과 앱 비밀번호와 함께 사용할 수 있습니다.
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: "mail@from.com",
  to: to,
  subject: subject,
  html: HTML
}
  , function (err, responseStatus) {
      if(responseStatus)
    console.log("checking dta", responseStatus.message);
    callback(err, responseStatus)
  });
});
}

코드에 secureConnection 유형을 추가해야 합니다.

이전 버전의 nodeemailer 0.4.1을 사용하고 있었는데 이 문제가 있었습니다.저는 0.5.15로 업데이트했고 지금은 모든 것이 잘 작동하고 있습니다.

편집된 패키지.json은 그때 변화를 반영합니다.

npm install

다음 항목에 참여하십시오. 1- 클라이언트 브라우저를 다시 시작하기 전에 낮은 수준의 전자 메일을 허용하지 않는 지메일 인증 2- 메일러를 사용하지 않고 전자 메일을 보내고 싶고 xouath2 프로토콜을 사용하고 싶지 않다면 보안 연결로 작성해야 합니다. 아래와 같이 false.

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: 'from@gmail.com',
      to:'to@gmail.com',
      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;

이메일러를 먼저 설치하지 않음

npm install nodemailer  --save

js 파일로 가져오기

const nodemailer = require("nodemailer");

const smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "example@gmail.com",
        pass: "password"
    },
    tls: {
        rejectUnauthorized: false
    }
});






 const mailOptions = {
        from: "example@gmail.com",
        to: sending@gmail.com,
        subject: "Welcome to ",
        text: 'hai send from me'.
    };


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

내 응용프로그램에서 작업하기

Gmail 계정에서 "보안이 덜한 앱 허용"이 필요할 수도 있습니다(아래 끝까지입니다).또한 "Google 계정에 대한 액세스 허용"이 필요할 수도 있습니다.또한 "Google 계정에 대한 액세스 허용"이 필요할 수도 있습니다.

이것은 몇 가지 조사 후에 작동한 나의 Nodemailer 구성입니다.

1단계: 보안이 덜한 앱 사용

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

2단계: Gmail을 위한 Nodeemailer 구성

트랜스포터 설정 : 트랜스포터는 메일을 보낼 수 있는 객체가 될 것입니다.전송 구성 개체, 연결 URL 또는 전송 플러그인 인스턴스입니다.

let transporter = nodemailer.createTransport({
    service: 'gmail',                              // the service used
    auth: {
        user: process.env.EMAIL_FROM,              // authentication details of sender, here the details are coming from .env file
        pass: process.env.EMAIL_FROM_PASSWORD,
    },
});

메시지 쓰기

const message = {
    from: 'myemail@gmail.com',                         // sender email address
    to: "receiver@example.com, receiver2@gmail.com",   // reciever email address
    subject: `The subject goes here`,
    html: `The body of the email goes here in HTML`,
    attachments: [
    {
      filename: `${name}.pdf`,
      path: path.join(__dirname, `../../src/assets/books/${name}.pdf`),
      contentType: 'application/pdf',
    },
  ],

메일 보내기

transporter.sendMail(message, function (err, info) {
    if (err) {                                            // if error
        console.log(err);
    } else {
        console.log(info);                                // if success
    }
});

또한 생산 중인 Vercel lambda에서 실행할 때 e-메일이 전송되지 않는 문제가 있었습니다.

제 경우에 해결된 것은 send Mail Promise가 해결되기를 기다리는 것이었습니다.

또한 이 스레드에서 제안한 것과 같은 e-mailer-smtp-transport는 추가하지 않았지만 아무런 차이가 없다고 생각합니다.

여기에 제 전체 기능이 있습니다.

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


const transporter = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '***@gmail.com',
        pass: process.env.SMTP_PASSWORD,
    },
}));


async function contact(req: any, res: any) {
    try {
        const response = await transporter.sendMail({
            from: '"*** <***gmail.com>', // sender address
            to: "***@gmail.com", // list of receivers
            subject: `***`, // Subject line
            html: `${req.body.message}<br/><br/>${req.body.firstname} ${req.body.lastname} - <b>${req.body.email}</b>`, // html body
        });
    } catch (error: any) {
        console.log(error);
        return res.status(error.statusCode || 500).json({ error: error.message });
    }

    return res.status(200).json({ error: "" });
}

export default contact;

gmail에서는 보안이 덜한 옵션이 더 이상 지원되지 않습니다.

제3자의 이메일 발송을 위해 gmail 역시 사용자 비밀번호를 사용할 수 없습니다.

이제암호를 사용하여 이 문제를 해결해야 합니다.이 링크가 앱 비밀번호 설정에 도움이 되기를 바랍니다.https://support.google.com/mail/answer/185833?hl=en

Yaach가 지적한 바와 같이 2022년 5월 30일 현재 Google은 Less Secure Apps를 더 이상 지원하지 않으며 대신 자체 Gmail API로 전환했습니다.

메일러가 없는 Gmail SMTP의 샘플 코드입니다.

"use strict";
const nodemailer = require("nodemailer");

async function main() {
    let transporter = nodemailer.createTransport({
        host: "smtp.gmail.com",
        transportMethod: "SMTP",
        secureConnection: true,
        port: 465,
        secure: true, // upgrade later with STARTTLS
        auth: {
            user: "yourEmail@gmail.com",
            pass: "Your App  Specific password",
        },
    });

    let info = await transporter.sendMail(
        {
            from: "yourEmail@gmail.com",
            to: "to@gmail.com",
            subject: "Testing Message Message",
            text: "I hope this message gets delivered!",
            html: "<b>Hello world?</b>", // html body
        },
        (err, info) => {
            if (err) {
                console.log(err);
            } else {
                console.log(info.envelope);
                console.log(info.messageId);
            }
        }
    );
}

main();

SendGrid를 실패하지 않고 이메일 배달에 사용할 수 있는 다른 옵션이 있습니다.메일러가 자주 발생할 수 있는 메일에 실패하는 경우가 많습니다.

링크에서 이메일러를 찾을 수 없습니다.

언급URL : https://stackoverflow.com/questions/19877246/nodemailer-with-gmail-and-nodejs

반응형