ui 고치기 전 세이브

This commit is contained in:
leeheejin
2025-10-22 16:06:04 +09:00
parent 79fef2691d
commit 479b0ba3ed
43 changed files with 3828 additions and 228 deletions

View File

@@ -88,6 +88,9 @@ export class MailReceiveBasicService {
port: config.port,
tls: config.tls,
tlsOptions: { rejectUnauthorized: false },
authTimeout: 30000, // 인증 타임아웃 30초
connTimeout: 30000, // 연결 타임아웃 30초
keepalive: true,
});
}
@@ -474,29 +477,47 @@ export class MailReceiveBasicService {
const decryptedPassword = encryptionService.decrypt(account.smtpPassword);
const accountAny = account as any;
const imapPort = accountAny.imapPort || this.inferImapPort(account.smtpPort);
const imapConfig: ImapConfig = {
user: account.email,
password: decryptedPassword,
host: accountAny.imapHost || account.smtpHost,
port: this.inferImapPort(account.smtpPort, accountAny.imapPort),
tls: true,
port: imapPort,
tls: imapPort === 993, // 993 포트면 TLS 사용
};
return new Promise((resolve, reject) => {
const imap = this.createImapConnection(imapConfig);
// 타임아웃 설정
const timeout = setTimeout(() => {
console.error('❌ IMAP 읽음 표시 타임아웃 (30초)');
imap.end();
reject(new Error("IMAP 연결 타임아웃"));
}, 30000);
imap.once("ready", () => {
clearTimeout(timeout);
console.log(`🔗 IMAP 연결 성공 - 읽음 표시 시작 (seqno=${seqno})`);
// false로 변경: 쓰기 가능 모드로 INBOX 열기
imap.openBox("INBOX", false, (err: any, box: any) => {
if (err) {
console.error('❌ INBOX 열기 실패:', err);
imap.end();
return reject(err);
}
console.log(`📬 INBOX 열림 (쓰기 가능 모드)`);
imap.seq.addFlags(seqno, ["\\Seen"], (flagErr: any) => {
imap.end();
if (flagErr) {
console.error("❌ 읽음 플래그 설정 실패:", flagErr);
reject(flagErr);
} else {
console.log("✅ 읽음 플래그 설정 성공 - seqno:", seqno);
resolve({
success: true,
message: "메일을 읽음으로 표시했습니다.",
@@ -507,9 +528,16 @@ export class MailReceiveBasicService {
});
imap.once("error", (imapErr: any) => {
clearTimeout(timeout);
console.error('❌ IMAP 에러:', imapErr);
reject(imapErr);
});
imap.once("end", () => {
clearTimeout(timeout);
});
console.log(`🔌 IMAP 연결 시도 중... (host=${imapConfig.host}, port=${imapConfig.port})`);
imap.connect();
});
}
@@ -774,4 +802,94 @@ export class MailReceiveBasicService {
.replace(/_{2,}/g, "_")
.substring(0, 200); // 최대 길이 제한
}
/**
* IMAP 서버에서 메일 삭제 (휴지통으로 이동)
*/
async deleteMail(accountId: string, seqno: number): Promise<{ success: boolean; message: string }> {
const account = await mailAccountFileService.getAccountById(accountId);
if (!account) {
throw new Error("메일 계정을 찾을 수 없습니다.");
}
// 비밀번호 복호화
const decryptedPassword = encryptionService.decrypt(account.smtpPassword);
// IMAP 설정 (타입 캐스팅)
const accountAny = account as any;
const imapPort = accountAny.imapPort || this.inferImapPort(account.smtpPort);
const config: ImapConfig = {
user: account.smtpUsername || account.email,
password: decryptedPassword,
host: accountAny.imapHost || account.smtpHost,
port: imapPort,
tls: imapPort === 993, // 993 포트면 TLS 사용, 143이면 사용 안함
};
return new Promise((resolve, reject) => {
const imap = this.createImapConnection(config);
// 30초 타임아웃 설정
const timeout = setTimeout(() => {
console.error('❌ IMAP 메일 삭제 타임아웃 (30초)');
imap.end();
reject(new Error("IMAP 연결 타임아웃"));
}, 30000);
imap.once("ready", () => {
clearTimeout(timeout);
console.log(`🔗 IMAP 연결 성공 - 메일 삭제 시작 (seqno=${seqno})`);
imap.openBox("INBOX", false, (err: any) => {
if (err) {
console.error('❌ INBOX 열기 실패:', err);
imap.end();
return reject(err);
}
// 메일을 삭제 플래그로 표시 (seq.addFlags 사용)
imap.seq.addFlags(seqno, ["\\Deleted"], (flagErr: any) => {
if (flagErr) {
console.error('❌ 삭제 플래그 추가 실패:', flagErr);
imap.end();
return reject(flagErr);
}
console.log(`✓ 삭제 플래그 추가 완료 (seqno=${seqno})`);
// 삭제 플래그가 표시된 메일을 영구 삭제 (실제로는 휴지통으로 이동)
imap.expunge((expungeErr: any) => {
imap.end();
if (expungeErr) {
console.error('❌ expunge 실패:', expungeErr);
return reject(expungeErr);
}
console.log(`🗑️ 메일 삭제 완료: seqno=${seqno}`);
resolve({
success: true,
message: "메일이 삭제되었습니다.",
});
});
});
});
});
imap.once("error", (imapErr: any) => {
clearTimeout(timeout);
console.error('❌ IMAP 에러:', imapErr);
reject(imapErr);
});
imap.once("end", () => {
clearTimeout(timeout);
});
console.log(`🔌 IMAP 연결 시도 중... (host=${config.host}, port=${config.port})`);
imap.connect();
});
}
}