我正在尝试设置 OfflineIMAP 以将我的 Gmail 帐户同步到~/Mail/Gmail
.我正在使用一个非常基本~/.offlineimaprc
的这里。但是 OfflineIMAP 根本无法连接到 Gmail。这是我收到的调试消息(通过以以下方式运行 OfflineIMAP offlineimap -o -d imap
:
OfflineIMAP 6.3.4
Copyright 2002-2011 John Goerzen & contributors.
Licensed under the GNU GPL v2+ (v2 or any later version).
Debug mode: Forcing to singlethreaded.
Now debugging for imap: IMAP protocol debugging
Now debugging for : Other offlineimap related sync messages
Account sync Gmail:
***** Processing account Gmail
Copying folder structure from IMAP to Maildir
Establishing connection to imap.gmail.com:993.
DEBUG[imap]: 06:28.69 Account sync Gmail imaplib2 version 2.24
DEBUG[imap]: 06:28.69 Account sync Gmail imaplib2 debug level 5, buffer level 3
WARNING: Error occured attempting to sync account 'Gmail':
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.7/offlineimap/accounts.py", line 177, in syncrunner
self.sync()
File "/usr/lib/pymodules/python2.7/offlineimap/accounts.py", line 235, in sync
remoterepos.syncfoldersto(localrepos, [statusrepos])
File "/usr/lib/pymodules/python2.7/offlineimap/repository/Base.py", line 124, in syncfoldersto
srcfolders = src.getfolders()
File "/usr/lib/pymodules/python2.7/offlineimap/repository/IMAP.py", line 276, in getfolders
imapobj = self.imapserver.acquireconnection()
File "/usr/lib/pymodules/python2.7/offlineimap/imapserver.py", line 323, in acquireconnection
elif isinstance(e, socket.error) and e.args[0] == errno.ECONNREFUSED:
NameError: global name 'errno' is not defined
***** Finished processing account Gmail
一开始我以为这可能是由于我的 ISP 阻止造成的imap.gmail.com/imap.googlemail.com
,但我可以使用以下方法连接到它telnet imap.googlemail.com 993
:
telnet imap.googlemail.com 993
Trying 173.194.79.16...
Connected to googlemail-imap.l.google.com.
Escape character is '^]'.
有任何想法吗?
编辑1:从这个回答开始超级用户,我尝试使用imap.googlemail.com
通过 SSL连接openssl s_client -connect imap.googlemail.com:993
。这给了我:
CONNECTED(00000003)
3078125768:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 226 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
这看起来像是 OpenSSL 中缺少证书的问题。 OfflineIMAP 也会发生同样的情况吗?
编辑2:我在另一台运行 Mandriva Linux 版本 2009.1 的服务器(在同一网络上)上尝试了相同的 OpenSSL 命令,显然连接有效(调试输出)。我正在运行带有 OpenSSL/LibSSL 1.0.1-4ubuntu5.5 的 Ubuntu 12.04。这可能与发行版有关吗?
答案1
您可以告诉offlineimap 本地系统证书的存储位置,然后让它自动验证链,而不是手动指定指纹(可以更改)。
[Repository somerepos-remote]
type = Gmail
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
sslcacertfile 就是起作用的。
如果非 Ubuntu 用户看到此内容,请记住该位置很可能与您的发行版不同。
答案2
您应该将以下行添加到 .offlineimaprc 中描述远程 Gmail 帐户的部分:
cert_fingerprint=f3043dd689a2e7dddfbef82703a6c65ea9b634c1
这是 Gmail 的 imap 服务器的 SSL 证书。
答案3
不,这不是 OpenSSL 缺少证书,而是 SSL 握手失败,因为另一端没有发送其证书。
当您连接到某些未启用 SSL 的服务时,您会收到类似的错误。
当你向 openssl 添加 -debug 选项时,你会得到什么?
回答:
read from 0x9cd8b98 [0x9cde140] (7 bytes => 0 (0x0))
因此它没有从套接字读取任何内容(表明在发送任何内容之前它已被另一端或中间的某些内容关闭)
您的网络上是否有某种代理?本地计算机上有某种 iptables 重定向或防病毒软件吗?
tshark -Vi any port 993
当您尝试 openssl 命令时,会得到什么?