Total Pageviews

Thursday, 24 March 2022

如何为mac自带的 Mail.app 使用PAC配置Socks代理?

问:因为众所周知的原因,早在几年前,Gmail 就无法正常登录了;但彼时尚能够通过邮件客户端(Foxmail、Outlook、Mail、ThunderBird)收发邮件。但是,从昨天(2014-12-27)开始,此类客户端也无法正常收发邮件。

因为邮件使用 POP3、IMAP、SMTP 等协议并不能通过 HTTP 代理,因此考虑使用 Socks 代理来解决此问题。考虑到 Mail.app 并没有提供单独的代理设置界面,所以只得使用 PAC 来配置代理。

代理配置完毕之后,如果设置全部流量都通过 Socks 代理,则 Mail.app 可以正常工作,收发 Gmail 邮箱的邮件。然则若通过 PAC 来配置代理,Safari 可以「正常」上网,但 Mail.app 依旧无法正常收发邮件。

请教应当如何配置,或是还需要提供什么信息。

System Info:
OS X 10.9.5
Mail.app 7.3 (1878.6)

回答1: 用 Proxifier,或proxychains 或者类似物。

回答2: 恰好碰到这个问题。有某个本地的socks proxy就够了,根本不需要其他答案提到的Proxifier。

见图:https://pic1.zhimg.com/50/v2-8d6571a148befe1872c6eb94e28b7088_720w.jpg

后续:

我发现重启后这个设置需要重新填写。这个设置也可以通过命令行解决,假设要设置 Wi-Fi 网络:

sudo networksetup -setsocksfirewallproxy "Wi-Fi" localhost 1080

如果要完全解决这个问题,可以使用 cronjob 去执行下面这段 ruby 代码,这样一来重启有效,二来有时候切换成全局模式再切回自动模式,cron 脚本也会帮你自动设置 proxy。

require 'socket'
require 'timeout'

def is_port_open?(ip, port)
  begin
    Timeout::timeout(1) do
      begin
        s = TCPSocket.new(ip, port)
        s.close
        return true
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        return false
      end
    end
  rescue Timeout::Error
  end

  return false
end

if is_port_open?('localhost', 1080) 
  if `/usr/sbin/networksetup -getsocksfirewallproxy "Wi-Fi" `.include?("Enabled: No")
    puts "set proxy"
    `/usr/sbin/networksetup -setsocksfirewallproxy "Wi-Fi" localhost 1080`
  end
else
  puts "unset proxy"
  `/usr/sbin/networksetup -setsocksfirewallproxy "Wi-Fi" "" ""`
end

Cron job 添加方法:

crontab -e

然后填入

* * * * * ruby /path1/path2/set_proxy.rb

(假设上面的文件保存为set_proxy.rb, 完整路径是/path1/path2/set_proxy.rb)


回答3: Mail.app不支持SOCKS5代理,这是苹果的设计缺陷。

或者说,这是苹果产品一贯的设计思路,他是想让你使用系统全局代理。

来自:https://www.zhihu.com/question/27289501

No comments:

Post a Comment