Many people are going to pronounce "buy", "by", and "bye" exactly the same way. The only way to tell the difference would be from how the word is used in a sentence.
The difference between 'ship' and 'sheep' and 'sheet' and 'shit' is the difference between a tense and a lax vowel. Italian doesn't make use of this distinction, so it's hard for Italians to hear the difference, but it's a perfectly ordinary distinction in vowel quality used in many languages.
There is no difference at all in the pronunciation of 'buy' and 'by'.
This also varies between English accents. Many American-English accents will pronounce "Mary", "merry", and "marry" the same, but in British-English they all sound different.
Ship, sheep buy, by sheet, shit
see also http://www.ecenglish.com/learnenglish/lessons/homophones-sam...
Also english doesn't (compared to italian) is filled with exceptions.