我想写一个简单的Perl脚本发送一个即时消息。胡言乱语似乎可能是最有利于协议。但下脚的失败:

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('me@gmail.com',
                    'CENSORED',
                    'you@gmail.com',
                    'subject test',
                    "body test");

它说:

Can't call method "can_read" on an undefined value at 
/opt/local/lib/perl5/site_perl/5.8.9/XML/Stream.pm line 1421.

作为卡特曼的答复所指出的,该代码实际上应该是

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('me%40gmail.com@talk.google.com',
                    'CENSORED',
                    'you%40gmail.com@talk.google.com',
                    'subject test',
                    "body test");

但是,失败以下错误:

No SASL mechanism found
 at /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL.pm line 74

我有你想说::SASL支持的模块的安装。

有帮助吗?

解决方案

的Jabber :: SimpleSend是一个标准的Jabber服务器交互,但是不要让简单的方法模块名称误导你:GTALK确实有点不同,需要TLS加密(即Jabber的:: SimpleSend不会做)和主机名的变化。您将获得使用网络:: XMPP,并直接与它的API处理更好的结果。

请参阅 http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification对于良好评价,在75线使用的Net :: XMPP的Perl的完全工作落实。它inteded发送Nagios的通知,但它正是你需要的。

其他提示

我不熟悉的代码,但是,行在XML::流是其中的模块,开始一个选择()循环。行523-524是在哪里经过IO::选择一个插到目的地的服务器,以及IO::选择本身通过一个幸福的参考,它们不应该民主基金的方式XML::流使用它。

东西是可能修改的"选择"元素的XML::流对象在叽里咕噜的模块,可能在一个错误的尝试纠正一个服务器连接的错误。我很抱歉我不能更具体。


响应对更新:

这些都是奇怪的错误,并且我一直想看看里面的Jabber模块,无论如何,所以我在看的来源。以下是根据寻找最新版本所使用的模块可以从支持.这可能不是非常有用的除非你想要开始继承这些模块和加入代码看到什么意外发生。(你可以跳下一段如果你不感兴趣Jabber模块的内部。)

从更新的信息,我已经追踪到你想说::SASL::Perl嘎嘎的在线41。它需要一个结果$parent->机构,并且有两个可能的原因,假设你想说::SASL不断。无论它被称为不正确地没有任何参数来自网::。::议定书》(行2968),这似乎是不可能的,或在"机制"设置的构造你想说::SASL不存在。净::。::协议定义的"机制"(GetStreamFeature称,行2958;这一定义的方法围绕行3340)与 return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, ,其中$功能只是一个串通从被叫方和标识部分XML::流对象的会议。

在原有基础上XML误差和可能的话id会坏的,它的出现,服务器发送错误的数据在某一点意外,以XML::流和下落不明的模块,使用它。我不相信foo%40gmail.com@talk.google.com 是正确的用户名字的格式,但我不知道怎么可能会导致这些错误,而不Jabber服务器做的事情是错误的。

我会重新开始与不同的用户名称在不同的服务器,并看看如果Jabber::SimpleSend在所有工作,然后试图捕捉到的服务器的输出以某种方式来看看有什么XML::流是窒息。


更新: 为什么它的价值,我装模块和我完全相同的错误。你想说::SASL::Perl::普通和所有其他先决条件是存在的。当我设置了用户名gmailaccountname@talk.google.com 并启用了全球警报(例如,#!/usr/bin/perl-w或perl-w filename.pl)、XML::流揭示了一堆的不确定值问题,并SimpleSend实际上吐出警告"不能连接到叽里咕噜的服务器"!(不,我不知道这真的意味着:().


更新: 我试图安装净::Jabber::Bot(我放弃了之后一些ssl模块的错误),看它是否会解决任何问题,我注意到其构造有这个选项,并注意:

gtalk => 0 # Default to off, 1 for on. needed now due to gtalk differences from std jabber server.

这强化了这一想法,即服务是在做一些不寻常的,其XML::流不打扰扔一个例外。

您的用户名应该是me@gmail.com但服务器名称是talk.google.com。因此,第一个参数应该是我的@ gmail.com @ talk.google.com,但我不知道是否Perl可以神交的是双@符号。你可能试图逃跑第一@与40%,使得第一参数是me%40gmail.com@talk.google.com。

更新I: 关于第二个错误,看起来像你缺少SASL身份验证模块。 Gmail使用SASL平原认证。所以,你有/usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm文件?

看起来你需要认证介绍:: SASL ::赛勒斯(C实现)或认证介绍:: SASL :: Perl的(Perl的实现)被安装以及认证介绍:: SASL(它只是试图找到最好的安装选项您的机器上,而对你来说,既没有发现)。

检查,看看是否有他们安装的一个。

这是我的源和手册的阅读 - 我没有测试这一点,情况因人而异

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top