Il Simple Mail Transfer Protocol (SMTP) è uno dei protocolli più utilizzati per l’invio di email. In questo articolo vedremo come implementare un server SMTP di base in Java. Questa guida è pensata per chi vuole comprendere il funzionamento di un server SMTP e sperimentare con Java.
Un server SMTP di base ascolta le connessioni in ingresso su una porta specifica (generalmente la porta 25). La struttura di base include:
- Apertura di un socket server.
- Gestione delle connessioni dei client.
- Risposte ai comandi SMTP.
import java.io.*;
import java.net.*;
public class SMTPServer {
private static final int PORT = 2525; // Porta di esempio
public static void main(String[] args) {
System.out.println("Avviando il server SMTP sulla porta " + PORT);
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("Connessione accettata da " + clientSocket.getInetAddress());
new Thread(new ClientHandler(clientSocket)).start();
}
} catch (IOException e) {
System.err.println("Errore nel server: " + e.getMessage());
}
}
private static class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
// Saluto iniziale del server SMTP
out.println("220 Simple SMTP Server");
String line;
while ((line = in.readLine()) != null) {
System.out.println("Ricevuto: " + line);
if (line.startsWith("HELO")) {
out.println("250 Hello " + line.substring(5));
} else if (line.startsWith("MAIL FROM:")) {
out.println("250 OK");
} else if (line.startsWith("RCPT TO:")) {
out.println("250 OK");
} else if (line.equals("DATA")) {
out.println("354 End data with <CR><LF>.<CR><LF>");
StringBuilder data = new StringBuilder();
while ((line = in.readLine()) != null) {
if (line.equals(".")) {
break;
}
data.append(line).append("\n");
}
System.out.println("Messaggio ricevuto:\n" + data);
out.println("250 OK");
} else if (line.equals("QUIT")) {
out.println("221 Bye");
break;
} else {
out.println("502 Command not implemented");
}
}
} catch (IOException e) {
System.err.println("Errore durante la comunicazione con il client: " + e.getMessage());
} finally {
try {
clientSocket.close();
} catch (IOException e) {
System.err.println("Errore durante la chiusura del socket: " + e.getMessage());
}
}
}
}
}
Conclusione
Creare un server SMTP di base in Java è un ottimo modo per apprendere i fondamenti del protocollo e della programmazione di rete. Questo esempio può essere esteso per creare un server SMTP completo o integrato in progetti più complessi.