nodemailer
を使用して、ノードアプリで簡単な連絡先フォームを作成しようとしています。すべてのメッセージを、この目的のために作成したGmailアカウントから個人のメールに送信します。
クライアント側では、顧客の名前/メール/メッセージを取得してサーバーに送信するだけです。ローカルで正常に動作しますが、(heroku btwに)デプロイすると動作しません。
簡単に検索したところ、Google Developers ConsoleからClientId
とClientSecret
を生成する必要があるようですが、「リフレッシュトークン」の生成に関しては完全に失われています。 。
var smtpTransport = nodemailer.createTransport("SMTP",{
service:"Gmail",
auth:{
XOAuth2: {
user:"[email protected]",
clientId:"",
clientSecret:"",
refreshToken:""
}
}
});
混乱しています:更新トークンとは正確に何で、どのように取得しますか?
この回答の原作者による注釈:
それで、ようやくそれを理解することができました。
Gmail
をNodemailer
とともに使用する必要がある人のために、これに関するリソースがこれ以上見つからなかったことに驚いています私はここで答えを見つけました: http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html
すでにユーザーがあり、うまくいかない場合は、新しいユーザーを作成してみてください。私にとってはそうでした。
これが誰かに役立つことを願っています
乾杯
見つかったドキュメントから ここ :
更新トークンは、ユーザーがアプリケーションにログインしていない間、アプリがGoogle APIに継続的にアクセスできるようにします。
(...)
考慮事項:
コード交換フローを初めて実行するときにのみリフレッシュトークンを取得できるため、リフレッシュトークンを安全かつ永続的に保存してください。
発行される更新トークンの数には制限があります。クライアントとユーザーの組み合わせごとに1つの制限があり、すべてのクライアントでユーザーごとに別の制限があります。アプリケーションが要求する更新トークンが多すぎると、これらの制限に達する可能性があります。その場合、古い更新トークンは機能しなくなります。
オフラインアクセス および 更新トークンの使用 も参照してください。
述べたように ここ 、あなたはすべきです:
PAY SPECIAL ATTENTION TO指定
https://developers.google.com/oauthplayground
as aリダイレクトURIコンソールで新しいユーザーを作成するとき。そうしないと、エラーが発生します。
https://mail.google.com/
nodemailer
が必要とするものです。次に、Authorize APIsボタンをクリックします。実用的なサンプル/コードスニペットを探し回っている人は、アクセストークンと更新トークンを取得できるまで、Radioreveの回答に従ってください。 (基本的に、遊び場に行き、メールとmail.google.comを送信するためのアクセス権を要求していることを確認し、許可を与え、トークンの認証コードを交換します)
私が入力したexpires
時間はnew Date().getTime() + 2000
であり、これは遊び場で見られる有効期限の秒数に近いことに注意してください。アクセストークンと有効期限を正確に入力する必要があったかどうかはわかりません。トークンが自動的に更新されているようです。
ECMAScript 6で記述された次のサンプルコードを使用します。
const user_name = '[email protected]';
const refresh_token = '';
const access_token = '';
const client_id = '';
const client_secret = '';
const email_to = '[email protected]';
const nodemailer = require('nodemailer');
let transporter = nodemailer
.createTransport({
service: 'Gmail',
auth: {
type: 'OAuth2',
clientId: client_id,
clientSecret: client_secret
}
});
transporter.on('token', token => {
console.log('A new access token was generated');
console.log('User: %s', token.user);
console.log('Access Token: %s', token.accessToken);
console.log('Expires: %s', new Date(token.expires));
});
// setup e-mail data with unicode symbols
let mailOptions = {
from : user_name, // sender address
to : email_to, // list of receivers
subject : 'Hello ✔', // Subject line
text : 'Hello world ?', // plaintext body
html : '<b>Hello world ?</b>', // html body
auth : {
user : user_name,
refreshToken : refresh_token,
accessToken : access_token,
expires : 1494388182480
}
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return console.log(error);
}
console.log('Message sent: ' + info.response);
});