A client-side solution based on cookies or localStorage will cover an honest user with a single browser, which is the majority of cases (so you might as well do it). It will not do anything at all to prevent fraud from anyone with malice and any amount of technical knowledge, so you're going to want to also include a check on the other side of the trust boundary (on the server).
A determined attacker will be able to stuff the ballot box, but you have a few options to dissuade casual abuse.
As others have mentioned, one simple solution is to allow one vote per IP address. Not a terrible idea, but see this discussion for why it isn't a great idea either: Limit 1 vote per IP Address? It can prevent legitimate users from voting (consider two roommates sharing a personal router), and it doesn't stop ballot stuffing (I could vote at home, and then again at work). It gets even more complicated when you consider ISPs like AOL (so the popular wisdom says, at least, I'm only assuming this is still true) that reassign addresses often (ostensibly to protect the privacy of their users, perhaps).
You could require a captcha. This provides a similar amount of protection as requiring a verified email address, with slightly less burden on your users. Neither of these approaches are guarantees, of course. Anyone who owns a domain name has an infinite number of unique working email addresses, and if a few dozen votes is enough to influence the poll result, then an attacker needs only the patiences to take a few dozen captcha tests.
The more sophisticated solution is to require user accounts, watch cleverly for signs of abuse, and ban accounts that are suspected of being fraudulent. I'm guessing that's far beyond the scope of anything you're prepared to do, though. Unless maybe someone has published a free general-purpose implementation of such a thing?