메일관리
This commit is contained in:
@@ -119,7 +119,7 @@ export class MailReceiveBasicService {
|
||||
tls: true,
|
||||
};
|
||||
|
||||
// console.log(`📧 IMAP 연결 시도 - 호스트: ${imapConfig.host}, 포트: ${imapConfig.port}, 이메일: ${imapConfig.user}`);
|
||||
// // console.log(`📧 IMAP 연결 시도 - 호스트: ${imapConfig.host}, 포트: ${imapConfig.port}, 이메일: ${imapConfig.user}`);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const imap = this.createImapConnection(imapConfig);
|
||||
@@ -133,7 +133,7 @@ export class MailReceiveBasicService {
|
||||
}, 30000);
|
||||
|
||||
imap.once("ready", () => {
|
||||
// console.log('✅ IMAP 연결 성공! INBOX 열기 시도...');
|
||||
// // console.log('✅ IMAP 연결 성공! INBOX 열기 시도...');
|
||||
clearTimeout(timeout);
|
||||
|
||||
imap.openBox("INBOX", true, (err: any, box: any) => {
|
||||
@@ -143,10 +143,10 @@ export class MailReceiveBasicService {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
// console.log(`📬 INBOX 열림 - 전체 메일 수: ${box.messages.total}`);
|
||||
// // console.log(`📬 INBOX 열림 - 전체 메일 수: ${box.messages.total}`);
|
||||
const totalMessages = box.messages.total;
|
||||
if (totalMessages === 0) {
|
||||
// console.log('📭 메일함이 비어있습니다');
|
||||
// // console.log('📭 메일함이 비어있습니다');
|
||||
imap.end();
|
||||
return resolve([]);
|
||||
}
|
||||
@@ -155,19 +155,19 @@ export class MailReceiveBasicService {
|
||||
const start = Math.max(1, totalMessages - limit + 1);
|
||||
const end = totalMessages;
|
||||
|
||||
// console.log(`📨 메일 가져오기 시작 - 범위: ${start}~${end}`);
|
||||
// // console.log(`📨 메일 가져오기 시작 - 범위: ${start}~${end}`);
|
||||
const fetch = imap.seq.fetch(`${start}:${end}`, {
|
||||
bodies: ["HEADER", "TEXT"],
|
||||
struct: true,
|
||||
});
|
||||
|
||||
// console.log(`📦 fetch 객체 생성 완료`);
|
||||
// // console.log(`📦 fetch 객체 생성 완료`);
|
||||
|
||||
let processedCount = 0;
|
||||
const totalToProcess = end - start + 1;
|
||||
|
||||
fetch.on("message", (msg: any, seqno: any) => {
|
||||
// console.log(`📬 메일 #${seqno} 처리 시작`);
|
||||
// // console.log(`📬 메일 #${seqno} 처리 시작`);
|
||||
let header: string = "";
|
||||
let body: string = "";
|
||||
let attributes: any = null;
|
||||
@@ -225,7 +225,7 @@ export class MailReceiveBasicService {
|
||||
};
|
||||
|
||||
mails.push(mail);
|
||||
// console.log(`✓ 메일 #${seqno} 파싱 완료 (${mails.length}/${totalToProcess})`);
|
||||
// // console.log(`✓ 메일 #${seqno} 파싱 완료 (${mails.length}/${totalToProcess})`);
|
||||
processedCount++;
|
||||
} catch (parseError) {
|
||||
// console.error(`메일 #${seqno} 파싱 오류:`, parseError);
|
||||
@@ -243,18 +243,18 @@ export class MailReceiveBasicService {
|
||||
});
|
||||
|
||||
fetch.once("end", () => {
|
||||
// console.log(`📭 fetch 종료 - 처리 완료 대기 중... (현재: ${mails.length}개)`);
|
||||
// // console.log(`📭 fetch 종료 - 처리 완료 대기 중... (현재: ${mails.length}개)`);
|
||||
|
||||
// 모든 메일 처리가 완료될 때까지 대기
|
||||
const checkComplete = setInterval(() => {
|
||||
// console.log(`⏳ 대기 중 - 처리됨: ${processedCount}/${totalToProcess}, 메일: ${mails.length}개`);
|
||||
// // console.log(`⏳ 대기 중 - 처리됨: ${processedCount}/${totalToProcess}, 메일: ${mails.length}개`);
|
||||
if (processedCount >= totalToProcess) {
|
||||
clearInterval(checkComplete);
|
||||
// console.log(`✅ 메일 가져오기 완료 - 총 ${mails.length}개`);
|
||||
// // console.log(`✅ 메일 가져오기 완료 - 총 ${mails.length}개`);
|
||||
imap.end();
|
||||
// 최신 메일이 위로 오도록 정렬
|
||||
mails.sort((a, b) => b.date.getTime() - a.date.getTime());
|
||||
// console.log(`📤 메일 목록 반환: ${mails.length}개`);
|
||||
// // console.log(`📤 메일 목록 반환: ${mails.length}개`);
|
||||
resolve(mails);
|
||||
}
|
||||
}, 100);
|
||||
@@ -262,7 +262,7 @@ export class MailReceiveBasicService {
|
||||
// 최대 10초 대기
|
||||
setTimeout(() => {
|
||||
clearInterval(checkComplete);
|
||||
// console.log(`⚠️ 타임아웃 - 부분 반환: ${mails.length}/${totalToProcess}개`);
|
||||
// // console.log(`⚠️ 타임아웃 - 부분 반환: ${mails.length}/${totalToProcess}개`);
|
||||
imap.end();
|
||||
mails.sort((a, b) => b.date.getTime() - a.date.getTime());
|
||||
resolve(mails);
|
||||
@@ -278,10 +278,10 @@ export class MailReceiveBasicService {
|
||||
});
|
||||
|
||||
imap.once("end", () => {
|
||||
// console.log('🔌 IMAP 연결 종료');
|
||||
// // console.log('🔌 IMAP 연결 종료');
|
||||
});
|
||||
|
||||
// console.log('🔗 IMAP.connect() 호출...');
|
||||
// // console.log('🔗 IMAP.connect() 호출...');
|
||||
imap.connect();
|
||||
});
|
||||
}
|
||||
@@ -332,9 +332,9 @@ export class MailReceiveBasicService {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
console.log(
|
||||
`📬 INBOX 정보 - 전체 메일: ${box.messages.total}, 요청한 seqno: ${seqno}`
|
||||
);
|
||||
// console.log(
|
||||
// `📬 INBOX 정보 - 전체 메일: ${box.messages.total}, 요청한 seqno: ${seqno}`
|
||||
// );
|
||||
|
||||
if (seqno > box.messages.total || seqno < 1) {
|
||||
console.error(
|
||||
@@ -353,21 +353,21 @@ export class MailReceiveBasicService {
|
||||
let parsingComplete = false;
|
||||
|
||||
fetch.on("message", (msg: any, seqnum: any) => {
|
||||
console.log(`📨 메일 메시지 이벤트 발생 - seqnum: ${seqnum}`);
|
||||
// console.log(`📨 메일 메시지 이벤트 발생 - seqnum: ${seqnum}`);
|
||||
|
||||
msg.on("body", (stream: any, info: any) => {
|
||||
console.log(`📝 메일 본문 스트림 시작 - which: ${info.which}`);
|
||||
// console.log(`📝 메일 본문 스트림 시작 - which: ${info.which}`);
|
||||
let buffer = "";
|
||||
stream.on("data", (chunk: any) => {
|
||||
buffer += chunk.toString("utf8");
|
||||
});
|
||||
stream.once("end", async () => {
|
||||
console.log(
|
||||
`✅ 메일 본문 스트림 종료 - 버퍼 크기: ${buffer.length}`
|
||||
);
|
||||
// console.log(
|
||||
// `✅ 메일 본문 스트림 종료 - 버퍼 크기: ${buffer.length}`
|
||||
// );
|
||||
try {
|
||||
const parsed = await simpleParser(buffer);
|
||||
console.log(`✅ 메일 파싱 완료 - 제목: ${parsed.subject}`);
|
||||
// console.log(`✅ 메일 파싱 완료 - 제목: ${parsed.subject}`);
|
||||
|
||||
const fromAddress = Array.isArray(parsed.from)
|
||||
? parsed.from[0]
|
||||
@@ -415,7 +415,7 @@ export class MailReceiveBasicService {
|
||||
|
||||
// msg 전체가 처리되었을 때 이벤트
|
||||
msg.once("end", () => {
|
||||
console.log(`📮 메일 메시지 처리 완료 - seqnum: ${seqnum}`);
|
||||
// console.log(`📮 메일 메시지 처리 완료 - seqnum: ${seqnum}`);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -426,15 +426,15 @@ export class MailReceiveBasicService {
|
||||
});
|
||||
|
||||
fetch.once("end", () => {
|
||||
console.log(`🏁 Fetch 종료 - parsingComplete: ${parsingComplete}`);
|
||||
// console.log(`🏁 Fetch 종료 - parsingComplete: ${parsingComplete}`);
|
||||
|
||||
// 비동기 파싱이 완료될 때까지 대기
|
||||
const waitForParsing = setInterval(() => {
|
||||
if (parsingComplete) {
|
||||
clearInterval(waitForParsing);
|
||||
console.log(
|
||||
`✅ 파싱 완료 대기 종료 - mailDetail이 ${mailDetail ? "존재함" : "null"}`
|
||||
);
|
||||
// console.log(
|
||||
// `✅ 파싱 완료 대기 종료 - mailDetail이 ${mailDetail ? "존재함" : "null"}`
|
||||
// );
|
||||
imap.end();
|
||||
resolve(mailDetail);
|
||||
}
|
||||
@@ -499,7 +499,7 @@ export class MailReceiveBasicService {
|
||||
|
||||
imap.once("ready", () => {
|
||||
clearTimeout(timeout);
|
||||
console.log(`🔗 IMAP 연결 성공 - 읽음 표시 시작 (seqno=${seqno})`);
|
||||
// console.log(`🔗 IMAP 연결 성공 - 읽음 표시 시작 (seqno=${seqno})`);
|
||||
|
||||
// false로 변경: 쓰기 가능 모드로 INBOX 열기
|
||||
imap.openBox("INBOX", false, (err: any, box: any) => {
|
||||
@@ -509,7 +509,7 @@ export class MailReceiveBasicService {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
console.log(`📬 INBOX 열림 (쓰기 가능 모드)`);
|
||||
// console.log(`📬 INBOX 열림 (쓰기 가능 모드)`);
|
||||
|
||||
imap.seq.addFlags(seqno, ["\\Seen"], (flagErr: any) => {
|
||||
imap.end();
|
||||
@@ -517,7 +517,7 @@ export class MailReceiveBasicService {
|
||||
console.error("❌ 읽음 플래그 설정 실패:", flagErr);
|
||||
reject(flagErr);
|
||||
} else {
|
||||
console.log("✅ 읽음 플래그 설정 성공 - seqno:", seqno);
|
||||
// console.log("✅ 읽음 플래그 설정 성공 - seqno:", seqno);
|
||||
resolve({
|
||||
success: true,
|
||||
message: "메일을 읽음으로 표시했습니다.",
|
||||
@@ -537,7 +537,7 @@ export class MailReceiveBasicService {
|
||||
clearTimeout(timeout);
|
||||
});
|
||||
|
||||
console.log(`🔌 IMAP 연결 시도 중... (host=${imapConfig.host}, port=${imapConfig.port})`);
|
||||
// console.log(`🔌 IMAP 연결 시도 중... (host=${imapConfig.host}, port=${imapConfig.port})`);
|
||||
imap.connect();
|
||||
});
|
||||
}
|
||||
@@ -556,7 +556,7 @@ export class MailReceiveBasicService {
|
||||
|
||||
// 비밀번호 복호화
|
||||
const decryptedPassword = encryptionService.decrypt(account.smtpPassword);
|
||||
// console.log(`🔐 IMAP 테스트 - 이메일: ${account.email}, 비밀번호 길이: ${decryptedPassword.length}`);
|
||||
// // console.log(`🔐 IMAP 테스트 - 이메일: ${account.email}, 비밀번호 길이: ${decryptedPassword.length}`);
|
||||
|
||||
const accountAny = account as any;
|
||||
const imapConfig: ImapConfig = {
|
||||
@@ -566,7 +566,7 @@ export class MailReceiveBasicService {
|
||||
port: this.inferImapPort(account.smtpPort, accountAny.imapPort),
|
||||
tls: true,
|
||||
};
|
||||
// console.log(`📧 IMAP 설정 - 호스트: ${imapConfig.host}, 포트: ${imapConfig.port}, TLS: ${imapConfig.tls}`);
|
||||
// // console.log(`📧 IMAP 설정 - 호스트: ${imapConfig.host}, 포트: ${imapConfig.port}, TLS: ${imapConfig.tls}`);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const imap = this.createImapConnection(imapConfig);
|
||||
@@ -692,32 +692,32 @@ export class MailReceiveBasicService {
|
||||
let parsingComplete = false;
|
||||
|
||||
fetch.on("message", (msg: any, seqnum: any) => {
|
||||
console.log(`📎 메일 메시지 이벤트 발생 - seqnum: ${seqnum}`);
|
||||
// console.log(`📎 메일 메시지 이벤트 발생 - seqnum: ${seqnum}`);
|
||||
|
||||
msg.on("body", (stream: any, info: any) => {
|
||||
console.log(`📎 메일 본문 스트림 시작`);
|
||||
// console.log(`📎 메일 본문 스트림 시작`);
|
||||
let buffer = "";
|
||||
stream.on("data", (chunk: any) => {
|
||||
buffer += chunk.toString("utf8");
|
||||
});
|
||||
stream.once("end", async () => {
|
||||
console.log(
|
||||
`📎 메일 본문 스트림 종료 - 버퍼 크기: ${buffer.length}`
|
||||
);
|
||||
// console.log(
|
||||
// `📎 메일 본문 스트림 종료 - 버퍼 크기: ${buffer.length}`
|
||||
// );
|
||||
try {
|
||||
const parsed = await simpleParser(buffer);
|
||||
console.log(
|
||||
`📎 파싱 완료 - 첨부파일 개수: ${parsed.attachments?.length || 0}`
|
||||
);
|
||||
// console.log(
|
||||
// `📎 파싱 완료 - 첨부파일 개수: ${parsed.attachments?.length || 0}`
|
||||
// );
|
||||
|
||||
if (
|
||||
parsed.attachments &&
|
||||
parsed.attachments[attachmentIndex]
|
||||
) {
|
||||
const attachment = parsed.attachments[attachmentIndex];
|
||||
console.log(
|
||||
`📎 첨부파일 발견 (index ${attachmentIndex}): ${attachment.filename}`
|
||||
);
|
||||
// console.log(
|
||||
// `📎 첨부파일 발견 (index ${attachmentIndex}): ${attachment.filename}`
|
||||
// );
|
||||
|
||||
// 안전한 파일명 생성
|
||||
const safeFilename = this.sanitizeFilename(
|
||||
@@ -729,7 +729,7 @@ export class MailReceiveBasicService {
|
||||
|
||||
// 파일 저장
|
||||
await fs.writeFile(filePath, attachment.content);
|
||||
console.log(`📎 파일 저장 완료: ${filePath}`);
|
||||
// console.log(`📎 파일 저장 완료: ${filePath}`);
|
||||
|
||||
attachmentResult = {
|
||||
filePath,
|
||||
@@ -739,9 +739,9 @@ export class MailReceiveBasicService {
|
||||
};
|
||||
parsingComplete = true;
|
||||
} else {
|
||||
console.log(
|
||||
`❌ 첨부파일 index ${attachmentIndex}를 찾을 수 없음 (총 ${parsed.attachments?.length || 0}개)`
|
||||
);
|
||||
// console.log(
|
||||
// `❌ 첨부파일 index ${attachmentIndex}를 찾을 수 없음 (총 ${parsed.attachments?.length || 0}개)`
|
||||
// );
|
||||
parsingComplete = true;
|
||||
}
|
||||
} catch (parseError) {
|
||||
@@ -759,14 +759,14 @@ export class MailReceiveBasicService {
|
||||
});
|
||||
|
||||
fetch.once("end", () => {
|
||||
console.log('📎 fetch.once("end") 호출됨 - 파싱 완료 대기 시작...');
|
||||
// console.log('📎 fetch.once("end") 호출됨 - 파싱 완료 대기 시작...');
|
||||
|
||||
// 파싱 완료를 기다림 (최대 5초)
|
||||
const checkComplete = setInterval(() => {
|
||||
if (parsingComplete) {
|
||||
console.log(
|
||||
`✅ 파싱 완료 확인 - attachmentResult: ${attachmentResult ? "있음" : "없음"}`
|
||||
);
|
||||
// console.log(
|
||||
// `✅ 파싱 완료 확인 - attachmentResult: ${attachmentResult ? "있음" : "없음"}`
|
||||
// );
|
||||
clearInterval(checkComplete);
|
||||
imap.end();
|
||||
resolve(attachmentResult);
|
||||
@@ -775,9 +775,9 @@ export class MailReceiveBasicService {
|
||||
|
||||
setTimeout(() => {
|
||||
clearInterval(checkComplete);
|
||||
console.log(
|
||||
`⚠️ 타임아웃 - attachmentResult: ${attachmentResult ? "있음" : "없음"}`
|
||||
);
|
||||
// console.log(
|
||||
// `⚠️ 타임아웃 - attachmentResult: ${attachmentResult ? "있음" : "없음"}`
|
||||
// );
|
||||
imap.end();
|
||||
resolve(attachmentResult);
|
||||
}, 5000);
|
||||
@@ -840,7 +840,7 @@ export class MailReceiveBasicService {
|
||||
|
||||
imap.once("ready", () => {
|
||||
clearTimeout(timeout);
|
||||
console.log(`🔗 IMAP 연결 성공 - 메일 삭제 시작 (seqno=${seqno})`);
|
||||
// console.log(`🔗 IMAP 연결 성공 - 메일 삭제 시작 (seqno=${seqno})`);
|
||||
|
||||
imap.openBox("INBOX", false, (err: any) => {
|
||||
if (err) {
|
||||
@@ -857,7 +857,7 @@ export class MailReceiveBasicService {
|
||||
return reject(flagErr);
|
||||
}
|
||||
|
||||
console.log(`✓ 삭제 플래그 추가 완료 (seqno=${seqno})`);
|
||||
// console.log(`✓ 삭제 플래그 추가 완료 (seqno=${seqno})`);
|
||||
|
||||
// 삭제 플래그가 표시된 메일을 영구 삭제 (실제로는 휴지통으로 이동)
|
||||
imap.expunge((expungeErr: any) => {
|
||||
@@ -868,7 +868,7 @@ export class MailReceiveBasicService {
|
||||
return reject(expungeErr);
|
||||
}
|
||||
|
||||
console.log(`🗑️ 메일 삭제 완료: seqno=${seqno}`);
|
||||
// console.log(`🗑️ 메일 삭제 완료: seqno=${seqno}`);
|
||||
resolve({
|
||||
success: true,
|
||||
message: "메일이 삭제되었습니다.",
|
||||
@@ -888,8 +888,10 @@ export class MailReceiveBasicService {
|
||||
clearTimeout(timeout);
|
||||
});
|
||||
|
||||
console.log(`🔌 IMAP 연결 시도 중... (host=${config.host}, port=${config.port})`);
|
||||
// console.log(`🔌 IMAP 연결 시도 중... (host=${config.host}, port=${config.port})`);
|
||||
imap.connect();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const mailReceiveBasicService = new MailReceiveBasicService();
|
||||
|
||||
Reference in New Issue
Block a user