Mah, i modi per realizzarlo sono molteplici.
I questionari sono memorizzati in un DB oppure lo crei al volo e poi lo elimini?
Prendendo come vera la seconda ipotesi, così su 2 piedi mi viene in mente che potresti creare una tabella nel DB contenente 3 campi:
- Uno per l' indirizzo email di chi deve fare il questionario
- Uno con memorizzato un codice univoco creato per riconoscere l' utente
- Campo booleano (SI/NO) 0=non lo ha ancora fatto, 1=lo ha già fatto
Quando mandi la richiesta all' utente di visitare il questionario, crei il codice, lo inserisci nel DB e per email lo alleghi al link in querystring (Visita il questionario blà blà blà...a questo indirizzo http://tuosito.com/questionario.php?code=093edf3)
L' utente quando clicca sul link visiterà la pagina che fa il controllo nel DB per verificare se ha già fatto o no il questionario (campo booleano SI/NO). Se non lo ha ancora fatto una volta concluso, inserisci 1 come valore nel campo booleano per memorizzare che ha fatto il questionario e non può più farlo. Se hai pochi utenti ai quali mandare le richieste puoi anche creare i codici li per li, se invece hai intenzione di mandare migliaia di richieste esiste il modo di creare moltitudini di codici univoci.