1

I am trying to connect to an Outlook email server via IMAP and the error I am getting is curious. Here is a sample of my code:

use Mail::IMAPClient;

my $imap = Mail::IMAPClient->new;
$host='outlook.office365.com';
$username='.....';
$password='.....';
$folder='INBOX';
$imap=Mail::IMAPClient->new(
                Server => $host,
                User => $username,
                Password => $password,
                Port => 993,
                Ssl => 1,
                Clear=> 5,
                Folder => $folder,
                Uid => 0,
)       or die "Cannot connect to $host as $username: $@";

When I run this, the output line looks like this:

Cannot connect to outlook.office365.com as [...]: Socket closed while reading data from server.

More specifically, Socket closed while reading data from server is what is confusing me.

I specify port 993, so is the only remaining possible issue that there's a firewall in place that is preventing this? I have emailed my school's (this is a school email account) tech department (quite some time ago) and they have yet to get back, but hopefully I will hear from them soon.

I get an even stranger error when I remove the line specifying the port, I am including it only in the hopes it is somehow relevant or helpful:

Cannot connect to outlook.office365.com as [...]: Error sending '1 Login "baldassaren@wit.edu" {15} [password is shown here, along with a newline character I can't seem to force here] ' to IMAP: Bad file descriptor at ./test.pl line 10.

4

1 に答える 1

1

openssl で直接確認してください:

 openssl s_client -connect outlook.office365.com:993

これにより接続が確立され、最後に IMAP サーバーからのウェルカム メッセージが表示されます。

* OK The Microsoft Exchange IMAP4 service is ready. ....

これが機能しない場合は、ファイアウォールなどによって接続がブロックされています。これが機能する場合は、Mail::IMAPClient が SSL 接続に使用するモジュールである IO::Socket::SSL で接続してみてください。

perl -MIO::Socket::SSL -e 'print IO::Socket::SSL->new(q[outlook.office365.com:993])->getline.""'

これにより、ウェルカム メッセージも表示されます。そうでない場合は、証明書のチェックなどに問題がある可能性があります。この場合、使用するモジュールのバージョンと OS を投稿してください。

perl -e 'print "version=$^V, os=$^O\n"'
perl -MIO::Socket::SSL -e 'print IO::Socket::SSL->VERSION,"\n"'
perl -MMail::IMAPCient -e 'print Mail::IMAPClient->VERSION,"\n"'

ただし、IO::Socket::SSL が正常に接続された場合は、Debug => 1オプションをMail::IMAPClient->new追加して、出力を質問に追加してください。

于 2014-07-12T05:50:21.507 に答える