Własna prosta aplikacja pocztowa w PHP i MySQL

Czy kiedykolwiek zastanawiałeś się, jak działają aplikacje pocztowe od środka? Jak Gmail, Outlook czy ProtonMail potrafią wysyłać, odbierać i przechowywać wiadomości? Dzisiaj pokażę Ci, jak stworzyć własną prostą aplikację pocztową w języku PHP z bazą danych MySQL. Nie będziemy robić drugiego Gmaila, ale wystarczająco funkcjonalny system, który pozwoli Ci zrozumieć, jak działają podstawy komunikacji e-mail w sieci.

Co będziemy budować?

Zrobimy mini system poczty, który będzie umożliwiał:

  • Rejestrację i logowanie użytkowników,
  • Wysyłanie wiadomości do innych użytkowników,
  • Odbieranie i wyświetlanie wiadomości,
  • Usuwanie wiadomości.

A wszystko to w PHP + MySQL, bez żadnych zaawansowanych frameworków — czysty, zrozumiały kod, który każdy początkujący programista ogarnie.

Czego potrzebujesz?

Zanim przejdziemy dalej, upewnij się, że masz zainstalowane:

  • PHP (najlepiej wersja 8.0 lub nowsza),
  • MySQL lub MariaDB,
  • Serwer lokalny np. XAMPP lub Laragon,
  • Dowolny edytor kodu, np. VS Code lub Sublime Text.

Struktura projektu

Zacznijmy od stworzenia folderu projektu, np. prosta_poczta.

W środku utwórzmy strukturę plików:

prosta_poczta/
│
├── db.php
├── register.php
├── login.php
├── inbox.php
├── send.php
├── logout.php
└── style.css

To wszystko, czego potrzebujemy, by stworzyć prostą, ale działającą aplikację pocztową.

Krok 1: Tworzymy bazę danych MySQL

Otwórz phpMyAdmin lub konsolę MySQL i utwórz nową bazę danych o nazwie:

CREATE DATABASE poczta_db;
USE poczta_db;

Następnie utwórzmy dwie tabele:

Tabela users

Zawiera dane użytkowników:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL
);

Tabela messages

Przechowuje wysłane wiadomości:

CREATE TABLE messages (
  id INT AUTO_INCREMENT PRIMARY KEY,
  sender VARCHAR(50) NOT NULL,
  receiver VARCHAR(50) NOT NULL,
  subject VARCHAR(100),
  body TEXT,
  sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Teraz możemy przejść do kodowania.

Krok 2: Połączenie z bazą danych (db.php)

<?php
$host = "localhost";
$user = "root";
$pass = "";
$dbname = "poczta_db";

$conn = new mysqli($host, $user, $pass, $dbname);

if ($conn->connect_error) {
  die("Błąd połączenia: " . $conn->connect_error);
}
?>

Ten plik będziemy dołączać w każdym innym pliku PHP, żeby mieć dostęp do bazy danych.

Krok 3: Rejestracja użytkownika (register.php)

<?php
include 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $username = $_POST['username'];
  $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

  $sql = "INSERT INTO users (username, password) VALUES ('$username', '$password')";

  if ($conn->query($sql)) {
    echo "Użytkownik zarejestrowany pomyślnie! <a href='login.php'>Zaloguj się</a>";
  } else {
    echo "Błąd: " . $conn->error;
  }
}
?>

<form method="POST">
  <input type="text" name="username" placeholder="Nazwa użytkownika" required><br>
  <input type="password" name="password" placeholder="Hasło" required><br>
  <button type="submit">Zarejestruj się</button>
</form>

Krok 4: Logowanie użytkownika (login.php)

<?php
session_start();
include 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $username = $_POST['username'];
  $password = $_POST['password'];

  $result = $conn->query("SELECT * FROM users WHERE username='$username'");
  $user = $result->fetch_assoc();

  if ($user && password_verify($password, $user['password'])) {
    $_SESSION['user'] = $username;
    header("Location: inbox.php");
  } else {
    echo "Nieprawidłowy login lub hasło!";
  }
}
?>

<form method="POST">
  <input type="text" name="username" placeholder="Login" required><br>
  <input type="password" name="password" placeholder="Hasło" required><br>
  <button type="submit">Zaloguj</button>
</form>

Krok 5: Wysyłanie wiadomości (send.php)

<?php
session_start();
include 'db.php';

if (!isset($_SESSION['user'])) {
  header("Location: login.php");
  exit;
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $sender = $_SESSION['user'];
  $receiver = $_POST['receiver'];
  $subject = $_POST['subject'];
  $body = $_POST['body'];

  $sql = "INSERT INTO messages (sender, receiver, subject, body)
          VALUES ('$sender', '$receiver', '$subject', '$body')";

  if ($conn->query($sql)) {
    echo "Wiadomość wysłana!";
  } else {
    echo "Błąd: " . $conn->error;
  }
}
?>

<h3>Wyślij wiadomość</h3>
<form method="POST">
  <input type="text" name="receiver" placeholder="Odbiorca" required><br>
  <input type="text" name="subject" placeholder="Temat"><br>
  <textarea name="body" placeholder="Treść wiadomości"></textarea><br>
  <button type="submit">Wyślij</button>
</form>

<a href="inbox.php">Powrót do skrzynki</a>

Krok 6: Skrzynka odbiorcza (inbox.php)

<?php
session_start();
include 'db.php';

if (!isset($_SESSION['user'])) {
  header("Location: login.php");
  exit;
}

$user = $_SESSION['user'];
$result = $conn->query("SELECT * FROM messages WHERE receiver='$user' ORDER BY sent_at DESC");

echo "<h2>Witaj, $user! 📬</h2>";
echo "<a href='send.php'>Napisz wiadomość</a> | ";
echo "<a href='logout.php'>Wyloguj</a><hr>";

if ($result->num_rows > 0) {
  while ($msg = $result->fetch_assoc()) {
    echo "<div style='border:1px solid #ccc; padding:10px; margin:10px 0;'>";
    echo "<b>Od:</b> " . $msg['sender'] . "<br>";
    echo "<b>Temat:</b> " . htmlspecialchars($msg['subject']) . "<br>";
    echo "<p>" . nl2br(htmlspecialchars($msg['body'])) . "</p>";
    echo "<small>Wysłano: " . $msg['sent_at'] . "</small>";
    echo "</div>";
  }
} else {
  echo "Brak wiadomości.";
}
?>

Krok 7: Wylogowanie (logout.php)

<?php
session_start();
session_destroy();
header("Location: login.php");
?>

Bonus: prosty styl (style.css)

Dodajmy trochę koloru, żeby aplikacja nie wyglądała jak z 1998 roku 😄

body {
  font-family: Arial, sans-serif;
  background: #f7f9fb;
  color: #333;
  max-width: 600px;
  margin: 40px auto;
  padding: 20px;
}

form {
  display: flex;
  flex-direction: column;
}

input, textarea, button {
  margin-bottom: 10px;
  padding: 10px;
  font-size: 16px;
}

button {
  background-color: #0078ff;
  color: white;
  border: none;
  cursor: pointer;
}

button:hover {
  background-color: #005fcc;
}

Jak to działa?

W skrócie:

  1. Użytkownik rejestruje się → dane zapisują się w tabeli users.
  2. Loguje się → PHP tworzy sesję.
  3. Wysyła wiadomość → dane trafiają do tabeli messages.
  4. Odbiorca widzi wiadomość w swojej skrzynce odbiorczej.
  5. Wylogowanie niszczy sesję.

Całość działa lokalnie, więc możesz testować bez faktycznego wysyłania e-maili przez serwer SMTP.

Co można ulepszyć?

To oczywiście dopiero początek. Możesz rozbudować projekt o:

  • system folderów („Odebrane”, „Wysłane”, „Kosz”),
  • funkcję odpowiadania na wiadomości,
  • załączniki (upload plików),
  • powiadomienia e-mail,
  • interfejs AJAX / React / Vue.

Możliwości są nieograniczone – ale ten fundament to świetny punkt wyjścia.

Szukasz taniego i dobrego hostingu dla swojej strony www? - Sprawdź Seohost.pl