Formularz kontaktowy powiązany z Google Gmail SMTP

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.

Hosting Google Firebase: deploy App

      Pokażę jak mniej więcej można skorzystać z darmowego hostingu oferowanego przez Google. Oto kolejne kroki:

  1. Najpierw powinniśmy zainstalować Node.js:
    https://nodejs.org/en

2. Sprawdzenie instalacji w cmd lub terminalu.

3. Instalacja jakiegoś edytora, np. Visual Studio Code.

 

4. Uruchomienie strony Google Firebase.

5. Stworzenie projektu i nadanie mu jakiejś nazwy.

6. Kolejno instalacja firebase w konsoli, narzędzi firebase i zalogowanie się do serwisu.

 

7. I teraz możemy zainicjalizować szablon aplikacji i deployować aplikację na hosting.

Możemy wcześniej w katalogu public zedytować plik index.html. Na przykład tak jak poniżej.

Gotową aplikację możemy podejrzeć pod udostępnionym adresem URL.

Google Firebase to nie tylko hosting. Mamy tu też dostęp m.in. do bazy danych, autentykacji i wielu innych.

Darmowy hosting i AdSense

Po co wydawać pieniądze na płatny hosting, jak można połączyć darmowy hosting z AdSense. Zapewne wiele zależy od dostawcy, ale choćby zwykły Blogger, pisać bloga i zarabiać na reklamach na nim umieszczonych.

A czy tak można? :

Dzięki Bloggerowi możesz zarabiać na swoim blogu, wyświetlając na nim reklamy, np. z AdSense.

Źródło: Umieszczanie reklam na blogu – Blogger – Pomoc

Jest co prawda mocno okrojony i nie można wykonywać kopii bezpieczeństwa, ale jest.

Sposób na zarobek w sieci

Obecnie internet ma prawie każdy. Więc czemu by nie wykorzystać go nie tylko w celu informacyjnym, rozrywkowym, komunikacyjnym, ale również spróbować zarobić poprzez coś co Nas pasjonuje.

I tu prosty przepis na przeobrażenie przyjemności w pieniądze.

1. Temat.

Czyli z czym będzie związana witryna internetowa. Ktoś lubi biegać? Niech pisze o bieganiu. Kto inny czytać? Niech pisze recenzje książek.

2. Domena

Już zawczasu dobrze jest rozejrzeć się za swoim miejscem w sieci, powinna ona być wpadająca w ucho, zawierać jak najwięcej słów kluczowych odpowiednich dla treści strony, ale też niekoniecznie, może to być po prostu imię i nazwisko.

3. Hosting

Wiąże się to z serwerem, na którym będą się znajdowały pliki z zawartością strony.

I tu istnieje wiele rozwiązań.

Można w najtrudniejszym przypadku postawić własny serwer i zarządzać nim, powinien być cały czas pod dostępem sieci, to warunek obowiązkowy.  System jakiś stabilny, np. jakaś dystrybucja Linuksa. Szerokopasmowe połączenie z internetem, taka oddzielna stacja pod serwer. Można najpierw spróbować czegoś podobnego ze zwykłym codziennie używanym komputerem, laptopem, czy stacjonarnym – nieważne. Ale rozwiązanie problemu na tym przykładzie oddzielnego serwera wiąże się z pewnymi kwestiami finansowymi i miejscem na dodatkową stację roboczą.

Istnieją oczywiście darmowe alternatywy, np. :

https://www.000webhost.com/

https://www.cba.pl/pl

https://www.heroku.com/

Wszystkie przeze mnie sprawdzone. I oto jakie wrażenia:

Na webhost pomimo informacji, że nie ma reklam, jak strona zaczęła prawdopodobnie być bardziej popularna lub po upływie czasu, reklamy i tak były. Na cba niestety też. Jedynie na heroku nie ma reklam. Ale to propozycja raczej dla osób, które miały już kontakt z konsolą, i interesuje je bardziej pisanie strony w takich językach, jak np. Ruby czy Java. Których na dwóch pierwszych pozycjach na pewno nie znajdzie. Darmowe heroku wiąże się z pewną pulą dynamicznych godzin pracy serwera.  Nie wiem co się dokładnie dzieje po przekroczeniu limitu, czy jest to ograniczone pasmo przepływu, czy w ogóle dezaktywuje się aplikacja. Ale na szczęście hosting jest skalowalny, więc jak strona zacznie być popularna można za opłatą pominąć te kwestię. Co do dwóch pierwszych to są to typowe PHP-owo MySQL-owe rozwiązania na serwerze współdzielonym z przyjaznym panelem administracyjnym.

Jeżeli ktoś już spróbuje darmowego sposobu i dojdzie do wniosku, że to nie jest to czego dokładnie oczekiwał, zawsze może za drobną opłatą za pierwszy rok skorzystać z oferty takiej jak, np. :

https://www.ovh.pl/hosting/

https://www.nazwa.pl/hosting/

https://home.pl/hosting

https://az.pl/hosting/

To się tyczy pierwszego roku, który zazwyczaj jest w jakiejś promocji, czasami nawet z darmowymi domenami, a po okresie promocyjnym ceny wahają się przeważnie od 300zł/rok.

4. Postawienie strony

Umieszczamy na stronie jak najwięcej słów kluczowych, żeby roboty wyszukiwarek mogły z łatwością znaleźć naszą stronę, którą utworzymy zwykłym Pajączkiem chociażby, albo czymś w rodzaju systemowego Notatnika, jak Notepad++.

Oczywiście lepiej skorzystać z jakiegoś zintegrowanego środowiska programistycznego, typu Eclipse, albo typowo webowego Brackets utworzonego w JavaScript.

Można pominąć kwestię programistyczną i skorzystać z gotowego CMS-a (systemu zarządzania treścią) i można mieć całkiem przyzwoitą stronę nie znając nic HTML-a, CSS, PHP czy też JavaScript-u. Na przykład popularny WordPress czy Joomla (oba wymagają wyłącznie PHP i MySQL-a, więc świetnie nadają się do większości darmowych czy mniej płatnych hostingów).

Prośba o dodanie strony do indeksu:

https://www.google.com/webmasters/tools/submit-url

5. Dodanie reklam.

Dodajemy jak najwięcej i jak największe reklamy, a skąd? Chociażby niejednej osobie obiło się o ucho AdSense Google. Jest to w pełni darmowa propozycja, a pieniądze naliczane są za kliknięcia bądź wyświetlenia reklam.

Nie zapomnijmy o dodaniu linku do rejestracji w serwisie:

https://www.google.com/adsense/start/

6. Publikacja strony.

Starajmy się rozpowszechnić adres naszej strony internetowej, więc gdzie się da, umieszczajmy linki, na blogach czy forach .

Kto chce, może skorzystać z kampanii reklamowej dla własnej strony, czyli AdWords, też od Google np. w stosunku 1:10 (1zł wydana na AdWords jest z zarobionych 10zł na AdSense).

7. Cierpliwość.

Czekamy, ale jeżeli chcemy by strona przychodziła stałe dochody, musimy ciągle pracować nad naszą stroną, tzw. pozycjonowaniem i rozwojem strony, bo kogo interesowałaby informacje sprzed bodajże 5-10lat.