Sending XMPP messages from Google App Engine with html

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 Daniel Eichhorn

Daniel Eichhorn is a software engineer and an enthusiastic maker. He loves working on projects related to the Internet of Things, electronics, and embedded software. He owns two 3D printers: a Creality Ender 3 V2 and an Elegoo Mars 3. In 2018, he co-founded ThingPulse along with Marcel Stör. Together, they develop IoT hardware and distribute it to various locations around the world.

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 to SquixCancel reply