|
|
|
@@ -1,25 +1,16 @@
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common';
|
|
|
|
|
import { ConfigService } from '@nestjs/config';
|
|
|
|
|
|
|
|
|
|
// 메일 발송 서비스 (플레이스홀더) —
|
|
|
|
|
// 현재는 실제 SMTP 전송 대신 백엔드 로그로 대체한다.
|
|
|
|
|
// 추후 nodemailer 등 도입 시 이 서비스 내부 구현만 교체하면 호출부는 그대로 유지된다.
|
|
|
|
|
// 현재는 실제 SMTP 전송 대신 백엔드 로그로 대체한다(개발/운영 공통).
|
|
|
|
|
// 실 메일러(nodemailer 등) 도입 전까지는 인증/재설정 링크를 로그에서 확인한다.
|
|
|
|
|
// ⚠️ 보안: 링크에는 원문 토큰이 포함된다. 실 메일러 도입 시 반드시 이 로그 출력을 제거하고
|
|
|
|
|
// 실제 이메일 전송으로 교체할 것(운영 로그에 토큰을 남기지 않기 위함).
|
|
|
|
|
@Injectable()
|
|
|
|
|
export class MailService {
|
|
|
|
|
private readonly logger = new Logger(MailService.name);
|
|
|
|
|
|
|
|
|
|
constructor(private readonly config: ConfigService) {}
|
|
|
|
|
|
|
|
|
|
// 가입 인증 메일 — 개발 환경에서만 인증 링크(원문 토큰 포함)를 로그로 출력한다.
|
|
|
|
|
// 운영 환경에서는 토큰이 로그에 남지 않도록 수신자만 기록한다(실 메일러로 교체 전제).
|
|
|
|
|
// 가입 인증 메일 — 실 메일러 전까지 인증 링크(원문 토큰 포함)를 로그로 출력한다(개발/운영 공통).
|
|
|
|
|
sendVerificationEmail(to: string, name: string, verifyUrl: string): void {
|
|
|
|
|
const isProd = this.config.get<string>('NODE_ENV') === 'production';
|
|
|
|
|
if (isProd) {
|
|
|
|
|
this.logger.log(
|
|
|
|
|
`[메일 발송 - 가입 인증] 수신자=${to} (인증 링크는 보안상 로그에 남기지 않음 — 실 메일러 필요)`,
|
|
|
|
|
);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.logger.log(
|
|
|
|
|
[
|
|
|
|
|
'',
|
|
|
|
@@ -34,16 +25,8 @@ export class MailService {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 비밀번호 재설정 메일 — 개발 환경에서만 재설정 링크(원문 토큰 포함)를 로그로 출력한다.
|
|
|
|
|
// 운영 환경에서는 토큰이 로그에 남지 않도록 수신자만 기록한다(실 메일러로 교체 전제).
|
|
|
|
|
// 비밀번호 재설정 메일 — 실 메일러 전까지 재설정 링크(원문 토큰 포함)를 로그로 출력한다(개발/운영 공통).
|
|
|
|
|
sendPasswordResetEmail(to: string, name: string, resetUrl: string): void {
|
|
|
|
|
const isProd = this.config.get<string>('NODE_ENV') === 'production';
|
|
|
|
|
if (isProd) {
|
|
|
|
|
this.logger.log(
|
|
|
|
|
`[메일 발송 - 비밀번호 재설정] 수신자=${to} (재설정 링크는 보안상 로그에 남기지 않음 — 실 메일러 필요)`,
|
|
|
|
|
);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.logger.log(
|
|
|
|
|
[
|
|
|
|
|
'',
|
|
|
|
|