fgets() 在 Swiftmailer 中无错误地停止
fgets() halting without error in Swiftmailer
我正在尝试在 Laravel 4.2(Windows 7,IIS 6.1)中生成测试电子邮件,但我遇到了静默终止 - 它只是失败了,不是 return 我的观点,return 不是错误或异常。我设法强行通过 Laravel 代码库,并在 Swift\Transport\AbstractSmtpTransport::_getFullResponse() 中找到了终止符,特别是行 $line = $this->_buffer->readLine($seq);
:
protected function _getFullResponse($seq)
{
$response = '';
try {
do {
$line = $this->_buffer->readLine($seq);
$response .= $line;
} while (null !== $line && false !== $line && ' ' != $line{3});
} catch (Swift_IoException $e) {
$this->_throwException(
new Swift_TransportException(
$e->getMessage())
);
} catch (Swift_TransportException $e) {
$this->_throwException($e);
}
return $response;
}
那个do循环执行了两次。第一次 $line
被分配值 * OK The Microsoft Exchange IMAP4 service is ready.
,这很好,显然我正在访问服务器。不幸的是,第二次迭代在 Swift\Transport\StreamBuffer::readLine() 中的 $line = fgets($this->_out);
:
行失败
public function readLine($sequence)
{
if (isset($this->_out) && !feof($this->_out)) {
$line = fgets($this->_out);
if (strlen($line)==0) {
$metas = stream_get_meta_data($this->_out);
if ($metas['timed_out']) {
throw new Swift_IoException(
'Connection to ' .
$this->_getReadConnectionDescription() .
' Timed Out'
);
}
}
return $line;
}
}
我已经尝试将该行包装在 try/catch 中,但没有任何反应,代码只是停止,没有关于 do 循环第二次迭代的信息。那么,关于 a) 如何从停止中挤出更多信息或 b) 什么可能导致 fgets() 以这种方式停止,有什么建议吗?
好的,进步了:在将我的搜索范围扩大到 Swiftmailer 之后,我能够找到在 Swiftmailer 的特定行发生超时的提及。通过扩展 php.ini 中的 max_execution_time 我能够得到一个实际的异常:
预期响应代码 220 但收到代码“”,消息为“* OK Microsoft Exchange IMAP4 服务已准备就绪。* BYE 连接已关闭。13”
我想在这种情况下我会结束这个问题并继续弄清楚为什么我没有得到 220。
我正在尝试在 Laravel 4.2(Windows 7,IIS 6.1)中生成测试电子邮件,但我遇到了静默终止 - 它只是失败了,不是 return 我的观点,return 不是错误或异常。我设法强行通过 Laravel 代码库,并在 Swift\Transport\AbstractSmtpTransport::_getFullResponse() 中找到了终止符,特别是行 $line = $this->_buffer->readLine($seq);
:
protected function _getFullResponse($seq)
{
$response = '';
try {
do {
$line = $this->_buffer->readLine($seq);
$response .= $line;
} while (null !== $line && false !== $line && ' ' != $line{3});
} catch (Swift_IoException $e) {
$this->_throwException(
new Swift_TransportException(
$e->getMessage())
);
} catch (Swift_TransportException $e) {
$this->_throwException($e);
}
return $response;
}
那个do循环执行了两次。第一次 $line
被分配值 * OK The Microsoft Exchange IMAP4 service is ready.
,这很好,显然我正在访问服务器。不幸的是,第二次迭代在 Swift\Transport\StreamBuffer::readLine() 中的 $line = fgets($this->_out);
:
public function readLine($sequence)
{
if (isset($this->_out) && !feof($this->_out)) {
$line = fgets($this->_out);
if (strlen($line)==0) {
$metas = stream_get_meta_data($this->_out);
if ($metas['timed_out']) {
throw new Swift_IoException(
'Connection to ' .
$this->_getReadConnectionDescription() .
' Timed Out'
);
}
}
return $line;
}
}
我已经尝试将该行包装在 try/catch 中,但没有任何反应,代码只是停止,没有关于 do 循环第二次迭代的信息。那么,关于 a) 如何从停止中挤出更多信息或 b) 什么可能导致 fgets() 以这种方式停止,有什么建议吗?
好的,进步了:在将我的搜索范围扩大到 Swiftmailer 之后,我能够找到在 Swiftmailer 的特定行发生超时的提及。通过扩展 php.ini 中的 max_execution_time 我能够得到一个实际的异常:
预期响应代码 220 但收到代码“”,消息为“* OK Microsoft Exchange IMAP4 服务已准备就绪。* BYE 连接已关闭。13”
我想在这种情况下我会结束这个问题并继续弄清楚为什么我没有得到 220。