147 lines
4.4 KiB
JavaScript
147 lines
4.4 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const POP3Client = require('poplib');
|
|
|
|
// メールサーバー設定
|
|
const POP3_HOST = 'sv304.xbiz.ne.jp';
|
|
const POP3_PORT = 110; // POP3(STARTTLS)
|
|
const POP3_USER = 'rpa.mailcheck.001@next-hd.co.jp';
|
|
const POP3_PASS = 'KWtQhG$hf9XF#62$';
|
|
|
|
// EML を保存するフォルダ(必要に応じて変更してください)
|
|
const SAVE_DIR = path.join(__dirname, 'eml_files');
|
|
|
|
// 保存先フォルダを作成
|
|
if (!fs.existsSync(SAVE_DIR)) {
|
|
fs.mkdirSync(SAVE_DIR, { recursive: true });
|
|
}
|
|
|
|
let totalMessages = 0;
|
|
let currentMessage = 1;
|
|
|
|
// STARTTLS(=STLS) を使う POP3 クライアント
|
|
const client = new POP3Client(POP3_PORT, POP3_HOST, {
|
|
tlserrs: false,
|
|
enabletls: true, // STLS で TLS に昇格
|
|
debug: false
|
|
});
|
|
|
|
client.on('error', (err) => {
|
|
console.error('POP3 エラー:', err);
|
|
try {
|
|
client.quit();
|
|
} catch (e) {
|
|
// 無視
|
|
}
|
|
});
|
|
|
|
client.on('connect', () => {
|
|
console.log('POP3 サーバーに接続しました');
|
|
client.login(POP3_USER, POP3_PASS);
|
|
});
|
|
|
|
client.on('invalid-state', (cmd) => {
|
|
console.error('POP3 無効な状態でコマンドが呼ばれました:', cmd);
|
|
});
|
|
|
|
client.on('locked', (cmd) => {
|
|
console.error('POP3 クライアントがロック中です。コマンド:', cmd);
|
|
});
|
|
|
|
client.on('login', (status, rawData) => {
|
|
if (!status) {
|
|
console.error('ログイン失敗:', rawData);
|
|
client.quit();
|
|
return;
|
|
}
|
|
|
|
console.log('ログイン成功');
|
|
client.stat(); // メール件数を取得
|
|
});
|
|
|
|
client.on('stat', (status, data, rawData) => {
|
|
if (!status) {
|
|
console.error('STAT 取得失敗:', rawData);
|
|
client.quit();
|
|
return;
|
|
}
|
|
|
|
totalMessages = data[0]; // [件数, サイズ]
|
|
console.log(`サーバー上のメッセージ数: ${totalMessages}`);
|
|
|
|
if (totalMessages === 0) {
|
|
console.log('新しいメールはありません');
|
|
client.quit();
|
|
return;
|
|
}
|
|
|
|
currentMessage = 1;
|
|
client.retr(currentMessage);
|
|
});
|
|
|
|
client.on('retr', (status, msgNumber, data, rawData) => {
|
|
if (!status) {
|
|
console.error(`メッセージ ${msgNumber} の取得に失敗:`, rawData);
|
|
// 失敗したメッセージは削除せず、次へ進む
|
|
if (msgNumber < totalMessages) {
|
|
currentMessage = msgNumber + 1;
|
|
client.retr(currentMessage);
|
|
} else {
|
|
client.quit();
|
|
}
|
|
return;
|
|
}
|
|
|
|
console.log(`メッセージ ${msgNumber} を取得しました。ファイルへ保存します。`);
|
|
|
|
// 一意なファイル名を生成(メッセージ番号 + タイムスタンプ)
|
|
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
const filename = `message_${String(msgNumber).padStart(4, '0')}_${timestamp}.eml`;
|
|
const filePath = path.join(SAVE_DIR, filename);
|
|
|
|
fs.writeFile(filePath, data, (err) => {
|
|
if (err) {
|
|
console.error(`ファイル保存エラー (${filePath}):`, err);
|
|
// 保存に失敗した場合は削除しない
|
|
if (msgNumber < totalMessages) {
|
|
currentMessage = msgNumber + 1;
|
|
client.retr(currentMessage);
|
|
} else {
|
|
client.quit();
|
|
}
|
|
return;
|
|
}
|
|
|
|
console.log(`メッセージ ${msgNumber} を ${filePath} に保存しました。サーバーから削除します。`);
|
|
client.dele(msgNumber);
|
|
});
|
|
});
|
|
|
|
client.on('dele', (status, msgNumber, rawData) => {
|
|
if (!status) {
|
|
console.error(`メッセージ ${msgNumber} の削除に失敗:`, rawData);
|
|
} else {
|
|
console.log(`メッセージ ${msgNumber} をサーバーから削除しました。`);
|
|
}
|
|
|
|
if (msgNumber < totalMessages) {
|
|
currentMessage = msgNumber + 1;
|
|
client.retr(currentMessage);
|
|
} else {
|
|
console.log('すべてのメッセージの処理が完了しました');
|
|
client.quit();
|
|
}
|
|
});
|
|
|
|
client.on('quit', (status, rawData) => {
|
|
if (!status) {
|
|
console.error('QUIT 失敗:', rawData);
|
|
} else {
|
|
console.log('POP3 セッションを終了しました');
|
|
}
|
|
});
|
|
|
|
// このスクリプトは node autoMailChecker.js で単発実行する想定です。
|
|
// 定期実行する場合は Windows タスクスケジューラ等からこのスクリプトを呼び出してください。
|
|
|