Mac让Mail(自带邮箱客户端)的gmail走代理及终端走代理
Table of Contents
自带邮箱客户端Mail
使用Mail存在的问题
对于有gmail邮箱又喜欢用自带邮箱客户端(Mail.app)的Mac用户来说,最苦恼的是Mail客户端本身没有代理功能,而各类科学上网软件在pac(自动代理)下,Mail并不会走代理,原因是自动代理其实是通过一个js脚本来判断哪些域名走代理,而哪些域名直连,我猜测是只有浏览器才能解析这个js,或者被代理的软件虽然不是浏览器,但有能力解析这个js文件。
就猜v2rayU来说,如果你选择pac模式并启动后,它会勾选“系统偏好设置→网络→WIFI→高级→代理→自动代理配置”,并自动填写pac文件地址
这个pac文件其实就是v2rayU自己启动一个简单的http服务器,让你可以通过http协议访问它。
proxy.js文件其实是在/~.V2rayU/pac/proxy.js
中,它里面有一句如下
var proxy = "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;";
可以看到,它有SOCKS5和SOCKS两个关键字(SOCKS
给Safari用,Safari用的是socks5协议但关键字要用socks),说明自动代理也是走socks5协议的,而邮件协议是smtp/imap/pop3协议,它是可以通过socks5协议来代理的。
所以macOS自带邮箱(Mail.app)无法被代理的真正原因,应该是它根本不走pac,或者说它无法解析这个pac文件,因为只要它走了pac,它肯定能通过pac配置的socks5协议走代理的。
解决Mail无法上gmail的问题(更新方法)
对于M系(如M1/M2)芯片的Mac,由于它支持安装iOS应用,所以可以安装iOS的小🚀,由于小🚀是走VPN模式的,所以Mail的流量自然也会走小🚀,再由小🚀来分流。
解决Mail无法上gmail的问题(新方法)
不使用pac模式,而是使用全局模式,所谓全局,是指所有流量都进入到代理客户端中(如v2rayU或qv2ray或其它的),但是现在的客户端(v2ray类)自身都有路由规则,内部会判断是否要走代理,并不是进入代理客户端就一定会走代理。
解决Mail无法上gmail的问题(老方法)
关于解决这个的办法,有ProxyCap、Surge、Proxifier,ProxyChains、Privoxy、proximac可用,前三个收费,后三个免费,当然收费的一般也有你想要的破解版,但ProxyCap和Surge的新版本好久都没有破解版,所以目前选用Proxifier(也是大多数人推荐使用的),可以去xclient.info下载你想要的版本。
配置Proxifier
先添加一下Socks5代理,注意port
要写你的科学上网工具的socks5代理端口:
添加规则:
– 第③步是添加应用,表示哪些应用要走这个代理,点+号添加即可;
– 第④步则是填写要转发的目标地址,只有填在那里的地址才会被转发,而其他的地址则不会被转发(比如国内的邮箱就不用转发);
– 第⑤步填写转发目标端口,只有填写在这里的目标端口才会被转发;
– 第⑥步是规则的动作,意思是,当捕获到请求符合以上设置的规则时,要把这个请求代理到哪里,我们自然是选择前面添加过的代理,代理到本机(127.0.0.1)的1080端口(本机科学上网软件的socks5端口)。
localhost(这个其实添加的时候会自动添加):
# target hosts
localhost; 127.0.0.1; ::1; %ComputerName%
gmail:
# target hosts
imap.gmail.com;smtp.gmail.com;pop.gmail.com; 64.233.188.109;
# target ports
143; 465; 587; 993; 995;
ipv6(目前发现访问facebook时会有ipv6请求,我们把ipv6的请求都设置为direct,因为系统会自动代理):
# target hosts
*:*:*:*:*:*:*:*;0:0:0:0:0:0:0:0-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
新建一个配置,写上名称,然后点击OK保存,就会把刚才的配置都保存下来:
然后开着Proxifier就可以实现把Mail中对gmail的收发邮件请求转发到(即代理到)本机的科学上网软件上,然后再由科学上网软件把这个请求发送出去。
目前发现的问题就是iPhone的handoff无法通过,不知道怎么解决:
handoff问题解决方法:看报错里是什么进程,对于handoff问题,把sharingd加入不走代理就好了,见这里。
后续:我发现非常奇怪,不使用Proxifier也能正常使用Mac自带的Mail.app收发gmail邮件了,但有时又有感叹号。
终端工具走代理
终端工具无法走代理的问题
对于IT行业的童鞋来说,也是很苦恼,即使你的科学上网软件开了全局代理,终端工具中使用的命令也不会走代理,原因我也不是很清楚,我个人感觉是命令不会走GUI的配置。
而且,我们并不想让所有终端命令一直走代理,原因是很多包管理工具(就比如说Mac的Homebrew)都可以设置国内源,这些肯定是不想它走代理的,但有一些又需要它走代理,怎么解决?
解决终端工具走代理问题
Mac的终端(自带或第三方都一样)是否走代理,是通过http_proxy
、https_proxy
、all_proxy
这几个变量来判断的,比如我把http_proxy设置为http_proxy=http://127.0.0.1:1087
,那么请求http的链接就会被代理到本地(127.0.0.1)的1087端口,但由于还有很多是https和非http协议(需要用socks5代理)的命令,所以我们要把https和socks5的都加上,https的代理变量是https_proxy
,而socks5的代理变量是all_proxy
,所以最终我们要把这三个变量都设置为走本地的socks5代理:
http_proxy=http://127.0.0.1:1087
https_proxy=http://127.0.0.1:1087
all_proxy=socks5://127.0.0.1:1080
注意:其中1087和1080分别为本地科学上网工具的http/https端口和socks5端口(你本地可能不是这两个,换成你自己的就行)。
我们知道,设置变量可以在~/.bashrc
或~/.zshrc
(如果你用zsh的话)中用export命令来定义,以下例子我只说~/.bashrc
,如果你用的是zsh请自行替换为~/.zshrc
即可。
比如你在~/.bashrc
中添加以下这句,就表示定义了一个test
变量:
export test='this is a test'
然后重新读取一下配置:
source ~/.bashrc
然后用以下命令输出一下test
变量的值:
echo $test
它就会输出“this is a test”。
按以上的原理,我们要定义http_proxy
、https_proxy
、all_proxy
这三个变量的值,也是通过export
命令来定义的,所以上边的命令可以写成:
export http_proxy=http://127.0.0.1:1087
export https_proxy=http://127.0.0.1:1087
export all_proxy=socks5://127.0.0.1:1080
这么写是没什么问题,但是这样一来终端就一直走代理了,如何在我不想走代理的时候不走代理呢?其实不走代理也很简单,就是把以上三个变量都删除掉就不会走代理了,删除的方法是unset 变量名
,比如要删除前面的test
变量,那就是unset test
,unset之后你再用echo $test
还有值出来吗?没有了吧。
可是一个变量一个变量的删除,非常麻烦,我们怎样才能在要使用代理的时候一次性设置三个变量,在不想用代理的时候一次性删除这三个变量呢?
方法是把设置的命令写在同一行(用分号分隔,这是可以的),然后使用alias
命令设置一个命令别名,当我们运行这个命令别名时,就相当于运行了整一行命令,我分别把这两个变量设置为setproxy
和unsetproxy
,分别表示启用代理和取消使用代理,并且为了方便,我还在设置三个变量的后面加了echo
输出提示,用于提示你已经设置为使用代理和你已经取消使用代理了。
最后的命令如下:
# 定义代理地址变量(两个端口号需要改成你自己的)
httpproxy=http://127.0.0.1087
socksproxy=socks5://127.0.0.1080
# 设置使用代理
alias setproxy="export http_proxy=$httpproxy; export https_proxy=$httpproxy; export all_proxy=$socksproxy; echo 'Set proxy successfully'"
# 设置取消使用代理
alias unsetproxy="unset http_proxy; unset https_proxy; unset all_proxy; echo 'Unset proxy successfully'"
# 查ip
alias ipcn="curl myip.ipip.net"
alias ip="curl ip.sb"
其中的ip和ipcn是两个查询当前ip的命令。
如果你用的是fish shell,则设置如下(fish shell的set不能用=号,要用空格代替,fish shell没有unset,用set -e
代替)
# 定义代理地址变量(两个端口号需要改成你自己的)
set httpproxy http://127.0.0.1087
set socksproxy socks5://127.0.0.1080
# 设置使用代理
alias setproxy="export http_proxy=$httpproxy; export https_proxy=$httpproxy; export all_proxy=$socksproxy; echo 'Set proxy successfully'"
# 设置取消使用代理
alias unsetproxy="set -e http_proxy;set -e https_proxy;set -e all_proxy;echo 'Unset proxy successfully'"
# 查ip
alias ipcn="curl myip.ipip.net"
alias ip="curl ip.sb"
重新读取一下配置(选择自己对应的shell):
source ~/.bashrc
source ~/.zshrc
source ~/.config/fish/config.fish
然后我们要使用代理时,运行setproxy
,回车就可以了,然后你运行命令都会走代理了;运行一下ip
或ipcn
就可以查询当前ip,如果确实使用了代理,那么出来的ip会是代理的ip;要取消使用代理,运行unsetproxy
,回车,然后你运行命令就不走代理了,然后再运行一下ip
或ipcn
查一下当前当前ip,正常的话又变回你的外网ip了,比如“北京联通”、“鹏博士”等等。
ip和ipcn是两个自定义的命令,它们的不同这处在于查询ip所用的网站不同,ip
命令请求的是国外的一个查询ip的网站,ipcn
请求的是国内的一个查询ip的网站。
注意,终端每一个标签(或窗口)都是单独的,也就是你当前标签用setproxy
设置使用代理后,你再开一个标签,是不会走代理的,要走的话还要再执行一遍setproxy
。
注:windows powershell可以用以下方法设置代理
# 设置代理
netsh winhttp set proxy http://127.0.0.1:10809
# 取消设置代理
netsh winhttp reset proxy
设置了代理也ping不通google问题
原因:ping使用的是ICMP协议,属于IP层,而代理只能代理传输层(SOCKS5)和应用层(HTTP),所以ping是无法使用代理的。
解决办法:使用httping或者curl来代替。
具体操作请查看:使用了代理也无法ping通google的原因及其解决办法。
[…] 常规解决:用 Proxifier?【失败】参见 这一篇 […]
使用Mac上的Mail确实偶尔可以接收到gmail的消息,只能短暂连接,做不到实时。感谢终端代理
不客气,建议用qv2ray就可以解决mac Mail无法收gmail的问题
给终端设置环境变量就可以走代理了 export https_proxy=127.0.0.1:1087
Mellow完美解决
感谢推荐!我写这篇文章时,Mellow还没出来,所以不知道有这个软件,有需要的童鞋可以自己去看看:https://github.com/eycorsican/mellow
请问mellow上怎么添加代理呢