ui 고치기 전 세이브
This commit is contained in:
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user