As others have said, Jabber may be a good way to go. What you could do is have your daemon connected to a Jabber server as a client, just like any other client connects to a Jabber server. Connecting to a Jabber server is the same for a non-interactive application like your daemon as it would be for an interactive chat session.
At that point, whenever your daemon wishes to send a message to someone, just have it do a lookup to see if that particular person is online, and what their status is. In Jabber terms, you're checking for that person's "presence". Included with the
Net::Jabber module is one called
Net::Jabber::Presence which you can use to detect a person's online status. This allows you to not only know if they are online, but you can detect whether they have their client set to something like "Do not Disturb" or "Extended Away". Perhaps, in one or both of those cases, you may wish to send an email versus giving them an IM.
There are already some Jabber clients written in Perl. A few examples are:
http://www.jabbercentral.org/clients/view.php?id=1007327470 - Perl Jabber Bot
http://www.jabbercentral.org/clients/view.php?id=962065957 - Jarl, Perl Jabber Client
http://www.jabbercentral.org/clients/view.php?id=1015797608 - pJab, Perl Console Client
Good luck!
-Eric