diff --git a/src/services/exportUserDataToCsv.js b/src/services/exportUserDataToCsv.js index ef6c1dd..dfe57f3 100644 --- a/src/services/exportUserDataToCsv.js +++ b/src/services/exportUserDataToCsv.js @@ -18,20 +18,20 @@ const ses = new AWS.SES({ apiVersion: '2010-12-01' }); /** * 사용자 데이터를 CSV로 추출 + * @param {{ exportAll?: boolean }} reqDto 요청 본문. * @param {{ is_admin: boolean, id: string }} user 인증 정보. - * @param {{ exportAll?: boolean }} body 요청 본문. * @returns {Promise} 응답 DTO. */ -export default async function exportUserDataToCsv(user, body = {}) { +export default async function exportUserDataToCsv(reqDto = {}, user) { // (1) 관리자 권한 체크 - if (!user.is_admin) { + if (!user || !user.is_admin) { return { result: false, message: 'Access denied. Admin permission required.', }; } - const { exportAll = true } = body; + const { exportAll = true } = reqDto; try { serviceLogger.info({ @@ -560,26 +560,49 @@ async function createUserCsvData(user, email) { */ async function sendCsvEmail(email, userId, csvFilePath, recordCount) { const csvContent = fs.readFileSync(csvFilePath); + const fileName = path.basename(csvFilePath); + + // Raw email with attachment + const boundary = `----=_NextPart_${Date.now()}`; + const rawEmail = [ + `From: no-reply@frolog.kr`, + `To: ${email}`, + `Subject: =?UTF-8?B?${Buffer.from('[프롤로그] 서비스 종료 안내').toString('base64')}?=`, + `MIME-Version: 1.0`, + `Content-Type: multipart/mixed; boundary="${boundary}"`, + ``, + `--${boundary}`, + `Content-Type: text/plain; charset=UTF-8`, + `Content-Transfer-Encoding: 8bit`, + ``, + `안녕하세요. 프롤로그입니다.`, + ``, + `프롤로그가 2025년 ㅇ월ㅇ일까지만 서비스를 제공하고 서비스를 종료하게 되었습니다.`, + `저희에게 주신 많은 사랑 감사합니다.`, + ``, + `• 총 ${recordCount}개의 글이 포함되어 있습니다.`, + `• 첨부된 CSV 파일을 다운로드하여 확인하실 수 있습니다.`, + ``, + `지금까지 적은 기록들은 첨부파일로 보내드렸으니 확인 바랍니다.`, + `감사합니다.`, + ``, + `프롤로그 팀 드림`, + ``, + `--${boundary}`, + `Content-Type: text/csv; charset=UTF-8; name="${fileName}"`, + `Content-Disposition: attachment; filename="${fileName}"`, + `Content-Transfer-Encoding: base64`, + ``, + csvContent.toString('base64'), + ``, + `--${boundary}--`, + ].join('\r\n'); await ses - .sendEmail({ - Destination: { - ToAddresses: [email], + .sendRawEmail({ + RawMessage: { + Data: rawEmail, }, - Message: { - Body: { - Text: { - Charset: 'UTF-8', - Data: `안녕하세요. 프롤로그입니다. -프롤로그가 2025년 ㅇ월ㅇ일까지만 서비스를 제공하고 서비스를 종료하게 되었습니다. 저희에게 주신 많은 사랑 감사합니다. 지금까지 적은 기록들은 첨부파일로 보내드렸으니 확인 바랍니다. 감사합니다.`, - }, - }, - Subject: { - Charset: 'UTF-8', - Data: '[프롤로그] 서비스 종료 안내', - }, - }, - Source: 'no-reply@frolog.kr', }) .promise(); }