前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mac邮件客户端无法使用pop3协议报错,解决pop拉取邮件失败的方法

mac邮件客户端无法使用pop3协议报错,解决pop拉取邮件失败的方法

作者头像
孤鸿
发布2022-09-23 16:59:22
1.6K0
发布2022-09-23 16:59:22
举报
文章被收录于专栏:孤鸿

此方法初始目的来源于公司邮箱数据库里面有损坏的邮件,导致MAC版本客户端无法使用POP3协议拉取邮件。

原理为使用POP3协议的命令操作删除数据库内损坏的邮件列表,从而解决通过POP3协议拉取邮件时卡住不拉取邮件的问题。 方法采取脚本方式,使用PHP编写,下面是代码,贴出来共享。

使用方法:

  • php fixmail.php username password
代码语言:javascript
复制
<?php
/*
* Fix mail by deleting corrupted mails.
* Use USER and PASS 
* POP3 protocol refer RFC1939 (http://tools.ietf.org/rfc/rfc1939.txt)
*/

$host = "邮箱服务器域名或IP";
$port = "110"; // secure port is 995

if ($argc != 3) {
	print "Usage: \n";
	print "\t" . $argv[0] . " user pass\n";
	print "\n";
	exit;
}

$username = $argv[1];
$password = $argv[2];


function sendQuery($socket, $CMD, $data = '')
{
	$data = trim($data);
	if (empty($data)) {
		$send = "$CMD\r\n";
	} else {
		$send = "$CMD $data\r\n";
	}

    socket_send($socket, $send, strlen($send), 0);
    return;
}

function getResult($socket, $CMD = '')
{
	$retBuffer = '';
	while(($len = @socket_recv($socket, $buffer, 1024, 0)) >0) {
		//print $buffer;
		//print "\n";
		$retBuffer .= $buffer;
	    $n = strlen($retBuffer);
	    if (($CMD == 'LIST' || $CMD == 'TOP' || $CMD == 'RETR' || $CMD == 'UIDL') && 
	    	($retBuffer[0] == '+' && $retBuffer[1] == 'O' && $retBuffer[2] == 'K') &&
	    	! ($retBuffer[$n-1] == "\n" && $retBuffer[$n-2] == "\r" && $retBuffer[$n-3] == '.')) {
	    	// POP3协议返回数据
	    	// 第一行为状态码 +OK 或者 -ERR
	    	// 若有数据,数据以 ".\r\n" 结束
	    	$buffer = '';
	    	continue;
	    }
	    break;
	}
	return $retBuffer;
}

function getConnection($host, $port)
{
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
      or die("Unable to create socket\n");

    socket_connect($socket, $host, $port);
    $r = getResult($socket); // Get greeting info
    print $r;

    return $socket;
}

function getLoginSession($host, $port, $user, $pass)
{
	$socket = getConnection($host, $port);

	sendQuery($socket, 'USER', $user);
	$r = getResult($socket, 'USER');
	print $r;

	sendQuery($socket, 'PASS', $pass);
	$r = getResult($socket, 'PASS');
	print $r;

	return $socket;
}

function getMailIdList($socket) 
{
	sendQuery($socket, 'LIST');
	$r = getResult($socket, 'LIST');

	$lines = explode("\r\n", $r);
	$lines = array_filter($lines);
	$arrMailId = array();
	foreach($lines as $v) {
		if ($v[0] == '+' && $v[1] == 'O' && $v[2] == 'K') continue;
		if ($v[0] == '.') continue;
		$v = trim($v);
		if (empty($v)) continue;
		$mid = explode(' ', $v);
		//print "$v\n";
		$arrMailId[] = $mid[0];
	}
	return $arrMailId;
}

function checkMailCorrupt($socket, $mailId)
{
	sendQuery($socket, 'TOP', "$mailId 0");
	$r = getResult($socket, 'TOP');
	$r = trim($r);
	if ($r == '-ERR Message corrupted') {
		print "$mailId $r\n";
		return 1;
	} else if ($r[0] == '-' && $r[1] == 'E' && $r[2] == 'R' && $r[3] == 'R') {
		print "$mailId $r\n";
		return 2;
	}
	return 0;
}

function deleteMail($socket, $mailId)
{
	sendQuery($socket, 'DELE', "$mailId");
	$r = getResult($socket, 'DELE');
	print "DELE $mailId " . $r;
	return;
}

function quitAndClose(& $socket)
{
	sendQuery($socket, 'QUIT');
	$r = getResult($socket, 'QUIT');
	socket_close($socket);
	$socket = null;
	print $r;
	return;
}

// START
// get mail id list
$socket = getLoginSession($host, $port, $username, $password);
$arrMailId = getMailIdList($socket);
quitAndClose($socket);

$totalMail = count($arrMailId);
print "\nTotal mail count $totalMail\n\n";

// delete corrupt mail
// 删除之后id会重新补齐,所以从最大id开始
// 同一封邮件id在不同会话之间不一定相同, 但可以通过UIDL来获得邮件唯一ID标识
// 所以邮件客户端会先获取UIDL, 然后再获取LIST, 最后RETR获取邮件
$totalCorrupt = 0;
$cur = $totalMail - 1;
while ($cur >= 0) {
	$n = 6;
	$socket = getLoginSession($host, $port, $username, $password);
	while(($n > 0) && ($cur >= 0)) {
		$id = $arrMailId[$cur];
		$r = checkMailCorrupt($socket, $id);
		if ($r == 1) {
			$totalCorrupt ++;
			deleteMail($socket, $id);
			$n --;
		} else if ($r != 0) {
			$n --;
		}
		$cur --;
	}
	quitAndClose($socket);
}

print "\nTotal mail corrupt count $totalCorrupt\n\n";

脚本下载

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档