我在运行 Windows 7 的虚拟机中运行 Outlook 2010。通过主机提供网络。Outlook 连接到 Exchange 服务器。
当主机的 IP 地址发生变化(例如移动到不同的 wifi 网络)时,这会中断 Outlook 的连接。我还没有深入调查,但它似乎顽固地保留了 TCP 连接,而不是启动新的连接。底部的状态栏一直显示“此文件夹上次更新时间为 <time>”,并且不会下载新电子邮件。
按“更新文件夹”或“发送/接收所有文件夹”按钮没有用。切换到离线模式(“离线工作”按钮)并重新联机也没有用。
有时,Outlook 最终会重新连接。但这需要几分钟或几小时。我如何指示 Outlook 现在重新连接?
终止 Outlook 并重新启动是可行的,但会造成干扰。此问题特定于在虚拟机中运行 Outlook,或者可能在 IP 地址发生变化的网关后面运行 Outlook:如果 Windows 计算机本身的 IP 地址发生变化,Outlook 不会正确重新连接。
答案1
我找不到让 Outlook 重新连接到服务器的方法,除非重新启动它或禁用并(痛苦地)重新启用网络接口。
因此,我所做的就是使用以下脚本拔下并重新插入虚拟机和主机之间的虚拟电缆VBoxCableReconnect
。当然,该脚本特定于 VirtualBox,但我希望其他虚拟机技术也能实现类似的功能。
#! /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');
在主机上启动网络接口时,以运行虚拟机的用户身份运行此程序。
答案2
控制并右键单击时钟旁边的 Outlook 图标,您将看到一个名为“连接状态”的新菜单项,您可以比任何其他方法更快地重新连接。