smsTOmail
smsTOmail
Sincronizza gli SMS ricevuti tra il telefono e i tuoi altri dispositivi tramite email.
Screenshot
Video
Funzionalità
- 📨 Inoltro automatico SMS — ogni SMS tradizionale (GSM) ricevuto viene inviato via email in tempo reale
- 🔍 Filtri avanzati — includi o escludi SMS per mittente e/o parola chiave
- 🔒 Password cifrata — la password SMTP è protetta con AES-256/GCM tramite Android Keystore
- 📋 Cronologia SMS — log degli SMS ricevuti con stato dell'invio email
- ⚙️ SMTP configurabile — compatibile con Gmail (porta 587 STARTTLS) e provider con SSL diretto (porta 465, es. Aruba)
- 🔄 Retry SMTP — fino a tre tentativi con backoff esponenziale per errori temporanei di rete
- 🔔 Notifiche di errore — avvisi immediati in caso di problemi di autenticazione email
- 🌍 Multilingua — interfaccia in italiano, inglese, spagnolo, portoghese (Brasile), francese e tedesco
Requisiti
Build e installazione
# Clona il repository git clone https://github.com/rsodvd79/smsTOmail.git cd smsTOmail # Build APK debug ./gradlew app:assembleDebug # Linux/macOS gradlew.bat app:assembleDebug # Windows # Test unitari ./gradlew app:testDebugUnitTest # Test strumentati (richiede dispositivo/emulatore connesso) ./gradlew app:connectedDebugAndroidTest # Lint ./gradlew app:lintDebug
Nota Windows: se
JAVA_HOMEpunta a un JDK non valido, impostarlo esplicitamente prima del comando:$env:JAVA_HOME = 'C:\Program Files\Android\Android Studio\jbr'
Compatibilità
Configurazione dell'app
1. Permessi richiesti
Al primo avvio l'app chiede i permessi necessari:
2. Configurazione email
Dalla schermata Configurazione Email puoi scegliere tra due modalità di invio:
🔵 Modalità SMTP (Senza Cloud Console)
Configurazione manuale del server di posta in uscita:
L'app verifica che mittente e destinatario abbiano un formato email valido e che la porta SMTP sia compresa tra 1 e 65535.
🟢 Modalità Gmail API (Con Cloud Console)
Autenticazione OAuth 2.0: l'utente accede con il proprio account Google. Non è necessario inserire password SMTP.
Prerequisiti (operazione una-tantum per lo sviluppatore):
- Crea un progetto su console.cloud.google.com
- Abilita la Gmail API
- Crea credenziali OAuth 2.0 di tipo Android (con l'SHA-1 del certificato di firma)
Per l'utente finale:
Tocca Accedi con Google, scegli l'account Gmail, autorizza l'accesso. Fine.
Campi comuni (entrambe le modalità)
Gmail — Password specifica per app (solo modalità SMTP)
Gmail richiede una password specifica per app al posto della password dell'account:
- Vai su myaccount.google.com/apppasswords
- Crea una nuova password per "smsTOmail"
- Usa quella password nel campo Password dell'app
3. Filtri SMS
Dalla schermata Gestione Filtri puoi creare regole per decidere quali SMS inoltrare:
I campi Mittente e Parola chiave sono entrambi opzionali: lasciare un campo vuoto significa "qualsiasi valore". Il mittente usa un match parziale case-insensitive; la parola chiave usa un match case-insensitive nel testo dell'SMS. I filtri ESCLUDI hanno sempre precedenza sugli INCLUDI. Non è possibile inserire due filtri con lo stesso mittente, parola chiave e tipo.
Se non viene configurato alcun filtro, tutti gli SMS vengono inoltrati.
Limitazione: l'app intercetta solo gli SMS tradizionali (GSM/SS7) tramite il broadcast
SMS_RECEIVED. I messaggi RCS (Rich Communication Services), MMS e i messaggi in-app (WhatsApp, Telegram, ecc.) non vengono intercettati.
Architettura
SmsReceiver (BroadcastReceiver)
└─► SmsForwarder — flusso condiviso: filtri, invio e log
└─► SmsFilterProcessor — valuta i filtri INCLUDE/EXCLUDE
└─► EmailSender — JavaMail SMTP, retry transienti
└─► GmailApiSender — Gmail REST API + OAuth 2.0
└─► Room (AppDatabase)
├─ FilterDao — regole di filtraggio
├─ EmailConfigDao — configurazione email (riga unica, id=0)
└─ SmsLogDao — cronologia SMS + stato invio
NotificationHelper
└─► notifica ad alta priorità in caso di errore di autenticazione/autorizzazione email
UI: Jetpack Compose
├─ MainActivity — cronologia SMS + navigazione
├─ EmailConfigActivity — configurazione SMTP
└─ FilterActivity — gestione filtri
Sicurezza: la password SMTP è cifrata con AES-256-GCM tramite Android Keystore prima di essere salvata in SQLite. Il database è escluso da Auto Backup e trasferimento dispositivo: la chiave Keystore non è ripristinabile, quindi un backup del database conterrebbe dati indecifrabili. Le connessioni SMTP SSL si fidano esclusivamente dell'host configurato; gli indirizzi email e le credenziali non vengono loggati in produzione. I messaggi Gmail API sono costruiti con header sanificati e body codificato MIME.
Changelog
2026.09.02
- Rimosso il foreground service
SmsBackgroundServicee ilBootReceiver: l'inoltro degli SMS avviene interamente inSmsReceiver(registrato nel manifest), quindi il servizio non svolgeva alcuna funzione percepibile dall'utente. Risolve il rifiuto Google Play sulle policy dei servizi in primo piano. - Rimossi i permessi
FOREGROUND_SERVICE,FOREGROUND_SERVICE_DATA_SYNCeRECEIVE_BOOT_COMPLETEDdal manifest: la ricezione SMS via broadcast non richiede né servizi attivi né avvio al boot. - Pulizia: rimosso il permesso
ACCESS_NETWORK_STATE(mai usato), la richiesta runtime dei permessi "normal"INTERNET/ACCESS_NETWORK_STATEinMainActivity, il filecolors.xmlcon i colori inutilizzati del template, illabelridondante diMainActivitynel manifest e un check SDK obsoleto inNotificationHelper.
2026.08.26
- Revisione della scheda Google Play per conformità alle policy sui permessi SMS: nuova descrizione in
store_listing_it.txt, senza riferimenti a backup e codici di autenticazione/OTP, incentrata sulla sincronizzazione degli SMS tra dispositivi (caso d'uso dichiarato in Play Console). - Nessuna modifica funzionale al codice: solo aggiornamento del numero di versione.
2026.08.21
- Aggiunta una schermata di Prominent Disclosure mostrata prima della richiesta di sistema per il permesso
RECEIVE_SMS, per conformità con le policy Google Play sui permessi sensibili: spiega esplicitamente che il permesso serve solo a sincronizzare via email gli SMS in arrivo con altri dispositivi dell'utente. - Resi più espliciti (IT/EN) i messaggi mostrati quando il permesso SMS non viene concesso.
2026.07.31
- Release build con R8 abilitato (
minify+shrinkResources): ilmapping.txtper il deoffuscamento è incluso nell'App Bundle e l'app è più piccola. Aggiunte regole ProGuard per JavaMail. - Configurata l'estrazione dei simboli di debug nativi (
debugSymbolLevel = SYMBOL_TABLE, richiede NDK). Nota: l'unica libreria nativa (libandroidx.graphics.path.sodi Compose) è distribuita già strippata da Google, quindi il relativo avviso di Play Console non è eliminabile. - Fix: la notifica di errore di autenticazione email (
NotificationHelper) ora viene effettivamente mostrata quando l'invio fallisce per credenziali/autorizzazione non valide (prima non veniva mai emessa). - Fix: il database Room è escluso da Auto Backup e trasferimento dispositivo — dopo un restore la chiave Android Keystore non esiste più e la password salvata sarebbe stata indecifrabile e usata silenziosamente come testo corrotto.
- Fix: salvando la configurazione in modalità Gmail API, una porta SMTP invalida viene normalizzata al default
587invece di essere persistita così com'è. - Rimosso codice morto: broadcast locale
SMS_RESULTsenza ricevente,SmsResultFragmentmai usato, dipendenzalocalbroadcastmanagere controllo irraggiungibile suInvalidSecondFactorinMainActivity.
2026.07.29
- Aggiunta validazione di mittente/destinatario email, porta SMTP (
1–65535) e limite della cronologia SMS (minimo1). - Impedito l'inserimento di filtri duplicati; documentato il match parziale case-insensitive del mittente.
- Introdotto
SmsForwarder, che centralizza filtri, invio SMTP/Gmail API e salvataggio nel log perSmsReceivereSmsBackgroundService. - Aggiunto retry SMTP per errori transienti: massimo tre tentativi con backoff esponenziale.
- Rafforzata la sicurezza SMTP e Gmail API: trust SSL limitato all'host configurato, log sensibili disabilitati in produzione e messaggi RFC 2822 sanificati/codificati.
- Corretto l'avvio da boot su Android 14+: nessun servizio viene avviato senza lavoro da eseguire.
2026.05.08
- Aggiunta scelta della modalità di invio email nella schermata Configurazione Email:
- SMTP (Senza Cloud Console) — configurazione manuale del server SMTP (comportamento precedente)
- Gmail API (Con Cloud Console) — autenticazione OAuth 2.0 tramite account Google; nessuna password SMTP richiesta
- Nuovo file
GmailApiSender.kt: invia email via Gmail REST API usando un token OAuth ottenuto daGoogleAuthUtil - Aggiornato
SmsReceiverper instradare l'invio aGmailApiSenderoEmailSenderin base alla modalità configurata - Schema Room aggiornato a versione 7 (nuovi campi
authModeeoauthAccountinemail_config) - Fix: dopo il login Google la UI aggiornava correttamente l'account connesso (rimosso controllo errato su
resultCode) - Fix:
CancellationExceptionnelle coroutine diMainActivitynon viene più loggata come errore
2026.05.07
- Versione aggiornata a 2026.05.07
2026.05.06
- Fix: aggiunto
enableEdgeToEdge()inEmailConfigActivityeFilterActivity(necessario per Android 15+ / API 35+) - Fix:
startForeground()inSmsBackgroundServiceora specificaFOREGROUND_SERVICE_TYPE_DATA_SYNCsu API 29+ (obbligatorio conforegroundServiceTypedichiarato nel manifest) - Fix: sostituito
launchWhenStarted(deprecato) conrepeatOnLifecycle(Lifecycle.State.STARTED)inMainActivity
Privacy
La app non invia dati a server di terze parti. Gli SMS vengono inoltrati direttamente dal dispositivo al server SMTP configurato dall'utente. Consulta privacy_policy_it.html per i dettagli.
Licenza
Distribuito sotto licenza MIT. Vedi LICENSE per i dettagli.
Per il codice sorgente e gli altri progetti visita il profilo GitHub di rsodvd79 .