2012年3月27日 星期二

命令列下寄送mail:本篇告訴你怎麼寄純文字、加附檔及HTML格式的mail


December 18, 2006


在Unix命令列下寄送mail

在命令列下寄送mail很多人都會,但是更多人不會。本篇告訴你怎麼寄純文字、加附檔及HTML格式的mail 。

在Unix的系統管理上我們常會把各式各樣指令的輸出導到檔案去,但是檔案在系統上,想看一下內容難免還得要登入上去。於是懶惰的人就會把這些輸出寄出來給相關的人,這樣就不需要還得連進去系統了。
在Unix下寄mail是一件很平常的事,有人可能會覺得這個有點老生常談,但事實是還是有人會來問我命令列下要怎麼寄 mail,而這個問題在網路上應該還是FAQ中的FAQ。
在Unix下最常被用來寄信的指令應該非mail莫屬,因為它普遍的存在各種不同版本不同平台的Unix系統上。或許你習慣用它的加強版mailx。不過這二個用起來差不多我也不清楚到底有什麼差別,知道的人跟我講一下吧。另外有一個指令叫mutt 它是一個功能相當強大的MUA軟體,如果你有安裝的話,也可以使用它來寄mail。
假設你想把/etc/hosts的內容傳到你的電腦上,你不需要使用ftp來把它抓到你的電腦,只要使用指令來將它寄給你自己。
# cat /etc/hosts |mailx -s 'hosts table' jerry@abc.com
許多人應該都知道要怎麼用,而且也很多人應該是這樣子用的。上面的指令並沒有錯,只是可以直接把檔案導入給 mailx,為什麼要cat給mailx呢?公司薪水給的又不多,實在沒必要多花時間在處理公事上,所以字能少打就少打吧。
# mailx -s 'hosts table' jerry@abc.com < /etc/hosts
-s(Subject)是主旨,如果主旨有空白字元的話,記得要用單引號(')或是雙引號(")括起來。最後一個參數是收件人,如果收件人有多個的時候要用逗號(,)分隔,如jerry@abc.com,jerry@abc.com.tw。
或者你在Linux下,而且又裝了mutt。你也可以使用mutt來寄信,mutt的參數和mail差不多。
# mutt -s 'hosts table' jerry@abc.com < /etc/hosts
可是這樣子寄,/etc/hosts的內容是在信裡面呀,我想把它變成附件可以嗎?當然可以,只要跟其他的程式配合就可以了。
# uuencode /etc/hosts hosts.txt | mailx -s 'hosts table' jerry@abc.com
利用uuencode把/etc/hosts編碼過後丟給mailx就可以了,uuencode第一個參數是要編碼的檔案,第二個參數是編碼後的檔名,在這裡就是附件的檔名。下面的例子示範了把tar檔變成附件直接寄出。
# tar cf - /etc/* | uuencode etc.tar | mailx -s 'hosts table' jerry@abc.com
如果你用的是mutt那就更簡單了。只要加個-a(attach file)
# echo '/etc/hosts'|mutt -a /etc/hosts -s 'hosts table' jerry@abc.com
有人會問說,Jerry,我不要只是寄純文字的mail,可以寄html格式的mail嗎?在我回答之前,可以容許我先打你一拳嗎?如果你有mutt(1.5.x 以上才行)的話要寄html格式的mail就很容易了(什麼,到這個時候還沒發現mutt有多好用嗎?還不快去裝起來。)。一行指令就可以搞定。
# mutt -e 'set content_type="text/html"' jerry@abc.com -s 'html format' < my.html
mutt允許我們對要寄出的mail修改它的檔頭(header),所以可以使用-e來設定檔頭的變數content_type為"text/html",這個變數名稱content_type和真正檔頭Content-type的字不一樣哦!不要搞錯了。最後再導入一個html格式的檔案給它就可以了。記住,-e後面那一串字不能錯哦!(1.5.x 以上才有這個變數。)
如果沒有mutt呢!裝一個,不然就繼續看下去。絕大多數的Unix系統應該都有內建sendmail,而sendmail有個參數-t可以達成我們的要求。看看下面的範例。
# echo 'Mime-Version: 1.0
> Content-type: text/html; charset="iso-8859-1"
> From: jerry@abc.com
> To: jerry@abc.com.tw
> Subject: test.......
>
html file
> ' | sendmail -t
使用echo把檔頭和所要html的內容全部輸出給sendmail這樣子就可以了。不過我想沒人會真的在命令列這樣使用,多半會用在script裡面。下面提供一個script範例給你參考,主要的部份在被#包住的那個區塊,把你要的輸出做成html格式就可以了。
#!/bin/sh
fromuser=jerry@abc.com
touser=jerry@abc.com,abc,boss@abc.com
subject="`uname -n` df output"
sendmail="/usr/sbin/sendmail -t"
header="Mime-Version: 1.0
Content-type: text/html; charset="iso-8859-1"
From: $fromuser
To: $touser
Subject: $subject
"



footer="
"
{
echo "$header"
### replace your code here. ###
df -k |awk '/^//{$5=sprintf("%2d%",$5) ; print $0}'
###############################
echo "$footer"
} | $sendmail
下面二個script,第一個是shell script;第二個是perl script,你可以把要輸出的內容存成html檔,再用sendhtml直接寄出html格式的mail。寫的不怎麼樣,但最少可以使用啦!也給你一個想法做參考,你可以以此延伸然後寫一個符合你的script。
使用的方法如下,
sendhtml.pl "my subject" jerry@abc.com my_file.html
#!/bin/sh
## usage : sendhtml.sh subject To_User html_file
subject="$1"
touser="$2"
htmlfile="$3"
fromuser="jerry@abc.com"
sendmail="/usr/sbin/sendmail -t"
header="Mime-Version: 1.0
Content-type: text/html; charset="iso-8859-1"
From: $fromuser
To: $touser
Subject: $subject"
{
echo "$header"
cat "$htmlfile"
} | $sendmail
#!/usr/bin/perl -w
# usage : sendhtml.pl subject To_User html_file
my $sendmail = "/usr/sbin/sendmail";
my $fromuser = "jerry@abc.com";
$subject = $ARGV[0];
$touser = $ARGV[1];
$htmlfile = $ARGV[2];
$header="Mime-Version: 1.0
Content-type: text/html; charset="iso-8859-1"
From: $fromuser
To: $touser
Subject: $subjectn";
open(fd2, "| $sendmail -t");
print fd2 $header;
open(fd1, $htmlfile);
while(my $line=) {
print fd2 "$linen";
}
close(fd2);
close(fd1);
在寄附件的部份,能不用uuencode就不要用,因為uuencode+mailx所寄出來的mail並不會在檔頭的部份加入MIME編碼的訊息,而現在有越來越多的郵件程式不會正確讀取此種格式的mail。如yahoo, MSN....等webmail,在開啟這些mail時都會顯示亂碼,而不是正確的附檔,所以建議儘量使用別的程式來取代。
在命令列下寄mail的方法不只這些,如使用nail(已經改名叫mailx)或是使用perl、php....等也是可以,但以一般需求來講,我覺得這些應該已經夠了。如果你有什麼好的方法,歡迎你和大家分享。
由 m110092006 發表

Mutt發送html 格式的郵件方法


mutt配置
2009年11月10日 11:06
-i 參數把指定的文件內容當做正文
-a參數發附件

mutt -s "郵件主題" -i "正文文件名" 收件郵件


發送html郵件,一定要mutt 1.5.x版本,1.4不支持content_type變量, 用my_hdr加的gmail不支持
set content_type=text/html 一定要,不然識別不出html編碼,顯示為普通文本。 mutt1.5.x版本才支持
set charset="utf-8" 這個一定要設置,不然通過shell腳本crontab定時發信時顯示的編碼為unknown-8bit,識別不出編碼來
set content_type="text/html"
set editor="vim"

set envelope_from=yes 一定要設置,不然return-path顯示的是系統用戶名加域名,這可是我google,百度都用遍才找到的
set from="我愛你" 設置發件人
set move=no 不刪除郵件
set read_only=no
set realname="yourname"
set sendmail="/usr/sbin/sendmail -oem -oit"
set use_from=yes
set user_agent=no 發信時不顯示用戶代理信息

下面是我的配置,其餘沒有列出的參數使用默認設置
set content_type="text/html\;charset=utf-8"
set charset="utf-8"
set editor="vim"
set envelope_from=yes
set from="網站名字"
set read_only=no
set realname="test"
set send_charset="utf-8:us-ascii:iso-8859-1"
set sendmail="/usr/sbin/sendmail -oem -oit"
set use_from=yes
set user_agent=no

2012年3月23日 星期五

vim 支援 utf-8 中文,Putty 中文會有亂碼


解決了前述有關《有涯小札》的轉碼問題,《眾妙之門》的這一部份算是完全轉成了 UTF-8。下一步是其它網頁的轉碼問題。
事緣《眾妙之門》形成於 blog 還未流行的年代。當時我沒有用 WYSIWYG 的網頁編輯器,寫網頁是在文字編輯器中逐字逐字輸入的。現在《眾妙之門》中還保留著一些以 Big5 編碼的中文 HTML 文件(例如荒廢多時的 hohoSearch)。這些文件有待逐一以 iconv 程式轉碼。用 shell script 寫個 loop 來做,應該很容易完成。
問題是以後再要輸入中文 HTML 檔時怎麼辦。我的 Linux 以 Big5 編碼,而在 vim/gvim 輸入中文時,寫出來的也是 Big5 編碼的文件。總不能每次輸入完成之後,用 iconv 逐一轉換吧!幸好,偉大的 Google 很快給我答案。原來 vim/gvim 對 UTF-8 支援得很好,只是我這個井底之蛙沒有好好利用而已。以下的網頁提供了重要的啟示:
  1. vim 與 UTF-8 – 怕失憶筆記
  2. 讓 Vim 可以自己使用 UTF-8 & BIG5 – 小明網誌
  3. Vim 檔案編碼及格式 – wiki.gentoo.org.tw
  4. Vim documentation: mbyte
經理解消化之後,在自己的 .vimrc 加入了以下的設定,令 vim/gvim 遇到中文檔時,懂得選擇正確的編碼。而在建立新檔時,也自動以 utf-8 編碼:
“Default encoding
set fileencodings=utf-8,big5,gbk,latin1
set fileencoding=utf-8
實驗証明,這已能滿足大部份所需,讀寫都不成問題。最後,有時要強迫改變檔案的編碼,所以再加入以下設定:
“Hot key to switch between Big5 and UTF-8
set =^U
set =^B
map :set fileencoding=utf-8
map :set fileencoding=big5
以後便可以在 vim/gvim 裡按 ctrl-u 及 ctrl-b 來轉換編碼。
按:其實 gedit 也能自動選擇正確的編碼,不過在整體功能上,gedit 遠不及 vim/gvim(除了emacs 之外,又有哪個編輯器能及得上 vim/gvim?),所以不得不在 vim/gvim 上尋求解決之法。
----------------------------------------------------------
----------------------------------------------------------

Putty 中文會有亂碼Putty 中文會有亂碼

Putty 中文會有亂碼

Putty 進Fedora 中文會有亂碼??
Fedora 預設使用 UTF-8 編碼, 您用 putty 連入
可能會看到亂碼, 若改成 big5 編碼, 應該可以看到.

修改vim /etc/sysconfig/i18n 前二項設定如下:

vim /etc/sysconfig/i18n

LANG="zh_TW.Big5"
SUPPORTED="zh_TW.Big5:zh_TW:zh"

SYSFONT="latarcyrheb-sun16"
 


/etc/rc.dinit.d/i18n restart
Reference: 
http://yu-li-liang.blogspot.com/2010/10/putty.html 

2012年3月21日 星期三

Samsung Galaxy S II I9100 購機驗機完全指南


1.出廠日期查詢方法
    進入撥號輸入 *#197328640# 進工程模式(水貨)
    進入撥號輸入 *#*#197328640#*#*#* (台灣公司貨)
    
    點菜單鍵再點Key Input輸入值2;
    再點菜單鍵點Key Input輸入值2;
    再點菜單鍵點Key Input輸入值4;
    就可以看到cal date:顯示出廠日期。
2.看通話時間:
    *#*#4636#*#* 這是看通話時間的 在1分鐘以內才是正常的(一分鐘都不算正常,可以用來推測是否是返修機之類的)
3.測試有無鎖三鍵:
    音量下鍵+HOME鍵+電源鍵,如果能出現機器人挖煤的動畫,就是無鎖三鍵,反之就是鎖三鍵.
4.測試有無網絡鎖
    *#7465625# 這是看是不是鎖機 只要是OFF就是正常,如果第二項「network lock」值為"disable"表示無網絡鎖,值為"enable"表示有鎖。
    還有一個方法是查版本:*#1234#,如果顯示為: PDA:I900DZHG1/DZHG1
    手機:三星i9100NSPRO 一定有鎖.
5.識別機器的原產地
    在待機狀態下,點擊撥號鍵
    輸入: *#1546792*#,然後進入工程模式, 選擇 Preconfiguration 這時會提示輸入密碼,輸入: *#81230*# 然後確認,
    如果手機商沒有更改過"select a counrty"這一欄,就是您機器的產地,由此,可以辨別出是港版還是歐版 或亞太版,我的查了後是台灣的. bri
6.屏幕檢測:
    *#0*# 工程測試 買機必測
    第一行 三個原色測試
    第二行 1聲音 2振動 3亮度降低
    第三行 1照相 2磁傳感器 3觸摸屏
    第四行 1休眠模式 2重力感應
    裡面有「LCD TEST",按「RED」全屏顯紅色,按「green」 全屏顯綠色,按「blue」顯藍色,如要返回測試菜單,請按中間的確認鍵,退出按掛機鍵。
7.IMEI 碼檢驗:
    輸入 *#06# ,查看手機內存中的IMEI 碼,記住這個號碼,然後輸入 *2767*3855# 進行i900碼片復位,手機會自動重啟,
    最後再輸入 *#06# ,查看這個IMEI碼有沒有改變,如果這個號碼與手機背貼、外包裝盒上的 IMEI 碼一致,且型號核准號碼與手機型號一致 ,
    就證明是原廠正宗貨。如果不一致,或者變成了一串亂碼,則證明該手機要麼是水改機,要麼是翻新機。如果指令不被執行,則說明碼片復位功能已被手機商屏蔽掉了。
切記:此操作相當於硬啟手機  這個指令 有安裝好程序者 不要執行 會清除所有個資
8.其他方面
    外觀,前後攝像頭,電池,觸屏等檢查沒太多技術含量,就不一一敘述了。
    希望此文對購機的朋友帶來幫助。


附註:三星i9100購機識別翻新機及驗機指南
購機驗貨:
        1.仔細看屏幕內有無印痕,數據線,耳機孔,揚聲器孔,掛帶孔是否有灰塵
        2.仔細看機身電池卡鎖處有無撥痕,上下蓋旋軸處有無旋印
        3.仔細檢查WAP和語音功能及通話紀錄信息功能中有無記錄
        4.聞氣味,新機器有檀香,在購買後10-12天消散,這種味道不同於一般的清潔劑和香水味.機身不能有粘粘的蠟和油(有的話就是被商家美容了)
        5.仔細檢查SIM卡接觸點,機身電池接觸點有無磨痕
        6.看外殼的接縫處間隙是否均勻而且在1MM以下,有無撬痕,上蓋內屏幕下兩封點有無挑痕
        7.與新機器對比按鍵的彈性和內外顯示屏的亮度
        8.仔細看機身的固定鑼釘有無旋印,塗漆塗墨(可以用放大鏡),商標有無撬痕
        9.看劃痕貼膜,新機都是一體壓膜,原裝膜內絕對不會有氣泡,並且機器沒有劃痕
        10.看出場日期,購機時間和出場日期一般不會相差2月.如果差距太大,則懷疑為翻新,
        出場日期查詢:
        在電話撥號界面輸入*#0228#然後按BACK,再按BACK之後選2 (打開輸入法輸入數字2,以下類推) VERSIon INFORMATIon
        在選2 HW-VERFR-CAL-DATE 再選4 READ CALDATE 我的查了後出場日期為:2010 09 25,購買日期為3月初,應該不是翻新或二手機.
        11.看電話版本後是否帶除版本以外字樣,此類機器有電話鎖,無法刷機.一般來講,一些歐美定制機就有網絡鎖,如O版,T-MOBILE版,正常的歐水,港版,亞太版都沒有的.想知道I9100有沒網絡鎖很簡單如下:
        工程模式:*#7465625#,如果第二項「network lock」值為"disable"表示無網絡鎖,值為"enable"表示有鎖。
        還有一個方法是查版本:*#1234#,如果顯示為:
        PDA:I900DZHG1/DZHG1
        手機:三星i9100NSPRO一定有鎖.
        12.識別機器的原產地
        在待機狀態下,點擊撥號鍵輸入*#1546792*#然後進入工程模式,選擇 Preconfiguration
        這時會提示輸入密碼,輸入*#81230*# 然後確認
        如果JS沒有更改過"select a counrty"這一欄,就是您機器的產地,由此,可以辨別出是港版還是歐版或亞太版,我的查了後是新加坡的. 2 q#
        還有一個外觀檢測,看機器背後"SAMSUNG" ,如果是陰刻一般是來至歐洲,陽刻,來之香港。
        13,用機器自帶圖仔細檢查亮點.想知道自己的I9100的屏幕如何,有沒有壞點,就在電話狀態下輸入*#0*#,裡面有「LCD TEST",按「RED」全屏顯紅色,按「green」 全屏顯綠色,按「blue」顯藍色,如要返回測試菜單,請按中間的確認鍵,退出按掛機鍵。
        14.IMEI 碼檢驗
        輸入 *#06# ,查看手機內存中的IMEI 碼,記住這個號碼,然後輸入 *2767*3855# 進行i900碼片復位,手機會自動重啟,最後再輸入 * ,查看這個IMEI碼有沒有改變,如果這個號碼與手機背貼、外包裝盒上的 IMEI 碼一致,且型號核准號碼與手機型號一致 ,就證明是原廠正宗貨。如果不一致,或者變成了一串亂碼,則證明該手機要麼是水改機,要麼是翻新機。如果指令不被執行,則說明碼片復位功能已被手機商屏蔽掉了。切記:此操作相當於硬啟手機.
        15.補充方案
        可以查詢水貨手機的產地和銷往方向及生產日期之類,可以查你的機器是不是正宗的水機!
        方法一:看不懂英文的朋友可以配合翻譯網站使用,進去後點左邊Number analysis tools 然後再點中間的IMEI number analysis 好了,輸入你手機後面的IMEI串號就可以查看了!

2012年3月14日 星期三

安裝配置mutt


二、安裝配置mutt
1、一般Linux都會默認安裝mutt,CentOS也不例外
可以使用which mutt查看mutt安裝的路徑,如果沒有安裝可以使用# yum install mutt
2、編輯mutt配置文件
vi /etc/Muttrc ,編輯mutt的總設置,修改以下幾行
set from="發送郵件地址" 
set sendmail="/usr/local/msmtp/bin/msmtp" 
set use_from=yes 
set realname="發件人" 
set editor="vi"
發件地址最好與msmtp設置的賬號相同,否則可能會出錯。
vi ~/.muttrc , 編輯根目錄下的設置
set envelope_from=yes 
set from="發送郵件地址" 
set realname="發件人" 
set use_from=yes
3、測試一下mutt是否有效
echo "測試測試" | mutt -s "測試" 測試郵件地址
echo "test" | mutt -s "my_first_test" abc@abc.com
下面就可以使用mutt進行郵件備份等工作了,結合cron使用,可以實現的功能相當多。
-----
這裡的-a什麼指新增附件,如果什麼多個附件的話就多加幾個-a文件名
還可以這樣

mutt -s "test" -a /etc/hosts -a /etc/apple abc@abc.com < /tmp/imax.txt

這個的意思就是以  /tmp/imax.txt 文件的內容作為郵件內容。
好了,就這麼簡單


使用 ssmtp 於 shell 透過 Gmail 寄信


使用 ssmtp 於 shell 透過 Gmail 寄信


有很多程式於 bash shell 執行, 執行完要自動寄信出去, 但是最近都被 Google 退信, 最好的方法是透過 Gmail 直接寄信.
本來是要另外寫隻 script 來做這種事, 剛剛發現 $4 的介紹文, 真是超方便的, 一樣使用原本 shell 的 mail, script 都不需要改, 只要設定設一設即可~
詳細可見: 利用 ssmtp 透過 Gmail 在文字模式下寄信 (下述部份轉載自此文)

ssmtp 安裝、設定

  1. apt-get install ssmtp # 註: 若有安裝 Postfix, Postfix 會被移除.
  2. vim /etc/ssmtp/ssmtp.conf
    AuthUser=user.name@gmail.com # 寄件者帳號
    AuthPass=password # 寄件者密碼
    FromLineOverride=YES
    mailhub=smtp.gmail.com:587
    UseSTARTTLS=YES

AuthPass=password 存的是明碼

測試

  • 下述的 mail 可選用 mailutils 或 mailx 的 mail 程式.
  • echo "This is a test mail." | mail -s "test mail" rec.user.name@gmail.com

mutt and ssmtp configuration



安裝

由於默認的倉庫中沒有包含sSMTP,所以我們使用Fedora's EPEL repo (http://fedoraproject.org/wiki/EPEL)
先安裝EPEL repo
wget http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

yum install ssmtp

但我有個經驗,可能因為 /etc/yum.repos.d/CentOS-Base.repo 資料太舊或沒更新,造成你無法yum抓到ssmtp.
你需要改一下yum repository 

/etc/yum.repos.d/CentOS-Base.repo 
把它改名 /etc/yum.repos.d/CentOS-Base.repo.old不要讓它讀取到,它自己將會抓新的yum infomation.



ssmtp
http://edt1023.sayya.org/slackware/10.2/ssmtp-2.60.4-i586-1.tgz
寄信工具,如果你只是一般的使用者,那麼你從 local 寄信的話,由於無法反解,對方會拒收信。所以,我們利用 ssmtp 經由 ISP 來寄信。他需要設定兩個檔: 

代碼:
# /usr/etc/ssmtp/revaliases
edt1023:edt1023@ms17.hinet.net:ms1.hinet.net

# /usr/etc/ssmtp/ssmtp.conf
root=postmaster
mailhub=ms1.hinet.net
FromLineOverride=YES

這樣就行了。當然我們這時就不用 sendmail 寄信,而是由 ssmtp 來寄信,所以 ~/.muttrc 中的 sendmail 要改成 ssmtp:

代碼:
set sendmail="/usr/sbin/ssmtp"




參考資料
http://cle.linux.org.tw/forum/viewtopic.php?t=572
http://crunchbanglinux.org/wiki/howto/howto_setup_mutt_with_gmail_imap
http://newsgroups.derkeiler.com/Archive/Comp/comp.mail.mutt/2009-03/msg00031.html
http://blog.csdn.net/orzorz/article/details/5822675
http://blog.bin9.com/html/n2011/1203.html
http://mail.microsoftonline.com
http://linux.sheup.com/linux/4/31048.html
http://www.linuxsir.org/bbs/thread360479.html

2012年3月13日 星期二

Linux (Redhat / Fedora / CentOS) 更改 hostname 完整的方式


Linux (Redhat / Fedora / CentOS) 更改 hostname 的方式

發現更改主機的 hostname 的方式都改不太完整. 以下是試出來比較完整的方式:

Step 00:

  • 假設原本 hostname 為 tryboxap2, 現在想要更改為 tryboxap03
  • 使用 root 才可以更改 hostname
su - root

Step 01:

  • 將 /etc/hosts 內出現的 tryboxap2 都改成 tryboxap03
:
127.0.0.1 tryboxap03 localhost.localdomain localhost

Step 02:

  • 將 /etc/sysconfig/network 內的 HOSTNAME 改成 tryboxap03
NETWORKING=yes
HOSTNAME=tryboxap03
GATEWAY=61.67.71.126

Step 03:

  • 再使用 hostname 命令指定一次
hostname tryboxap03
  • 這時就已經設定完成. 可以使用 hostname 命令去確認一次
[root@tryboxap2 etc]# hostname
tryboxap03
[root@tryboxap2 etc]#
只要重新登入, 命令提示字串就會改成 [root@tryboxap03 etc]#

如何在Windows的事件檢視器event viewer,查詢開機關機的紀錄

Windows 如何 事件檢視器 查詢開機關機紀錄 Step1: 打開windows的 「 事件檢視器 」,開啟「 建立自訂檢視… 」視窗,在「事件記錄檔」選項,將「Windows 紀錄」內勾選「系統」選項。 Step2: 內含/排除事件識別碼: 」排除事件識別碼打「6005,6...