关于outlook服务器的SMTP邮件发送问题。我有同样的问题,问题出在端口号上。
使用Port:587 而不是Port:25 或任何其他选项...我一直使用此端口从Outlook 发送,每次都成功。
对于 IMAP 附件问题,解决方案隐藏在区分大小写中...
如果我们查看函数object imap_fetchstructure ( resource $imap_stream , int $msg_number),它通常负责获取附件。
我们从 Gmail 和其他方面获得什么:
标准类对象
(
[类型] => 1
[编码] => 0
[ifsubtype] => 1
[子类型] => 混合
[如果描述] => 0
[ifid] => 0
[如果性格] => 0
[ifd 参数] => 0
[if参数] => 1
[参数] => 数组
(
[0] => 标准类对象
(
[attribute] => BOUNDARY // 注意这里...
[值] => b1_04114a96a39b7789f88fdabc7feadc61
)
)
[部分] => 数组
(
[0] => 标准类对象
(
[类型] => 0
[编码] => 1
[ifsubtype] => 1
[子类型] => HTML
[如果描述] => 0
[ifid] => 0
[行] => 20
[字节] => 597
[如果性格] => 0
[ifd 参数] => 0
[if参数] => 1
[参数] => 数组
(
[0] => 标准类对象
(
[属性] => CHARSET // 注意这里...
[值] => iso-8859-1
)
)
)
[1] => 标准类对象
(
[类型] => 5
[编码] => 3
[ifsubtype] => 1
[子类型] => JPEG
[如果描述] => 0
[ifid] => 0
[字节] => 266988
[如果处置] => 1
[处置] => 附件 // 注意这里...
[ifd 参数] => 1
[dparameters] => 数组
(
[0] => 标准类对象
(
[attribute] => FILENAME // 注意这里...
[值] => oIROo0jJDb-15.jpg
)
)
[if参数] => 1
[参数] => 数组
(
[0] => 标准类对象
(
[attribute] => NAME // 注意这里...
[值] => oIROo0jJDb-15.jpg
)
)
)
)
)
我们从 OUTLOOK 中得到什么:
1
[编码] => 0
[ifsubtype] => 1
[子类型] => 混合
[如果描述] => 0
[ifid] => 0
[如果性格] => 0
[ifd 参数] => 0
[if参数] => 1
[参数] => 数组
(
[0] => 标准类对象
(
[属性] => 边界
[值] => b1_df2cd0669f50efc788d5aecfdded4957
)
)
[部分] => 数组
(
[0] => 标准类对象
(
[类型] => 0
[编码] => 1
[ifsubtype] => 1
[子类型] => HTML
[如果描述] => 0
[ifid] => 0
[行] => 23
[字节] => 729
[如果性格] => 0
[ifd 参数] => 0
[if参数] => 1
[参数] => 数组
(
[0] => 标准类对象
(
[attribute] => charset // 注意这里...
[值] => iso-8859-1
)
)
)
[1] => 标准类对象
(
[类型] => 5
[编码] => 3
[ifsubtype] => 1
[子类型] => JPEG
[如果描述] => 0
[ifid] => 0
[字节] => 266988
[如果处置] => 1
[处置] => 附件 // 注意这里...
[ifd 参数] => 1
[dparameters] => 数组
(
[0] => 标准类对象
(
[属性] => 文件名 // 注意这里...
[值] => cqLaQAZSei-15.jpg
)
)
[if参数] => 1
[参数] => 数组
(
[0] => 标准类对象
(
[attribute] => name // 注意这里...
[值] => cqLaQAZSei-15.jpg
)
)
)
)
)
?>
所以现在,通常为了在某处获取附件,我们使用 if 语句来检查电子邮件的该部分是否有任何附件。对于这种情况,我会参考 PHP IMAP Library Part 1 和 PHP IMAP Library Part 2... 获取附件功能在教程的第 2 部分中。
获取附件函数:
函数 getAttachments($imap, $mailNum, $part, $partNum) {
$附件 = 数组();
if (isset($part->parts)) {
foreach ($part->parts as $key => $subpart) {
if($partNum != "") {
$newPartNum = $partNum 。 “。” . ($key + 1);
}
别的 {
$newPartNum = ($key+1);
}
$result = getAttachments($imap, $mailNum, $subpart,
$新零件号);
如果(计数($结果)!= 0){
array_push($attachments, $result);
}
}
}
否则 if (isset($part->disposition)) {
if ($part->disposition == "ATTACHMENT") { // 注意这里...
$partStruct = imap_bodystruct($imap, $mailNum,
$partNum);
$attachmentDetails = 数组(
“名称” => $part->dparameters[0]->值,
"partNum" => $partNum,
"enc" => $partStruct->编码
);
返回 $attachmentDetails;
}
}
返回$附件;
}
注意else if 语句中的if 语句您可以看到它与大写ATTACHMENT 比较,但Outlook 结果没有大写ATTACHMENT 他们有attachment。因此,我建议不要使用该行:strtoupper($part->disposition) == 'ATTACHMENT'...
这样我们的附件就可以工作了……
所以最终的函数应该是:
函数 getAttachments($imap, $mailNum, $part, $partNum) {
$附件 = 数组();
if (isset($part->parts)) {
foreach ($part->parts as $key => $subpart) {
if($partNum != "") {
$newPartNum = $partNum 。 “。” . ($key + 1);
}
别的 {
$newPartNum = ($key+1);
}
$result = getAttachments($imap, $mailNum, $subpart,
$新零件号);
如果(计数($结果)!= 0){
array_push($attachments, $result);
}
}
}
否则 if (isset($part->disposition)) {
if (strtoupper($part->disposition) == "附件") {
$partStruct = imap_bodystruct($imap, $mailNum,
$partNum);
$attachmentDetails = 数组(
“名称” => $part->dparameters[0]->值,
"partNum" => $partNum,
"enc" => $partStruct->编码
);
返回 $attachmentDetails;
}
}
返回$附件;
}
我希望这能解决问题...因为它对我有用...
谢谢...