我在執行 Windows 7 的虛擬機器中執行 Outlook 2010。 Outlook 連線到 Exchange 伺服器。
當主機的 IP 位址發生變更(例如移動到不同的 wifi 網路)時,Outlook 的連線就會中斷。我沒有深入研究,但似乎頑固地保留一個TCP連接,不啟動新的連接。底部的狀態列不斷顯示“此資料夾上次更新時間為<時間>”,並且不會下載新電子郵件。
按下“更新資料夾”或“發送/接收所有資料夾”按鈕沒有幫助。切換到離線模式(「離線工作」按鈕)並返回線上模式並沒有幫助。
有時,Outlook 最終會重新連線。但這需要幾分鐘或幾小時。如何指示 Outlook 現在重新連線?
終止 Outlook 並重新啟動它可以工作,但會造成破壞。此問題特定於在虛擬機器中執行 Outlook,或者可能是在 IP 位址發生變化的閘道後面:如果 Windows 電腦本身的 IP 位址發生變化,Outlook 會正確重新連線。
答案1
我找不到一種方法來說服 Outlook 重新連接到伺服器,除非重新啟動它或停用並(痛苦地)重新啟用網路介面。
因此,我所做的就是使用以下腳本拔出並重新插入虛擬機器和主機之間的虛擬電纜VBoxCableReconnect
。當然,該腳本特定於 VirtualBox,但我希望其他 VM 技術也能實現類似的效果。
#! /usr/bin/env perl
use strict;
use warnings;
sub vbox_list {
my %vms;
my ($running) = @_;
my $what = $running ? 'runningvms' : 'vms';
local $ENV{LC_ALL} = 'C';
open VBOX, "VBoxManage list -l $what |" or die 'VBoxManage: $!';
local $/ = "\n\n\n";
while (my $section = <VBOX>) {
my %vm = ();
$section =~ s/\n\n.*//s; # strip shared folders, etc.
foreach my $line (split /\n/, $section) {
$line =~ s/\A([^:]+):\s+// or next;
$vm{$1} = $line;
}
$vms{$vm{UUID}} = {%vm};
}
close VBOX;
return %vms;
}
sub vbox_list_cables {
my ($vms) = @_;
my @cables;
foreach my $vm (values %$vms) {
my %vm = %$vm;
foreach my $key (keys %vm) {
next unless $key =~ /\ANIC *([0-9]+)\z/;
my $num = $1;
if ($vm{$key} =~ /(^|, )Cable connected: on($|, )/) {
push @cables, [$vm{UUID}, $vm{Name}, $num];
}
}
}
return @cables;
}
sub vbox_iterate_cableconnected {
my ($cables, $onoff) = @_;
foreach my $cable (@$cables) {
my ($uuid, $name, $num) = @$cable;
system 'VBoxManage', 'controlvm', $uuid, "setlinkstate$num", $onoff;
# TODO: report errors
}
}
my %vms = vbox_list(1);
my @cables = vbox_list_cables(\%vms);
vbox_iterate_cableconnected(\@cables, 'off');
sleep(1);
vbox_iterate_cableconnected(\@cables, 'on');
在主機上啟動網路介面時,以執行 VM 的使用者身分執行此命令。
答案2
控制並右鍵單擊時鐘旁邊的 Outlook 圖標,您將看到一個名為「連線狀態」的新選單項,您可以比任何其他方法更快地重新連線。