There are rules - that are almost reliable in distinguishing say 'mitt' from 'mite' (and 'might'). But the only way to distinguish say 'treason' (with /i:/) from 'treachery' (with /e/) is to use a dictionary (or be exposed to a lifetime's native-user input). And distinguishing between the 'long' vowels in 'daughter' and 'laughter' is something that can't be predicted anyway.
Is there any reason for choosing not to use a dictionary? ;-)
b