<?php
/*
Plugin Name: Simple Mailer Plus
Description: セキュリティ強化・自動返信+DB保存付きシンプルなメール送信プラグイン
Version: 2.1
Author: matsumo333
*/
define(‘SM_FROM_EMAIL’, ‘info@matsumo333.xsrv.jp’);
define(‘SM_RECAPTCHA_SITE_KEY’, ‘ ‘;
define(‘SM_RECAPTCHA_SECRET_KEY’, ‘ ‘);
// =============================================
// 1️⃣ プラグイン有効化時にテーブルを作成
// =============================================
register_activation_hook(FILE, ‘sm_create_db_table’);
function sm_create_db_table() {
global $wpdb;
$table_name = $wpdb->prefix . ‘simple_mailer_messages’;
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
message TEXT NOT NULL,
recaptcha_score FLOAT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
// =============================================
// 2️⃣ フォームの表示と送信処理
// =============================================
function sm_display_form() {
$html = ”; $html .= wp_nonce_field(‘sm_send_mail’, ‘sm_nonce’, true, false); $html .= ‘ ‘;
// reCAPTCHA スクリプト
$html .= '
<script src="https://www.google.com/recaptcha/api.js?render=' . SM_RECAPTCHA_SITE_KEY . '"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute("' . SM_RECAPTCHA_SITE_KEY . '", {action: "submit"}).then(function(token) {
document.getElementById("sm_token").value = token;
});
});
</script>';
// ===== 送信処理 =====
if (isset($_POST['sm_submit']) && isset($_POST['sm_nonce']) && wp_verify_nonce($_POST['sm_nonce'], 'sm_send_mail')) {
// reCAPTCHA 検証
$token = sanitize_text_field($_POST['sm_token']);
$response = wp_remote_get("https://www.google.com/recaptcha/api/siteverify?secret=" . SM_RECAPTCHA_SECRET_KEY . "&response=" . $token);
$result = json_decode(wp_remote_retrieve_body($response), true);
$score = isset($result['score']) ? floatval($result['score']) : 0;
if (empty($result['success']) || $score < 0.5) {
return '<div style="color:red;">スパムの可能性があるため送信できませんでした。</div>';
}
// フォームデータの整形
$name = sanitize_text_field($_POST['sm_name']);
$email = sanitize_email($_POST['sm_email']);
$message = sanitize_textarea_field($_POST['sm_message']);
// ===== ① データベースへ保存 =====
global $wpdb;
$table_name = $wpdb->prefix . 'simple_mailer_messages';
$wpdb->insert(
$table_name,
array(
'name' => $name,
'email' => $email,
'message' => $message,
'recaptcha_score' => $score
),
array('%s', '%s', '%s', '%f')
);
// ===== ② メール送信 =====
$to = get_option('admin_email');
$subject = "【お問い合わせ】from {$name}";
$body = "名前: {$name}\nメール: {$email}\n\nメッセージ:\n{$message}";
$headers = array(
"From: お問い合わせフォーム <" . SM_FROM_EMAIL . ">",
"Reply-To: {$email}"
);
// 自動返信メール
$user_subject = "【自動返信】お問い合わせありがとうございます";
$user_body = "{$name} 様\n\nこの度はお問い合わせありがとうございます。\n以下の内容で受け付けました。\n\n---\n{$message}\n---\n\n担当者より折り返しご連絡いたします。\n\n----------------------------------\nFood Science 運営\n" . home_url() . "\n----------------------------------";
$user_headers = array("From: Food Science <" . SM_FROM_EMAIL . ">");
$admin_sent = wp_mail($to, $subject, $body, $headers);
$user_sent = wp_mail($email, $user_subject, $user_body, $user_headers);
if ($admin_sent && $user_sent) {
$html .= '<div style="color: green;">メールを送信し、データを保存しました。ありがとうございます!</div>';
} else {
$html .= '<div style="color: red;">送信に失敗しました。</div>';
}
}
return $html;
}
add_shortcode(‘simple_mail_form’, ‘sm_display_form’);

コメント