"this" is still assigned, but it is deprecated and its use is strongly discouraged... but
it's still the only way (that I know of) to get the name of the object calling SendAddOnMessage, since it doesn't pass itself to the function. Maybe you could do some trickery with the debugstack to figure it out, but using "this" is probably easier.
That said, here's a simpler version of the previously posted code that doesn't leak a global (bad Farmbuyer!
hooksecurefunc("SendAddonMessage", function(prefix, msg, distro, destination)
if distro == "PARTY" or distro == "RAID" then
local addon, _
local name = this and this.GetName and this:GetName()
if name and _G[name] then
_, addon = issecurevariable(name)
print(("SendAddonMessage, addon: %s, prefix: %s, distro: %s"):format(addon or "???", prefix, distro))
If updating your addons doesn't do the trick, the above code will print out a message every time an addon tries to send a comm message via the party or raid distributions. Obviously you won't want to run it all the time (or change the "print" call to "ChatFrameN:AddMessage" where N is an otherwise unused but existing chat frame), but it should help identify which addon is doing the bad thing.