Pokażę jak można stworzyć prosty formularz kontaktowy na naszej stronie domowej obsługujący SMTP Google Gmaila, PHPMailer bazujący na hostingu lub początkowo na własnym serwerze Apache z obsługą PHP.
Czyli, formularz kontaktowy, który stworzymy będzie przy pomocy PHPMailer-a wysyłał nam na konto Google Gmail dane z tego formularza w postaci nowych emaili.
Zanim opiszę kolejne kroki wykonania, krótka finalna prezentacja.
Oraz wygląd wysłanej wiadomości:
To już wiemy czego możemy oczekiwać, a teraz środowisko w którym będziemy pracować.
Wszystko będzie postawione na serwerze Apache z PHP. Skorzystać można z gotowego zestawu XAMPP lub też samemu oddzielnie postawić serwer z PHP.
Dobrze, teraz tworzymy jakiś katalog w folderze publicznym www, a wewnątrz plik index.html, css, js oraz konfigurujemy w utworzonym pliku html formularz kontaktowy. Tu z polami: name, email, message. Można dodawać inne lub też dowolnie konfigurować.
Załączam plik webowy:
<!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Contact form</title> <!-- Bootstrap CSS --> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom CSS --> <link href="styles.css" rel="stylesheet"> </head> <body> <!-- Contact Section --> <section id="contact" class="bg-light py-5"> <div class="container"> <h2 class="text-center mb-4">Contact</h2> <form action="contact.php" method="post"> <div class="form-group"> <label for="name">Name</label> <input type="text" class="form-control" id="name" name="name" placeholder="Your Name" required> </div> <div class="form-group"> <label for="email">Email address</label> <input type="email" class="form-control" id="email" name="email" placeholder="Your Email" required> </div> <div class="form-group"> <label for="message">Message</label> <textarea class="form-control" id="message" name="message" rows="3" placeholder="Your Message" required></textarea> </div> <button type="submit" class="btn btn-primary">Send</button> </form> </div> </section> <!-- Bootstrap and JavaScript --> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> <script src="scripts.js"></script> </body> </html>
W znajdującym się obecnie katalogu instalujemy composer z linii poleceń:
sudo apt get install composer
W końcowym rezultacie utworzony plik composer.json musi mieć odpowiednio taką zawartość jak poniżej:
{ "require": { "phpmailer/phpmailer": "^6.9", "google/apiclient": "^2.17", "league/oauth2-client": "^2.7", "league/oauth2-google": "^4.0" } }
Teraz tworzymy poprzez konto Gmail nowy Google Cloud Project.
I tak:
stan publikacji – ustawiamy na wersję produkcyjną
Musimy pamiętać, żeby zaznaczyć dane logowania OAuth 2.0 jako Web application
URI przekierowania powinny być następujące:
-http://localhost/callback.php
-http://127.0.0.1/callback.php
Otrzymujemy w wyniku procesu utworzenia projektu:
-identyfikator klienta
-tajny klucz klienta
-stan powinien być włączony
Powinniśmy również zainstalować:
composer require phpmailer/phpmailer
composer require google/apiclient
W celu otrzymania refresh-tokenu wywołujemy plik get_refresh_token.php:
php get_refresh_token.php
Niezbędne będzie utworzenie następujących dwóch plików php:
// get_refresh_token.php <?php require 'vendor/autoload.php'; $client = new Google_Client(); $client->setClientId('tu wstawiamy id klienta z cloud projektu'); $client->setClientSecret('tutaj wstawiamy tajny klucz klienta'); $client->setRedirectUri('http://localhost/callback.php'); $client->addScope('https://mail.google.com/'); $client->setAccessType('offline'); $client->setPrompt('consent'); // Generate the URL for the consent screen $authUrl = $client->createAuthUrl(); echo "Please visit this URL to authorize the application: " . $authUrl . "\n"; // After authorization, Google will redirect to your callback URL with a code // You need to exchange this code for tokens echo "Enter the code you received: "; $authCode = trim(fgets(STDIN)); // Exchange the auth code for tokens $token = $client->fetchAccessTokenWithAuthCode($authCode); if (isset($token['refresh_token'])) { echo "Refresh Token: " . $token['refresh_token'] . "\n"; } else { echo "No refresh token received. Make sure you've set access type to offline and prompted for consent.\n"; } ?>
Oraz:
// callback.php <?php require 'vendor/autoload.php'; $client = new Google_Client(); $client->setClientId('nasz identyfikator klienta'); $client->setClientSecret('tajny klucz klienta'); $client->setRedirectUri('http://localhost/callback.php'); if (isset($_GET['code'])) { $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); $client->setAccessToken($token); // Check if we have a refresh token if (isset($token['refresh_token'])) { $refresh_token = $token['refresh_token']; echo "Refresh Token: " . $refresh_token; // Here you would typically save this refresh token securely for future use } else { echo "No refresh token received."; } } else { echo "No authorization code received."; } ?>
Będzie nam jeszcze potrzebny refresh_token. A to oto sposób na jego uzyskanie:
php get_refresh_token.php
Wszystkie pliki powinny znajdować się w tej samej lokalizacji.
Teraz możemy zająć się tworzeniem głównego pliku PHP – > contact.php odpowiedzialnego za korzystanie z providera Google, PHPMailera i wysyłanie emaila na nasze konto pocztowe.
Poniżej plik contact.php:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); require_once 'vendor/autoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\OAuth; use League\OAuth2\Client\Provider\Google; // Stała konfiguracja $config = [ 'client_id' => 'tu umieszczamy nasze id klienta', 'client_secret' => 'tajny klucz klienta', 'refresh_token' => 'utworzony przez nas refresh_token', 'gmail_address' => 'nasza nazwa konta gmail' ]; // Sprawdź, czy dane formularza zostały przesłane if ($_SERVER["REQUEST_METHOD"] == "POST") { // Pobierz dane z formularza $sender_name = $_POST['name'] ?? ''; $sender_email = $_POST['email'] ?? ''; $message = $_POST['message'] ?? ''; $mail = new PHPMailer(true); try { // Konfiguracja OAuth2 $provider = new Google([ 'clientId' => $config['client_id'], 'clientSecret' => $config['client_secret'], ]); // Wyłącz wyświetlanie logów SMTP $mail->SMTPDebug = SMTP::DEBUG_OFF; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->Port = 587; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->SMTPAuth = true; $mail->AuthType = 'XOAUTH2'; $mail->setOAuth( new OAuth([ 'provider' => $provider, 'clientId' => $config['client_id'], 'clientSecret' => $config['client_secret'], 'refreshToken' => $config['refresh_token'], 'userName' => $config['gmail_address'], ]) ); // Konfiguracja wiadomości $mail->setFrom($config['gmail_address'], 'Contact form'); $mail->addAddress($config['gmail_address'], 'Your name'); $mail->Subject = "New message from $sender_name"; $mail->Body = "You received a new message from:\n\n"; $mail->Body .= "Name: $sender_name\n"; $mail->Body .= "Email: $sender_email\n\n"; $mail->Body .= "Message:\n$message"; $mail->send(); echo '<p style="color: green;">Your message has been sent successfully. Thank you for contacting us!</p>'; } catch (Exception $e) { echo '<p style="color: red;">An error occurred while sending the message. Please try again later.</p>'; error_log("Sending email failed: " . $mail->ErrorInfo . "\n" . $e->getMessage()); } } else { // Wyświetl formularz, jeśli nie został jeszcze przesłany include 'form.html'; } ?>
I na tym kończąc powinniśmy mieć rezultat jak pokazany na samym początku tego posta.