1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import { useTranslation } from '@/i18n';
import { transporter, loadTemplate } from './mailer';
import handlebars from 'handlebars';
interface SendEmailOptions {
to: string;
subject: string;
template: string; // 템플릿 파일명(확장자 제외)
context: Record<string, any>; // 템플릿에 주입할 데이터
cc?: string | string[]; // cc 필드 추가 - 단일 이메일 또는 이메일 배열
attachments?: {
// NodeMailer "Attachment" 타입
filename?: string
path?: string
content?: Buffer | string
// ...
}[]
}
export async function sendEmail({
to,
subject,
template,
context,
cc, // cc 매개변수 추가
attachments = []
}: SendEmailOptions) {
try {
// i18n 설정
const { t, i18n } = await useTranslation(context.language ?? "en", "translation");
// t 헬퍼만 동적으로 등록 (이미 mailer.ts에서 기본 등록되어 있지만, 언어별로 다시 등록)
handlebars.registerHelper("t", function (key: string, options: any) {
// 여기서 i18n은 로컬 인스턴스
return i18n.t(key, options.hash || {});
});
// 템플릿 컴파일 및 HTML 생성
const html = loadTemplate(template, context);
// 이메일 발송
const result = await transporter.sendMail({
from: `"${process.env.Email_From_Name}" <${process.env.Email_From_Address}>`,
to,
cc, // cc 필드 추가
subject,
html,
attachments
});
console.log(`이메일 발송 성공: ${to}`, result.messageId);
return result;
} catch (error) {
console.error(`이메일 발송 실패: ${to}`, error);
throw error;
}
}
|