Реструктуризация контактной формы php


Поскольку я уже не знаком с PHP, мне нужна помощь в некотором кодировании.

У меня есть контактная форма php, которая отлично работает там, где элементы html-формы обрабатываются с использованием javascript и этого кода php:

<?php

    $to = "[email protected]";
    $from = $_REQUEST['email'];
    $name = $_REQUEST['name'];
    $headers = "From: $from";
    $subject = "[Contact form] You have a message from $name.";

    $fields = array();
    $fields{"name"} = "Name";
    $fields{"email"} = "Email";
    $fields{"phone"} = "Phone";
    $fields{"department"} = "Department";
    $fields{"message"} = "Message";

    $body = "Here is what was sent:\n\n"; foreach($fields as $a => $b){   $body .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]); }

    $send = mail($to, $subject, $body, $headers);

?>

Поскольку я хочу обрабатывать отправку почты с помощью SMTP-сервера вместо mail() через локальный хост, я использовал SwiftMailer, за исключением того, что я не могу структурировать код для отправки того же шаблона электронной почты с элементами формы, что и старый.

<?php

require_once 'lib/swift_required.php';

// Create the Transport
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('[email protected]')
  ->setPassword('password')
  ;

/*
You could alternatively use a different transport such as Sendmail or Mail:

// Sendmail
$transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

// Mail
$transport = Swift_MailTransport::newInstance();
*/

// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
// Create a message
$message = Swift_Message::newInstance('[Contact form] You have a message from')
  ->setFrom(array('[email protected]' => 'John Doe'))
  ->setTo(array('[email protected]' => 'A name'))
  ->setBody('Here is the message itself');

// Send the message
$result = $mailer->send($message);
?>

Мы будем очень признательны за любую помощь.

Author: trex005, 2015-07-31

2 answers

Вы все еще можете использовать синтаксический анализ из своей старой программы для создания темы и тела. Затем вы можете просто подключить их к сообщению swift. Смотрите код ниже (Вам нужно только изменить имя пользователя и пароль gmail). Пожалуйста, обратите внимание, что gmail не любит серверы, отправляющие почту от вашего имени, и вам может потребоваться авторизовать ее, заполнив капчу в учетной записи здесь: https://accounts.google.com/displayunlockcaptcha

<?php
$gmail_username = '[email protected]';
$gmail_password = 'password';
$to = "[email protected]";
$from = $_REQUEST['email'];
$name = $_REQUEST['name'];
$subject = "[Contact form] You have a message from $name.";

$fields = array();
$fields{"name"} = "Name";
$fields{"email"} = "Email";
$fields{"phone"} = "Phone";
$fields{"department"} = "Department";
$fields{"message"} = "Message";

$body = "Here is what was sent:\n\n"; foreach($fields as $a => $b){   $body .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]); }

require_once 'lib/swift_required.php';
// Create the Transport
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername($gmail_username)
  ->setPassword($gmail_password)
  ;
// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
// Create a message
$message = Swift_Message::newInstance($subject)
  ->setFrom($gmail_username)
  ->setReplyTo(array($from => $name))
  ->setTo($to)
  ->setBody($body);
// Send the message
$result = $mailer->send($message);
?>
 2
Author: trex005, 2015-08-04 20:43:26

Я думаю, что ответ @trex005 был убедительным, но ваше сообщение о вознаграждении предполагает, что оно было недостаточно подробным. Из-за этого я только добавляю новый ответ с более подробной информацией.

Первая часть SwiftMailer определяет, какой сервер вы собираетесь использовать для отправки почты. Это письмо относится к категории транзакционная электронная почта - это означает, что пользователь что-то сделал для отправки этого электронного письма. Две услуги выделяются для меня как хорошие в этом виде почты: SendGrid и Мандирлл. Я протестировал свой пример с SendGrid, и он отлично работает. Однако ваш вопрос предполагает, что вы хотели бы использовать GMail. Вы не можете использовать GMail для этого.

Google предполагает, что любое электронное письмо, отправляемое на его SMTP-сервер, отправляется для личного использования пользователем, который его аутентифицирует. Если вы попытаетесь отправить электронное письмо с заголовком FROM: с помощью GMail, заголовок FROM: всегда будет изменен Google на пользователя, который предоставили свое имя пользователя и пароль. Обойти это нецелесообразно - потому что GMail не предназначен для такого рода электронной почты.

$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
  ->setUsername('Sendgrid/Mandrill User')     //Replace this with your info
  ->setPassword('Sendgrid/Mandrill Password') //Replace this with your info
  ;

Приведенный выше фрагмент кода точно показывает, как вам нужно пройти аутентификацию с помощью SMTP-сервера.

Трудная часть устранена, поэтому давайте захватим все переменные, передаваемые этому почтовому средству:

$to = "[email protected]";
$from = $_REQUEST['email'];
$name = $_REQUEST['name'];
$subject = "[Contact form] You have a message from $name.";

$fields = array();
$fields{"name"} = "Name";
$fields{"email"} = "Email";
$fields{"phone"} = "Phone";
$fields{"department"} = "Department";
$fields{"message"} = "Message";

$body = "Here is what was sent:\n\n"; 
foreach($fields as $a => $b){   
    $body .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]); 
}

Это было указано в вашем вопросе и работало, поэтому мы можем оставить его в основном как есть. $headers является избыточным, так как заголовки электронной почты будет сгенерирован SwiftMailler, так что он будет удален.

Теперь нам действительно нужно создать сообщение с помощью SwiftMailler:

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance()
  ->setSubject($subject)           //User provided subject
  ->setFrom(array($from => $name)) //The user
  ->setTo($to)                     //This should be you
  ->setBody($body);                //whatever the user wanted to say

Выше приведены все критически важные заголовки, необходимые для отправки электронного письма в соответствии с вашими требованиями. Однако есть и другие варианты, если вам когда-нибудь понадобится его расширить - дополнительную информацию можно найти в документах Swiftmailler.

Наконец, скажите почтовому агенту, чтобы он действительно отправил сообщение:

$mailer->send($message);

Когда все сказано и готово, ваш окончательный сценарий выглядит следующим образом и должен быть заменой копии/вставки для вашего старого (за исключением вашего имени пользователя/пароля).

<?php
require_once 'lib/swift_required.php';

//As previously mentioned, you may also use Mandrill for this.
$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
  ->setUsername(/*Your SendGrid Username*/)
  ->setPassword(/*Your SendGrid Password*/)
  ;

$to = "[email protected]";
$from = $_REQUEST['email'];
$name = $_REQUEST['name'];
$subject = "[Contact form] You have a message from $name.";

$fields = array();
$fields{"name"} = "Name";
$fields{"email"} = "Email";
$fields{"phone"} = "Phone";
$fields{"department"} = "Department";
$fields{"message"} = "Message";

$body = "Here is what was sent:\n\n"; 
foreach($fields as $a => $b){   
    $body .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]); 
}

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance()
  ->setSubject($subject)
  ->setFrom(array($from => $name))
  ->setTo($to)
  ->setBody($body);

$mailer->send($message);
?>
 0
Author: HPierce, 2017-05-23 12:16:42