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

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

自带邮箱客户端Mail

使用Mail存在的问题

对于有gmail邮箱又喜欢用自带邮箱客户端(Mail.app)的Mac用户来说,最苦恼的是Mail客户端本身没有代理功能,而各类科学上网软件在“自动代理模式”下,Mail并不会走代理,原因是自动代理只是代理http协议请求,而邮件协议是SMTP/IMAP/POP3,所以在自动代理模式下Mail客户端无法收发gmail邮件。

当科学上网软件开全局代理后,虽然Mail客户端能实现收发gmail(因为全局代理添加了socks5代理,SMTP/IMAP/POP3是应用层代理,socks5是会话层代理,在应用层之下,所以可以代理应用层数据包),但一直开全局肯定不是我们想要的,并且也不可能说我想要收gmail邮件的时候再去开一下全局,这非常不方便也无法让你及时收到gmail邮件。

解决Mail无法上gmail的问题

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

配置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

后续:我发现非常奇怪,不使用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输出提示,用于提示你已经设置为使用代理和你已经取消使用代理了。

最后的命令如下:

# 设置使用代理
alias setproxy="export https_proxy=http://127.0.0.1:1087; export http_proxy=http://127.0.0.1:1087; export all_proxy=socks5://127.0.0.1:1086; 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的命令。

重新读取一下配置:

source ~/.bashrc

然后我们要使用代理时,运行setproxy,回车就可以了,然后你运行命令都会走代理了;运行一下ipipcn就可以查询当前ip,如果确实使用了代理,那么出来的ip会是代理的ip;要取消使用代理,运行unsetproxy,回车,然后你运行命令就不走代理了,然后再运行一下ipipcn查一下当前当前ip,正常的话又变回你的外网ip了,比如“北京联通”、“鹏博士”等等。

ip和ipcn是两个自定义的命令,它们的不同这处在于查询ip所用的网站不同,ip命令请求的是国外的一个查询ip的网站,ipcn请求的是国内的一个查询ip的网站。

注意,终端每一个标签是单独的,也就是你当前标签用setproxy设置使用代理后,你再开一个标签,是不会走代理的,要走的话还要再执行一遍setproxy

设置了代理也ping不通google问题

即使设置了使用代理,也是不能用ping来ping通google的,原因是现在的代理都是SOCKS5协议代理,它只能代理TCP和UDP(传输层)流量,而ping命令使用的协议是ICMP(Internet Control Message Protocol, 网络控制报文协议),ICMP协议是IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议,而IP层是在传输层的下层,所以SOCKS5代理是无论如果也不可能代理到ICMP协议流量的,ping是不可能走代理的。

要查看是否已经设置代理,可以用curl,比如看google是否通,可以先setproxy,然后用:

curl https://www.google.com

如果返回一大片内容,那就是能访问,那一大片内容就是google首页的html源码,如果报以下错误,那就是不能访问,就是没走代理或者代理有问题:

curl: (7) Failed connect to www.google.com:443; Connection timed out

其实有一个叫httping的命令,它是使用http协议的,所以是可以走代理的,但是遇到https协议的经常出问题,网上很多老外也说遇到这问题,我也遇到了,所以也没必要用它了,用curl即可。

打赏

2
Leave a Reply

avatar
1 Comment threads
1 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
xiebruceFeeling Recent comment authors

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of
Feeling
Guest
Feeling

Mellow完美解决

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

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