feat(store): お問い合わせフォームを Resend API に切り替え(Formspree 廃止)
This commit is contained in:
parent
100064693d
commit
b00e31cb90
53
server.js
53
server.js
|
|
@ -3203,6 +3203,59 @@ ${excerpt}
|
||||||
req2.end();
|
req2.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// POST /store/contact — posimai-store お問い合わせフォーム
|
||||||
|
r.post('/store/contact', async (req, res) => {
|
||||||
|
const { name, email, type, subject, message } = req.body || {};
|
||||||
|
if (!name || !email || !message) {
|
||||||
|
return res.status(400).json({ error: 'name, email, message は必須です' });
|
||||||
|
}
|
||||||
|
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
||||||
|
return res.status(400).json({ error: 'メールアドレスの形式が不正です' });
|
||||||
|
}
|
||||||
|
if (!process.env.RESEND_API_KEY) {
|
||||||
|
console.error('[store/contact] RESEND_API_KEY が未設定');
|
||||||
|
return res.status(503).json({ error: 'メール送信が設定されていません' });
|
||||||
|
}
|
||||||
|
const typeLabel = {
|
||||||
|
purchase: '購入・決済について',
|
||||||
|
license: 'ライセンス・アクセス権について',
|
||||||
|
refund: '返金について',
|
||||||
|
usage: '使い方・機能について',
|
||||||
|
bug: '不具合の報告',
|
||||||
|
other: 'その他',
|
||||||
|
}[type] || type || '(未選択)';
|
||||||
|
try {
|
||||||
|
const emailRes = await fetch('https://api.resend.com/emails', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': `Bearer ${process.env.RESEND_API_KEY}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
from: 'Posimai Store <hello@soar-enrich.com>',
|
||||||
|
to: ['posimai.project@gmail.com'],
|
||||||
|
reply_to: email,
|
||||||
|
subject: `[Store お問い合わせ] ${typeLabel}`,
|
||||||
|
html: `<p><strong>種別:</strong> ${typeLabel}</p>
|
||||||
|
<p><strong>名前:</strong> ${name}</p>
|
||||||
|
<p><strong>メール:</strong> ${email}</p>
|
||||||
|
${subject ? `<p><strong>件名:</strong> ${subject}</p>` : ''}
|
||||||
|
<p><strong>メッセージ:</strong></p>
|
||||||
|
<pre style="white-space:pre-wrap">${message}</pre>`,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
if (!emailRes.ok) {
|
||||||
|
const errBody = await emailRes.text();
|
||||||
|
console.error('[store/contact] Resend error:', emailRes.status, errBody);
|
||||||
|
return res.status(500).json({ error: 'メール送信に失敗しました' });
|
||||||
|
}
|
||||||
|
res.json({ ok: true });
|
||||||
|
} catch (e) {
|
||||||
|
console.error('[store/contact] fetch error:', e.message);
|
||||||
|
res.status(500).json({ error: 'Internal server error' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue