Написание PHP-скрипта для отправки e-mail с подменой адреса “От кого” (From) требует особого внимания к настройке заголовков и аутентификации отправителя.
Чтобы успешно реализовать такую задачу, важно использовать корректные почтовые серверы и настроить SPF, DKIM и DMARC для обеспечения подлинности домена отправителя. Без этих настроек почтовые серверы могут заблокировать письмо или пометить его как спам. Для повышения надежности рекомендуется использовать SMTP-серверы с аутентификацией через библиотеки, такие как PHPMailer, что позволяет контролировать параметры отправки, включая адрес “От кого” и избегать проблем с доставкой. Правильная настройка этих аспектов гарантирует успешную отправку писем, даже если требуется подмена адреса отправителя.
Вся фишка таких скриптов в том, что отвечать получивший письмо будет на тот адрес, который вы указали в поле “ОТ КОГО”. С таким успехом можно отправить письмо от кого угодно, не имея доступа к почтовому ящику отправителя.
Мы и не приводим демонстрацию работы скрипта на своем сайте, дабы избежать использования рассылки почты не по назначению (с указанием произвольного email отправителя).
Для тестирования формы мы отправили 2 письма от мнимого отправителя с почтой test@test.ru с темой письма – test и содержанием – test:
- На корпоративную почту редакции – никакого письма не дошло, что ожидаемо.
- На почту Google Mail – письмо попало в папку SPAM.
Вот то, что пришло на почту GMAIL в папку СПАМ:

Как видим, адрес отправителя – test@test.ru. Как уже было сказано выше, вся “фишка” этого скрипта в том, что отвечая на письмо, вы ответите на этот же адрес:

Сначала напишем HTML-часть и встроим туда простую проверку на корректность данных на JavaScript, затем напишем PHP часть. А затем мы объясним почему такие скрипты в своем большинстве работать не будут (хотя раньше, лет 10-15 назад все это работало даже на бесплатных хостингах), или же письма будут попадать в папку “СПАМ“:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Форма для отправки e-mail</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.form-container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #f9f9f9;
}
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
}
input[type="email"], input[type="text"], textarea {
width: 100%;
padding: 10px;
margin-bottom: 12px;
border: 1px solid #ccc;
border-radius: 4px;
}
input[type="submit"] {
background-color: #4CAF50;
color: white;
border: none;
padding: 12px 20px;
cursor: pointer;
border-radius: 4px;
}
input[type="submit"]:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="form-container">
<h2>Отправить e-mail</h2>
<form action="send_email.php" method="POST" onsubmit="return validateForm()">
<label for="from">От кого (Email):</label>
<input type="email" id="from" name="from" required>
<label for="to">Кому (Email):</label>
<input type="email" id="to" name="to" required>
<label for="cc">Копия (Email):</label>
<input type="email" id="cc" name="cc">
<label for="subject">Тема:</label>
<input type="text" id="subject" name="subject" required>
<label for="message">Сообщение:</label>
<textarea id="message" name="message" rows="6" required></textarea>
<input type="submit" value="Отправить">
</form>
</div>
<script>
function validateForm() {
const from = document.getElementById('from').value;
const to = document.getElementById('to').value;
const cc = document.getElementById('cc').value;
const subject = document.getElementById('subject').value;
const message = document.getElementById('message').value;
// Проверка обязательных полей
if (!from || !to || !subject || !message) {
alert("Пожалуйста, заполните все обязательные поля.");
return false;
}
// Проверка формата email
const emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
if (!emailPattern.test(from) || !emailPattern.test(to) || (cc && !emailPattern.test(cc))) {
alert("Пожалуйста, введите корректный адрес электронной почты.");
return false;
}
return true;
}
</script>
</body>
</html>
И PHP часть – файл send_email.php:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Получаем данные из формы
$from = filter_var(trim($_POST["from"]), FILTER_SANITIZE_EMAIL);
$to = filter_var(trim($_POST["to"]), FILTER_SANITIZE_EMAIL);
$cc = isset($_POST["cc"]) ? filter_var(trim($_POST["cc"]), FILTER_SANITIZE_EMAIL) : '';
$subject = htmlspecialchars(trim($_POST["subject"]));
$message = htmlspecialchars(trim($_POST["message"]));
// Проверка, что все обязательные поля заполнены и email корректен
if (empty($from) || empty($to) || empty($subject) || empty($message) || !filter_var($from, FILTER_VALIDATE_EMAIL) || !filter_var($to, FILTER_VALIDATE_EMAIL)) {
echo "Пожалуйста, заполните все обязательные поля и убедитесь, что e-mail адреса корректны.";
exit;
}
// Заголовки письма
$headers = "From: " . $from . "\r\n";
if ($cc) {
$headers .= "Cc: " . $cc . "\r\n";
}
$headers .= "Reply-To: " . $from . "\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
// Отправка письма
if (mail($to, $subject, $message, $headers)) {
echo "Ваше письмо было отправлено!";
} else {
echo "Произошла ошибка при отправке письма.";
}
}
Возможные трудности
Если в поле “От кого” (email) указать произвольный адрес, это может стать причиной того, что письма не будут доходить. Давайте рассмотрим, почему так происходит и какие шаги нужно предпринять, чтобы исправить эту проблему.
Основные причины следующие:
Фальшивый “От кого” (Spoofing):
- Почтовые серверы и антиспам-системы могут отклонить или пометить письмо как спам, если оно содержит фальшивый адрес отправителя (например, если указать произвольный адрес, который не совпадает с доменом сервера, отправляющего почту).
- Например, если вы пытаетесь отправить письмо с адреса example@yourdomain.com, но сервер отправки не является частью домена
yourdomain.com, это может быть расценено как попытка подделки (spoofing), и письмо не дойдет до получателя.
Проблемы с SPF (Sender Policy Framework):
- SPF — это механизм проверки подлинности, который позволяет почтовым серверам проверить, что отправляющий сервер имеет право отправлять почту от имени домена, указанного в поле “От кого”.
- Если в поле “От кого” указать произвольный адрес, то может быть нарушена проверка SPF, и почтовый сервер получателя заблокирует письмо или пометит его как спам.
Проблемы с DKIM и DMARC:
- DKIM (DomainKeys Identified Mail) и DMARC (Domain-based Message Authentication, Reporting & Conformance) — это еще два механизма для проверки подлинности отправителя. Они требуют, чтобы письма, отправленные с конкретного домена, имели соответствующие подписи и политики.
- Если e-mail адрес не совпадает с доменом, с которого отправляется письмо, почтовые серверы могут отклонить письмо.
Проблемы с SMTP сервером:
- Если PHP скрипт использует функцию
mail(), она может быть настроена для отправки через сервер, который не соответствует домену “От кого”. Чтобы избежать этих проблем, следует использовать внешний SMTP-сервер для отправки писем, например, черезPHPMailer, с указанием правильных учетных данных и домена отправителя.
Рекомендации, какие мы можем дать в этом случае:
- Настройте SPF, DKIM и DMARC для вашего домена: Убедитесь, что ваш домен настроен для использования SPF, DKIM и DMARC. Это позволит почтовым системам проверять подлинность отправленных писем.
- Использование SMTP-сервера: Вместо использования функции
mail()в PHP, настройте отправку через SMTP-сервер с помощью библиотекиPHPMailer. Это позволит вам точно указать адрес отправителя и другие важные параметры (например, проверку подлинности). - Ну, и, не пользоваться черными методами. Используйте настоящий адрес для поля “От кого”. Очевидно нужно, чтобы адрес в поле “От кого” (например,
yourname@yourdomain.com) соответствовал домену вашего сервера. Это повысит вероятность того, что письма будут доставлены и не помечены как спам.

Я, Итан Картер – американский разработчик и технический автор с более чем 20-летним опытом в системном и прикладном программировании. Мой основной профиль — низкоуровневая разработка на Assembler: 22 года практики, включая глубокую работу с оптимизацией кода, архитектурой процессоров и производительностью критичных по скорости решений. Я защитил PhD dissertation по Assembler, а также более 18 лет работаю с ASP.NET, создавая корпоративные веб-системы, API и масштабируемые backend-решения.
Дополнительно я имею 9 лет опыта в C++ и C#, а также 7 лет практики программирования микроконтроллеров на Assembler. Благодаря моему сочетанию академической подготовки и прикладного инженерного опыта я могу писать статьи на стыке архитектуры ПО, низкоуровневой оптимизации и современной разработки, делая сложные технические темы понятными для профессиональной аудитории.






