用 ssmtp 取代 sendmail

情境是,某主機僅提供網頁之服務,要將所有透過網頁或是系統寄出去的信轉到同一網域下的 smtp server。
雖然 sendmail 也可以做這件事,但 sendmail 的設定是在是太麻煩了,安裝新的程式還比較省時 😛

ssmtp 是一隻專門做這件事的程式,他本身沒有寄信的功能,僅能 forward 信件到外部 smtp server。

# cd /usr/ports/mail/ssmtp; make install replace

replace 可以把 sendmail 直接取代掉。

安裝好之後,修改設定檔:

root=[誰要收 root 的信]
mailhub=[外部 smtp server]
rewriteDomain=[寄出的信會顯示的來源網域]
hostname=[本機 hostname]
#FromLineOverride=YES
#這一行可以允許寄件人自訂信件的來源信箱

另外,也可以修改 php.ini:

sendmail_path = /usr/local/sbin/ssmtp -t

記得 man ssmtp 一下看看 ssmtp 有哪些男人可以看。

用 ssmtp 取代 sendmail

[Android] 使用 HttpClient post 資料到伺服器

其實 Android 有內建 HttpClient 的 library,但是實在是太舊了(4.0beta2),所以用了熱心人士重新包裝過後的 新版,雖然有點大,不過把常用的都包進去了,應該不會踩到一些陳年老 bug。

下面的 code 還有用到 Apache Commons IO,這裡 可以下載。

private void postData(String url, String filepath, String filename ) throws Exception {
        
        byte[] data;
        
        HttpPost httppost = new HttpPost(url);
        HttpClient httpclient = HttpClientBuilder.create().build();
        
        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
        entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        
        InputStream inputStream = new FileInputStream(filepath);
        data = IOUtils.toByteArray(inputStream);
        InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), filename);
        
        //entityBuilder.addTextBody("action", "test");
        //entityBuilder.addBinaryBody("file", file);
        entityBuilder.addPart("file", inputStreamBody);

        HttpEntity entity = entityBuilder.build();
        httppost.setEntity(entity);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity httpEntity = response.getEntity();

        String result = EntityUtils.toString(httpEntity);
        Log.d("uploader", result);
        
}

DefaultHttpClient 已經過時了,不建議使用,所以用 HttpClientBuilder 代替。

[Android] 使用 HttpClient post 資料到伺服器

FreeBSD pkgng 套件管理系統

FreeBSD 套件管理分為 ports 與 pkg,其中 ports 主要是包含軟體的原始碼,如果要安裝軟體需要從原始碼編譯,優點是可以更改一些編譯選項,自訂一些平常可能不會用到的設定。pkg 則是預先編譯好的軟體,直接下載回來就可以用。使用上其實不是相當方便,舉例來說相依性的問題要自己處理,雖然有像是 portmaster 之類的工具,但是比起 pacman、aptitude 之流,還是有一段距離。

pkgng 是 FreeBSD 下一代的套件管理系統(FreeBSD 10 的預設值),由現有的 pkg 轉移到 pkgng 十分簡單,官方什麼都想好了。

如果還沒有安裝 pkg,使用以下指令安裝:
# cd /usr/ports/ports-mgmt/pkg; make install clean

然後,用 # pkg2ng 將現有的 pkg 轉移到 pkgng 格式。

轉換好了之後,為了確定以後都使用 pkgng 的格式,在 /etc/make.conf 裡面加入:

WITH_PKGNG=YES

不過,在安裝軟體之前,先設定官方的套件庫,建立以下的檔案:

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  enabled: yes
}

之後,你就可以下 pkg install <軟體> 來安裝檔案了!
pkg 可以知道有哪些指令可以下,大致上都跟以前類似,例如 pkg_version -v 改成 pkg version -v,還可以用 # pkgng audit -F 取代以前的 # portaudit -adF 來檢查現有的套件是否有安全性問題!

我的建議:如果要安裝預先編譯的 binary 套件,就使用 pkg 安裝,如果想要自訂編譯選項,就用 portmaster,也很方便!

舊的 pkg_* 工具會在 2014/09/01 正式停止支援。

參考資料

來,跟 pkg_ 說掰掰
http://www.freebsd.org/doc/handbook/pkgng-intro.html
http://lists.freebsd.org/pipermail/freebsd-pkg/2013-October/000107.html
https://wiki.freebsd.org/pkgng

FreeBSD pkgng 套件管理系統