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:
- Użytkownik rejestruje się → dane zapisują się w tabeli
users. - Loguje się → PHP tworzy sesję.
- Wysyła wiadomość → dane trafiają do tabeli
messages. - Odbiorca widzi wiadomość w swojej skrzynce odbiorczej.
- 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.