Sending XMPP messages from Google App Engine with html

Do you like this post? A regular project like the PlaneSpotter Color takes many hours of my free time to develop and maintain. Would you offer me a beer for my hard work if I was your neighbour? Modern technology called teleportation makes it easy to send me a beer. Just click here. Thank you!

Since this took me a while to figure out I’d like to share with you. I wanted to extend Feederator to send incoming news items to the users XMPP client. What worked pretty fast was sending plain text messages:

XMPPService xmpp = XMPPServiceFactory.getXMPPService();
JID jid = new JID(xmppAddress);
Message msg = new MessageBuilder()
    .withRecipientJids(jid)
    .withMessageType(MessageType.CHAT)
    .withBody(“New post arrived”)
    .build();
if (xmpp.getPresence(jid).isAvailable()) {
    SendResponse status = xmpp.sendMessage(msg);
    messageSent = (status.getStatusMap().get(jid) == SendResponse.Status.SUCCESS);
    if (messageSent) {
        Log.info(“message sent”);
    }
}

But to send parts of the message bold and maybe even displaying pictures was trickier. But I finally figured it out. Change the part with the message:
String message = “<body>Plain text message</body>”
   + “<html xmlns=’http://jabber.org/protocol/xhtml-im’>”
   + “<body xmlns=’http://www.w3.org/1999/xhtml’>”
   + “<B>bold text</B> and normal text”
   + “</body>”
   + “</html>”;
Message msg = new MessageBuilder()
   .withRecipientJids(jid)
   .withMessageType(MessageType.CHAT)
   .withBody(message)
   .asXml(true);
   .build();
By adding the .asXml(true) parameter you tell the XMPP service that you take care yourself of the content of the message. Pay attention to the fact that you always should send a normal elment for the plain text. Not all XMPP/ Jabber clients unterstand the xhtml-im extension. The specification (http://xmpp.org/extensions/xep-0071.html) says that the plain text should always tell the same as the element with markup and that clients are free to ignore the xhtml-im tag. Also note that clients are free to display the text defined by the alt attribute of a <img> tag and not the picture.

Posted by squix78

3 comments

  1. The GTalk client doesn't. But the beauty of it is that with the double body tag the clients which understand the XHTML-IM extension will display it. So, even if my message is send over the GTalk server my marked up message will be displayed on Pidgin, Audium or other popular XMPP clients… But, there's still a unsolved problem with encoding…

  2. Do you have any idea how we can send utf-8 chars w/ this method. If I don't build the message asXml and send out only a single body, I can see characters like "ş ğ ü ı ç" at my message. But when I build it asXml to have an html those characters are seen as "? ? ? ? ?". Can you advice anything?

Leave a Reply