GCP 서버에서 Node.js의 nodemailer와 Mailgun을 사용하여 메일 보내기 기능(TypeScript 버전)
15930 단어 mailgunTypeScriptNode.js
개요
Node.js의 메일 발송 패키지 "Nodemailer를 실시할 때의 비망록입니다.
GPC의 GCE에 구축된 서버는 보안 관점에서 기본 설정에서 단순히 서버에서 25개의 포트나 다른 포트를 통해 메일을 보내는 것을 차단하기 때문에 사용할 수 없습니다.
따라서 GCP가 추천하는 메일 전송 서비스 중 하나인'Mailgun'을 사용하여 GCE의 웹 응용 프로그램에서 메일을 보내는 기능을 설치합니다.
JavaScript에 대한 기사가 많았는데 이번에는 TypeScript 버전으로 기재되었습니다.
전제 조건
단계(메일 서버)
이번에 Mailgun을 사용하기 때문에 그 절차를 기재했습니다.
무료 등록 Mailgun
https://app.mailgun.com/google 등록 후 무료로 사용할 수 있습니다.
(무료는 10000통/월)
본인 인증 완료
이 절차를 진행하지 않으면 프로그램 측에서 메일을 보낼 때 다음과 같은 오류가 발생합니다
인증되지 않은 계정 오류
Please activate your Mailgun account. Check your inbox or log in to your control panel to resend the activation email.
인증용 수신 메일 설정
이 절차를 진행하지 않으면 프로그램 측에서 메일을 보낼 때 다음과 같은 오류가 발생합니다
자신의 도메인이나 메일 수신자 오류가 설정되지 않았습니다.
Sandbox subdomains are for test purposes only. Please add your own domain or add the address to authorized recipients in Account Settings.
엄밀히 말하면, "독자역"이나 "인증용 메일 주소"를 추가로 설정해야 하는 오류입니다.Mailgun 측은 등록 후 자동으로 발행되는 하위 도메인을 사용하는 방법을 추천하지만, 이렇게 되면 Mailgun 측이 등록한 개별적인 인증이 끝난 메일 주소로 날아갈 수 밖에 없기 때문에 이번에는 단독 도메인으로 추가합니다.
도메인 추가
Domains의'Add New Domain'버튼을 눌러 독자적인 도메인을 입력합니다.
도메인 고급 설정
개별 도메인을 취득한 도메인 레지스터로 이동하여 Mailgun의 도메인 세부 화면에 기록된 DNS 리소스 레코드 ("TXT", "MX", "CNAME"유형의 3가지 리소스 정보) 를 모두 레지스터 측에 추가합니다.
인증 대기 도메인
로그인할 때의 메일 주소가 인증이 완료된 알림을 받기 전에 추가 도메인 정보로 메일을 보낼 수 없습니다.
도메인 정보에서 인증이 인증됨으로 표시되면 Mailgun 측 설정이 완료됩니다.
참고로 실제 인증되지 않은 상태에서 응용 프로그램에서 메일을 실행하면 다음과 같은 오류가 발생합니다.
Mailgun 도메인에서 인증되지 않은 오류
The domain is unverified and requires DNS configuration. Log in to your control panel to view required DNS records.
경품: 인증용 수신 메일 설정 (생략 가능)
단독 도메인이 설정되지 않은 상태에서 이 절차를 진행하지 않으면 프로그램 측에서 메일을 보낼 때 다음과 같은 오류가 발생합니다
자신의 도메인이나 메일 수신자 오류가 설정되지 않았습니다.
Sandbox subdomains are for test purposes only. Please add your own domain or add the address to authorized recipients in Account Settings.
인증할 수신자 메일 추가Authorized Recipients에서'Invite New Recipient'버튼을 눌러 수신자에게 설정할 메일 주소를 입력합니다.
설정된 메일 측면에서도 인증을 허가하면 다음과 같이 "검증"이 됩니다.
여기서 마치겠습니다.
단계(응용 프로그램 측)
우선 설치
# パッケージインストール
npm i nodemailer
# 型定義ファイルインストール
npm i -D @types/nodemailer
백엔드 구현
TypeScript에서 다음 백엔드를 생성합니다.
(컨트롤러에 논리를 쓰기는 싫지만 참고원이니 각자 바꾸세요)
import { createTransport, SendMailOptions } from 'nodemailer';
/** メール コントローラ */
export class MailContoroller {
public async send(request: any): Promise<any> {
const response = {
statusCode: 200,
body: { result: 'send mail succeed.' }
};
// SMTPサーバの設定
const smtp = createTransport({
host: 'smtp.mailgun.org',
port: 2525 // Mailgun で使用される SMTP ポート
});
// メール情報の作成
const message: SendMailOptions = {
from: '[email protected]', // 表示名つきにする場合は '表示名<Fromアドレス>' とする
to: '[email protected]', // Toアドレス
subject: '[テスト] nodemailer test mail',
text: 'nodemailer から送信したテストメールです。'
};
// メール送信
try {
const mailRes = await smtp.sendMail(message);
console.log('[送信成功]: ', mailRes);
} catch (error) {
console.log('[送信エラー]: ', error.message);
response.statusCode = 500;
response.body = { result: 'send mail failed.' };
}
return response;
}
}
메일을 보냈는데 오류가 생겨서 못 보냈어요.
메일 발송 시 콘솔 출력 실행
[送信エラー]: all recipients were rejected: 550 5.7.1 Relaying denied
"SMTP 인증"을 설정하지 않으면 보안 제한을 받아 오류가 표시됩니다.SMTP 인증은 보안 제한을 피하고 메시지를 보낼 수 있습니다.
Auth 정보를 옵션으로 설정하면 되지만 좀 번거롭습니다...
이렇게 생각하면 다음과 같은 대응책을 발견할 수 있다.
SMTP 대신 Mailgun API를 사용하여 전자 메일을 보내는 패키지가 배포되었습니다.
다음 패키지 설치
# パッケージ インストール
npm i nodemailer-mailgun-transport
# 型定義ファイルインストール
npm i -D @types/nodemailer-mailgun-transport
백엔드 구현 수정
import { Logger } from '../logger';
import { createTransport, SendMailOptions } from 'nodemailer';
import * as mailgunTransport from 'nodemailer-mailgun-transport'; // 追加
/** メール コントローラ */
export class MailContoroller {
public async send(request: any): Promise<any> {
const response = {
statusCode: 200,
body: { result: 'send mail succeed.' }
};
// Mailgun API キーの設定
const opts: mailgunTransport.Options = {
// https://app.mailgun.com/app/domains/ を参照して下記の値をセット
auth: {
api_key: '1234xxxxxxxxxxxxxxxxxxxxx-01234-abcde', // API Key
domain: 'sandbox1234xxxxxxxxxx.mailgun.org' // Domain
}
};
// SMTPサーバの設定 (mailgunTransport 利用版)
const smtp = createTransport(mailgunTransport(opts));
// SMTPサーバの設定 (nodemailer 利用版)
// const smtp = createTransport({
// host: 'smtp.mailgun.org',
// port: 2525
// });
// メール情報の作成
const message: SendMailOptions = {
from: '[email protected]', // 表示名つきにする場合は '表示名<Fromアドレス>' とする
to: '[email protected]', // Toアドレス
subject: '[テスト] nodemailer test mail',
text: 'nodemailer から送信したテストメールです。'
};
// メール送信
try {
const mailRes = await smtp.sendMail(message);
console.log('[送信成功]: ', mailRes);
} catch (error) {
console.log('[送信エラー]: ', error.message);
response.statusCode = 500;
response.body = { result: 'send mail failed.' };
}
return response;
}
}
지금부터 발송하겠습니다.실행 확인
결과는 다음과 같습니다. 발송에 성공했습니다.
실제로도 메일박스 주소로 날아갔다.
메일 발송 결과_콘솔 디스플레이
...
[送信成功]: {
id: '<[email protected]>',
message: 'Queued. Thank you.',
messageId: '<[email protected]>'
}
여기서 마치겠습니다.
Reference
이 문제에 관하여(GCP 서버에서 Node.js의 nodemailer와 Mailgun을 사용하여 메일 보내기 기능(TypeScript 버전)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomy0610/items/b544cfdbb1a2d42db031텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)