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('/');
}
});
}
다음 URL로 이동 하여이 문제를 해결했습니다 (메일을 보내려는 계정으로 Google에 연결되어있는 동안).
https://www.google.com/settings/security/lesssecureapps
보안 수준이 낮은 앱을 활성화했습니다.
끝난
Gmail 연결에 대한 nodemailer의 공식 가이드를 참조하세요.
https://community.nodemailer.com/using-gmail/
-
사용자 한 후에 나를 위해 작동합니다.
- 보안 수준이 낮은 앱 사용 -https : //www.google.com/settings/security/lesssecureapps
- -사용 안 함 보안 문자 일시적 그래서 당신은 새로운 장치 / 서버에 수 있습니다 https://accounts.google.com/b/0/displayunlockcaptcha을
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);
});
});
};
쉬운 솔루션 :
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 로 이동 하여 활성화 / 계속 한 다음 시도하십시오.
나를 위해 1 단계로 이동해야합니다.
나는 또한 nodemailer-smtp-transport 패키지를 제거하려고 시도했지만 놀랍게도 작동합니다. 하지만 시스템을 시작했을 때 오류가 다시 발생했기 때문에 보안 수준이 낮은 앱을 켜야했습니다.
그런 다음 재미를 위해 방금 off (보안 수준이 낮은 앱)로 시도했고 vola 다시 작동했습니다!
나는 같은 문제가 있었다. 내 Google 보안 설정에서 "보안 수준이 낮은 앱" 을 허용 하여 작동했습니다.
나에게도 같은 문제가 발생했습니다. localhost에서 시스템을 테스트 한 다음 다른 국가에있는 서버에 배포 한 다음 서버에서 시스템을 시도 할 때이 오류가 표시되었습니다. 나는 관리자 고치기 위해 시도했다.
- https://www.google.com/settings/security/lesssecureapps 사용 설정했지만 내 솔루션이 아닙니다.
- https://g.co/allowaccess 허용 시간 동안 외부에서 액세스를 허용했는데 이로 인해 문제가 해결되었습니다.
Gmail 계정에서 보안 문자를 사용할 수 있습니다. 요청자의 IP 주소에 따라 트리거 될 수 있습니다. 참조 : Gmail을 무료 SMTP 서버로 사용하고 보안 문자를 극복하는 방법
나를 위해 포트 및 보안을 사용하여 기존 방식으로 작업하고 있습니다 (보안 설정없이 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);
}
nodemailer-smtp-transport
createTransport 내의 모듈을 사용하여 해결 됩니다.
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '*******@gmail.com',
pass: '*****password'
}
}));
위의 솔루션 중 어느 것도 나를 위해 일했습니다. 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
}
});
잘 작동했습니다.
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: '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- 즐기십시오!
Greg T의 답변 에서 언급 된 이 가이드 에서 가장 간단한 방법 은 계정에 대해 2FA를 켠 후 사용할 수있는 앱 비밀번호를 만드는 것입니다.
myaccount.google.com> 로그인 및 보안> Google에 로그인> 앱 비밀번호
이렇게하면 계정에 대한 대체 암호가 제공되고 nodemailer를 일반 SMTP 서비스로 구성하기 만하면됩니다.
var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
auth: {
user: "username@gmail.com",
pass: "app password"
}
});
Google은 Oauth2를 최상의으로 권장하지만 방법은 옵션이 질문에 아직 언급되지 않았습니다.
추가 팁 : 또한 "보낸 사람"주소에 앱 이름을 추가 할 때 Gmail은 다른 주소를 사용할 때 사용할 수 있습니다. 즉.
from: 'My Pro App Name <username@gmail.com>'
Express를 사용하는 경우 매우 멋지게 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>
모든 코드는 괜찮습니다. 남은 것은 https://myaccount.google.com/security 링크로 이동하는 것입니다.
계속 아래로 스크롤하면 보안 수준이 낮은 앱 허용 : ON 및 ON 유지를 유지를 수 있습니다. 오류가 없습니다.
"호스트"만 추가하면 작동합니다.
host: 'smtp.gmail.com'
그런 다음 아래 링크를 클릭하여 "lesssecureapps"를 활성화하십시오.
https://myaccount.google.com/lesssecureapps
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 유형을 추가해야합니다.
어떤 강력한 보안 수준이 낮은 앱 구성을 허용하는 것만으로도 보안 문자가 작동하지 않습니다. IMAP 구성을 활성화하는 다른 단계를 수행해야합니다.
Google 도움말 페이지 : https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin
- 오른쪽 상단에서 설정 설정을 클릭합니다.
- 설정을 클릭하십시오.
- 전달 및 POP / IMAP 탭을 클릭합니다.
- "IMAP 액세스"섹션에서 IMAP 사용을 선택합니다.
- 변경 사항 저장을 클릭하십시오.
이전 버전의 nodemailer 0.4.1을 사용하고 있었는데이 문제가 발생했습니다. 0.5.15로 업데이트했고 이제 모든 것이 잘 작동합니다.
변경 사항을 반영하도록 package.json을 편집했습니다.
npm install
다음 사항에주의하십시오 : 1- 클라이언트 브라우저를 다시 시작하기 전에 낮은 수준의 이메일 허용을위한 Gmail 인증이 수락되지 않습니다. 2- nodemailer로 이메일을 보내고 xouath2 프로토콜을 사용하고 싶지 않은 경우 아래와 같이 secureconnection : 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;
먼저 nodemailer 설치
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");
}
});
내 응용 프로그램에서 작업
참고 URL : https://stackoverflow.com/questions/19877246/nodemailer-with-gmail-and-nodejs
'IT' 카테고리의 다른 글
UIPageViewController : 현재 보이는 뷰를 반환 (0) | 2020.09.08 |
---|---|
목록의 표준 표준 (0) | 2020.09.08 |
클래스 클래스 JavaScript (0) | 2020.09.08 |
PHP의 Try / Catch 블록이 예외를 적용하지 않습니다. (0) | 2020.09.08 |
Ruby에서 DateTime.now를 UTC로 어떻게 변환합니까? (0) | 2020.09.08 |