mirror of
https://github.com/ION606/MailPocket.git
synced 2026-05-14 22:06:55 +00:00
161 lines
4.8 KiB
Markdown
161 lines
4.8 KiB
Markdown
# MailPocket
|
||
|
||
*MailPocket* is inspired by the idea of a pocket—a small, handy container designed to securely hold valuable items. In this case, it’s an extremely lightweight “pocket” for safely collecting email form submissions written in Go.
|
||
|
||
This project provides two independent server implementations:
|
||
|
||
1. **Batched Write Server**: A dependency-free server that stores emails in a CSV file.
|
||
2. **SQLite Server**: A server that uses SQLite for reliable and structured email storage.
|
||
|
||
Both servers are designed to be simple, efficient, and easy to deploy.
|
||
|
||
---
|
||
|
||
## Features
|
||
|
||
- **Batched Write Server**:
|
||
- No external dependencies.
|
||
- Stores emails in a CSV file (`emails.csv`).
|
||
- Batches writes to reduce disk I/O.
|
||
- Lightweight and minimalistic.
|
||
|
||
- **SQLite Server**:
|
||
- Uses SQLite for structured and reliable email storage.
|
||
- Prevents duplicate emails with a unique constraint.
|
||
- Easy to query and manage stored emails.
|
||
- Slightly more robust and feature-rich.
|
||
|
||
---
|
||
|
||
## Getting Started
|
||
|
||
### Prerequisites
|
||
|
||
- Go 1.20 or higher.
|
||
- For the SQLite Server, the `modernc.org/sqlite` dependency will be installed automatically.
|
||
|
||
---
|
||
|
||
### Running the Servers
|
||
1.0 Clone the repository:
|
||
```bash
|
||
git clone https://github.com/your-username/forms-server.git
|
||
cd forms-server
|
||
```
|
||
1.1 ENV
|
||
- create an env file with `ADMIN_PASSWORD=your_password_here` in it
|
||
- put this in the base directory (i.e. on the same level as the Dockerfiles/Makefile)
|
||
|
||
2.0 Using the Makefile:
|
||
- ```bash
|
||
make run-batched # for CSV-based
|
||
```
|
||
- ```bash
|
||
make run-sqlite # for SQLite-based
|
||
```
|
||
|
||
2.1 **Batched Write Server**:
|
||
- Navigate to the `batched-server` directory:
|
||
```bash
|
||
cd batched-server
|
||
```
|
||
- Run the server manually:
|
||
```bash
|
||
go run main.go
|
||
```
|
||
- The server will start on `http://localhost:3000`.
|
||
|
||
2.2 **SQLite Server**:
|
||
- Navigate to the `sqlite-server` directory:
|
||
```bash
|
||
cd sqlite-server
|
||
```
|
||
- Install dependencies (if not already installed):
|
||
```bash
|
||
go mod tidy
|
||
```
|
||
- Run the server manually:
|
||
```bash
|
||
go run main.go
|
||
```
|
||
- The server will start on `http://localhost:3000`.
|
||
|
||
---
|
||
|
||
### API Endpoints
|
||
|
||
Both servers expose the following endpoints:
|
||
|
||
- **`GET /`**:
|
||
- Returns a `200 OK` status with a message indicating the server is running.
|
||
- Example response:
|
||
```json
|
||
"Batched Write Server is running"
|
||
```
|
||
|
||
- **`POST /submit`**:
|
||
- Accepts a form submission with an `email` field.
|
||
- Example request:
|
||
```bash
|
||
curl -X POST -d "email=user@example.com" http://localhost:3000/submit
|
||
```
|
||
- Example response:
|
||
```json
|
||
{"message": "data received"}
|
||
```
|
||
|
||
---
|
||
|
||
## Server Implementations
|
||
|
||
### 1. Batched Write Server (CSV-based)
|
||
|
||
- **Purpose**: A dependency-free implementation for users who want minimalism and simplicity.
|
||
- **Storage**: Emails are appended to a CSV file (`emails.csv`) in the `batched-server` directory.
|
||
- **Performance**: Batches writes to reduce disk I/O, flushing every 5 seconds or after 100 emails.
|
||
- **Format**: Each row in the CSV file contains an email and a timestamp.
|
||
- **Use Case**: Ideal for lightweight deployments where external dependencies are not desired.
|
||
|
||
### 2. SQLite Server
|
||
|
||
- **Purpose**: A more robust implementation using SQLite for structured storage.
|
||
- **Storage**: Emails are stored in an SQLite database (`emails.db`) in the `sqlite-server` directory.
|
||
- **Features**:
|
||
- Prevents duplicate emails with a unique constraint.
|
||
- Tracks the creation timestamp of each email.
|
||
- **Use Case**: Ideal for deployments where data integrity and querying capabilities are important.
|
||
|
||
---
|
||
|
||
## Configuration
|
||
|
||
- **Port**: Both servers run on port `3000` by default. To change the port, modify the `PORT` constant in the respective `main.go` file.
|
||
- **Storage Location**:
|
||
- Batched Write Server: Emails are stored in `batched-server/emails.csv`.
|
||
- SQLite Server: Emails are stored in `sqlite-server/emails.db`.
|
||
|
||
---
|
||
|
||
## Trade-offs
|
||
|
||
| Feature | Batched Write Server (CSV) | SQLite Server |
|
||
|------------------------|------------------------------|-----------------------------|
|
||
| **Dependencies** | None | Requires SQLite dependency |
|
||
| **Storage** | CSV file | SQLite database |
|
||
| **Data Integrity** | Basic | High (prevents duplicates) |
|
||
| **Querying** | Not supported | Supported |
|
||
| **Performance** | High (batched writes) | High (SQLite optimized) |
|
||
| **Use Case** | Minimalist, dependency-free | Robust, structured storage |
|
||
|
||
---
|
||
|
||
## Contributing
|
||
|
||
Contributions are welcome! Please open an issue or submit a pull request for any improvements or bug fixes.
|
||
|
||
---
|
||
|
||
## License
|
||
|
||
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
|