# encoding: ascii
# api: powershell
# title: Send-XmppMessage
# description: Sends an XMPP (Jabber) instant message. These parameters are mandatory: From, To, Body. Password can be supplied on the command line, or if omitted, you will be prompted for it.
# version: 0.1
# type: function
# author: halr9000
# license: CC0
# function: Send-XmppMessage
# x-poshcode-id: 103
# x-archived: 2017-02-21T07:23:35
# x-published: 2008-01-07T13:42:00
#
#
# Download XMPP SDK from http://www.ag-software.de/index.php?page=agsxmpp-sdk
function Send-XmppMessage {
param (
$From = $( Throw "You must specify a Jabber ID for the sender." ),
$Password, # Leave blank to be prompted for password
$To = $( Throw "You must specify a Jabber ID for the recipient." ),
$Body = $( Throw "You must specify a body for the message." )
)
# This function reads a string from the host while masking with *'s.
function Read-HostMasked( [string]$prompt="Password" ) {
$password = Read-Host -AsSecureString $prompt;
$BSTR = [System.Runtime.InteropServices.marshal]::SecureStringToBSTR($password);
$password = [System.Runtime.InteropServices.marshal]::PtrToStringAuto($BSTR);
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR);
return $password;
}
# Set path accordingly.
$assemblyPath = $(resolve-path $profiledir\Assemblies\agsXMPP.dll)
[void][reflection.assembly]::LoadFrom( $assemblyPath )
$jidSender = New-Object agsxmpp.jid( $From )
$jidReceiver = New-Object agsxmpp.jid ( $To )
$xmppClient = New-Object agsxmpp.XmppClientConnection( $jidSender.Server )
$Message = New-Object agsXMPP.protocol.client.Message( $jidReceiver, $Body )
# The following switches may assist in troubleshooting connection issues.
# If SSL and StartTLS are disabled, then you can use a network sniffer to inspect the XML
#$xmppClient.UseSSL = $FALSE
#$xmppClient.UseStartTLS = $FALSE
# Since this function is only used to send a message, we don't care about doing the
# normal discovery and requesting a roster. Leave disabled to quicken the login period.
$xmppClient.AutoAgents = $FALSE
$xmppClient.AutoRoster = $FALSE
# Use SRV lookups to determine correct XMPP server if different from the server
# portion of your JID. e.g. user@gmail.com, the server is really talk.google.com
$xmppClient.AutoResolveConnectServer = $TRUE
if ( !$password ) { $password = Read-HostMasked }
# Open connection, then wait for it to be authenticated
$xmppClient.Open( $jidSender.User, $Password )
while ( !$xmppClient.Authenticated ) {
Write-Verbose $xmppClient.XmppConnectionState
Start-Sleep 1
}
# If server disconnects you, try enabling this
#$xmppClient.SendMyPresence()
$xmppClient.Send( $Message )
# Send is asynchronous, so we must wait a second before closing the connection
Start-Sleep 1
$xmppClient.Close()
}