Mac让Mail(自带邮箱客户端)的gmail走代理及终端走代理

Mac让Mail(自带邮箱客户端)的gmail走代理及终端走代理

自带邮箱客户端Mail

使用Mail存在的问题

对于有gmail邮箱又喜欢用自带邮箱客户端(Mail.app)的Mac用户来说,最苦恼的是Mail客户端本身没有代理功能,而各类科学上网软件在pac(自动代理)下,Mail并不会走代理,原因是自动代理其实是通过一个js脚本来判断哪些域名走代理,而哪些域名直连,我猜测是只有浏览器才能解析这个js,或者被代理的软件虽然不是浏览器,但有能力解析这个js文件。

就猜v2rayU来说,如果你选择pac模式并启动后,它会勾选“系统偏好设置→网络→WIFI→高级→代理→自动代理配置”,并自动填写pac文件地址
image.jpg

这个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的问题(老方法)

关于解决这个的办法,有ProxyCapSurgeProxifierProxyChainsPrivoxyproximac可用,前三个收费,后三个免费,当然收费的一般也有你想要的破解版,但ProxyCap和Surge的新版本好久都没有破解版,所以目前选用Proxifier(也是大多数人推荐使用的),可以去xclient.info下载你想要的版本。

配置Proxifier

先添加一下Socks5代理,注意port要写你的科学上网工具的socks5代理端口:
proxifier proxy config

添加规则:
proxifier add rule
– 第③步是添加应用,表示哪些应用要走这个代理,点+号添加即可;
– 第④步则是填写要转发的目标地址,只有填在那里的地址才会被转发,而其他的地址则不会被转发(比如国内的邮箱就不用转发);
– 第⑤步填写转发目标端口,只有填写在这里的目标端口才会被转发;
– 第⑥步是规则的动作,意思是,当捕获到请求符合以上设置的规则时,要把这个请求代理到哪里,我们自然是选择前面添加过的代理,代理到本机(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 save profile

然后开着Proxifier就可以实现把Mail中对gmail的收发邮件请求转发到(即代理到)本机的科学上网软件上,然后再由科学上网软件把这个请求发送出去。

目前发现的问题就是iPhone的handoff无法通过,不知道怎么解决:
proxifier iPhone handoff.jpg
handoff问题解决方法:看报错里是什么进程,对于handoff问题,把sharingd加入不走代理就好了,见这里

后续:我发现非常奇怪,不使用Proxifier也能正常使用Mac自带的Mail.app收发gmail邮件了,但有时又有感叹号。

终端工具走代理

终端工具无法走代理的问题

对于IT行业的童鞋来说,也是很苦恼,即使你的科学上网软件开了全局代理,终端工具中使用的命令也不会走代理,原因我也不是很清楚,我个人感觉是命令不会走GUI的配置。

而且,我们并不想让所有终端命令一直走代理,原因是很多包管理工具(就比如说Mac的Homebrew)都可以设置国内源,这些肯定是不想它走代理的,但有一些又需要它走代理,怎么解决?

解决终端工具走代理问题

Mac的终端(自带或第三方都一样)是否走代理,是通过http_proxyhttps_proxyall_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_proxyhttps_proxyall_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命令设置一个命令别名,当我们运行这个命令别名时,就相当于运行了整一行命令,我分别把这两个变量设置为setproxyunsetproxy,分别表示启用代理和取消使用代理,并且为了方便,我还在设置三个变量的后面加了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,回车就可以了,然后你运行命令都会走代理了;运行一下ipipcn就可以查询当前ip,如果确实使用了代理,那么出来的ip会是代理的ip;要取消使用代理,运行unsetproxy,回车,然后你运行命令就不走代理了,然后再运行一下ipipcn查一下当前当前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的原因及其解决办法

打赏

订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

7 评论
内联反馈
查看所有评论
trackback

[…] 常规解决:用 Proxifier?【失败】参见 这一篇 […]

Julio
Julio
3 年 前

使用Mac上的Mail确实偶尔可以接收到gmail的消息,只能短暂连接,做不到实时。感谢终端代理

yao
yao
4 年 前

给终端设置环境变量就可以走代理了 export https_proxy=127.0.0.1:1087

Feeling
Feeling
5 年 前

Mellow完美解决

tse
tse
4 年 前
回复给  Feeling

请问mellow上怎么添加代理呢

7
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Mac让Mail(自带邮箱客户端)的gmail走代理及终端走代理