草庐IT

linux - Net::SMTP 无法在 Windows 8 上连接

coder 2024-06-11 原文

我写了一个小脚本来测试与 Net::SMTP 的 SMTP 连接:

#!/usr/bin/perl -w
use strict;
use Net::SMTP;   
my $smtp = Net::SMTP->new( 'mypc', Port => 10025, Timeout => 30, Debug => 1 );
die "Couldn't connect to SMTP server" unless $smtp;

一个 SMTP 服务器正在 mypc:10025 上运行并转储它所做的所有 I/O。当我从 Debian Linux 机器(64 位,Perl v5.20.2)执行脚本时,SMTP 服务器显示 I/O 事件并且一切都按预期工作:

zb226@debian8:~$ ./net_smtp.pl
Net::SMTP>>> Net::SMTP(2.33)
Net::SMTP>>>   Net::Cmd(2.30)
Net::SMTP>>>     Exporter(5.71)
Net::SMTP>>>   IO::Socket::INET(1.35)
Net::SMTP>>>     IO::Socket(1.38)
Net::SMTP>>>       IO::Handle(1.35)
Net::SMTP=GLOB(0x118adc0)<<< 220 Hi
Net::SMTP=GLOB(0x118adc0)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x118adc0)<<< 250 OK

当我在 Windows 8 机器(64 位,Strawberry Perl 5.22.0)上执行此操作时,没有建立连接。我可以通过 SMTP 服务器中完全没有 I/O 看到这一点。 Net::SMTP 未连接。正如在这种情况下预期的那样,脚本刚刚结束:

C:\test>perl -w net_smtp.pl
Couldn't connect to SMTP server at net_smtp.pl line 5.

观察:

  • 有趣的是,脚本似乎在 3 秒后结束,而不是我指定的 30 秒。
  • 我可以使用 telnet.exe 连接到 SMTP 服务器,它会显示 I/O 事件。
  • 我试过完全关闭 Windows 防火墙,但没有任何改善。
  • 我让管理员暂时禁用了企业防病毒软件,但没有任何改进。
  • 将 Strawberry Perl 更新到当前推荐的 5.24.0.1 也无济于事。

我不确定接下来要尝试什么。

编辑:尝试了一个小的 IO::Socket::INET 脚本来验证 perl 实际上可以连接到这台 Windows PC 上:

#!/usr/bin/perl
use strict;
use IO::Socket::INET;
my @hosts = qw/ mypc:10025 /;
foreach my $host ( @hosts ) {
    my $open = defined IO::Socket::INET->new(PeerAddr => $host, Timeout => 5) || 0;
    printf "Probed %s -> %s \n", $host, $open ? 'ok' : 'NOK';
}

我在 SMTP 服务器中看到 I/O,它按预期工作:

C:\test>perl -w io_socket.pl
Probed mypc:10025 -> ok

最佳答案

根据其他答案的信息,潜在的问题是

  • 使用的主机名同时解析为 IPv4 和 IPv6 地址,
  • SMTP 服务器仅监听 IPv4 地址或 IPv6 地址被防火墙阻止,
  • 最新版本的 Net::SMTP 正在使用中,与旧版本相反,它透明地支持 IPv6 和 IPv4。

因为如果 IPv6 支持和较新的 IPv6 的常用偏好与 IPv4 Net::SMTP 将解析主机名,然后尝试 IPv6 地址 - 但无法连接。直接使用 IO::Socket::INET 反而有效,因为它只执行 IPv4(与 IO::Socket::IP 相反,Net::SMTP 使用)。

它在 Linux 上运行而不在 Windows 上运行的原因可能是 Perl 的不同版本:具有内置 IPv6(和 SSL)支持的新版本的 Net::SMTP 仅自 Perl 5.22 作为核心模块发布,即Windows (5.22) 上的 Perl 具有支持 IPv6 的版本,而 Linux (5.20) 上的 Perl 则没有。

有几种方法可以解决这个问题:

  • 直接使用 IPv4 地址而不是主机名
  • 让 SMTP 服务器同时监听 IPv4 和 IPv6
  • 或指定要使用的地址族,即
    my $smtp = Net::SMTP->new( 'mypc', ..., Domain => AF_INET );

关于linux - Net::SMTP 无法在 Windows 8 上连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994359/

有关linux - Net::SMTP 无法在 Windows 8 上连接的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  7. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  8. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  10. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

随机推荐