顯示具有 mail 標籤的文章。 顯示所有文章
顯示具有 mail 標籤的文章。 顯示所有文章

2009年9月14日 星期一

PHP中用Socket發送電子郵件

在作者所申請的幾個PHP 主頁空間中,能夠提供mail功能的實在不多,總是調用完mail()函數之後就毫
無下文了。但是電子郵件在網上生活中的作用越來越大作用我不想再說了,但是如果主頁空間不支持mail()發送那麼怎麼辦呢?我也想過通過socket來實現郵件


發送,但無奈對用php 進行socket編程不熟悉,再加上發送郵件要用到SMTP協議,又要讀不少的英文了,所
以一直也沒有去研究過。終於有一天我發現了一篇文章,關於用socket編程發送郵件。我如獲至寶般將其拷
貝下來,並且將其改造成了一個php 可用的類,供大家使用。原來的文章只是一個簡單的例子,而且還有一
些錯誤,在我經過多次的實驗、改造終於將其改成了一個直接使用socket,向指定的郵箱發送郵件的類,如
果大家和前面關於發送MIME的文章結合起來,就可以實現在不支持mail()函數的網站上發送郵件了。因為發
送郵件的過程需要時間,可能與mail()的處理機制還不完全一樣,所以速度要慢一些,但是可以解決需要發
送郵件功能的燃眉之急,同時你也可以學習用php 進行socket編程。下面就將這個類的實現原理介紹給大家,
同時向大家講解一些關於SMTP的基本知識。

Socket編程介紹
  向大家申明,本人不是一個TCP/IP編程專家,故在此只是講出了我的一點理解和體會。

  使用fsockopen函數打開一個Internet連接,函數語法格式:

int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);

  參數的意思我想不用講了,這裡由於要使用SMTP協議,所以端口號為25。在打開連接成功後,會返回一
個socket句柄,使用它就可以像使用文件句柄一樣的。可使用的操作有fputs(),fgets(),feof(),fclose()
等。

  很簡單地介紹就到這裡吧。

SMTP的基礎
  基於TCP/IP的因特網協議一般的命令格式都是通過請求/ 應答方式實現的,採用的都是文本信息,所以
處理起來要容易一些。SMTP是簡單郵件傳輸協議的簡稱,它可以實現客戶端向服務器發送郵件的功能。所以
下面所講的命令是指客戶端向服務器發出請求指令,而響應則是指服務器返回給客戶端的信息。

  SMTP分為命令頭和信息體兩部分。命令頭主要完成客戶端與服務器的連接,驗證等。整個過程由多條命
令組成。每個命令發到服務器後,由服務器給出響應信息,一般為3 位數字的響應碼和響應文本。不同的服
務器返回的響應碼是遵守協議的,但是響應正文本則不必。每個命令及響應的最後都有一個回車符,這樣使
用fputs()和fgets()就可以進行命令與響應的處理了。SMTP的命令及響應信息都是單行的。信息體蚴怯始?
的正文部分,最後的結束行應以單獨的"."作為結束行。

  客戶端一些常用的SMTP指令為:

HELO hostname: 與服務器打招呼並告知客戶端使用的機器名字,可以隨便填寫
MAIL FROM: sender_id : 告訴服務器發信人的地址
RCPT TO: receiver_id : 告訴服務器收信人的地址
DATA : 下面開始傳輸信件內容,且最後要以只含有.的特殊行結束
RESET: 取消剛才的指令,從新開始
VERIFY userid: 校驗帳號是否存在(此指令為可選指令,服務器可能不支持)
QUIT : 退出連接,結束
  服務器返回的響應信息為(格式為:響應碼+空格+解釋):

220 服務就緒(在socket連接成功時,會返回此信息)
221 正在處理
250 請求郵件動作正確,完成(HELO,MAIL FROM,RCPT TO,QUIT指令執行成功會返回此信息)
354 開始發送數據,結束以 .(DATA指令執行成功會返回此信息,客戶端應發送信息)
500 語法錯誤,命令不能識別
550 命令不能執行,郵箱無效
552 中斷處理:用戶超出文件空間
  下面給出一個簡單的命令頭(這是在打開socket之後做的),是我向stmp.263.net發郵件的測試結果:

HELO limodou
250 smtp.263.net
MAIL FROM: chatme@263.net
250 Ok
RCPT TO: chatme@263.net
250 Ok
DATA
354 End data with .
To: chatme@263.net
From: chatme@263.net
Subject: test
From: chatme@263.net
test
.
QUIT
250 Ok: queued as C46411C5097E0

  這就是一些SMTP的簡單知識。相關內容可以查閱RFC。

RFC 821定義了收/發電子郵件的相關指令。
RFC 822則制定了郵件?容的格式。
RFC 2045-2048制定了多媒體郵件?容的格式,
RFC 1113, 1422-1424則是討論如何增進電子郵件的保密性。

send_mail類的實現
  現在開始介紹我所編寫的發送郵件類。有了上面的預備知識了,下面就是實現了。

類的成員變量

var $lastmessage; //記錄最後返回的響應信息
var $lastact; //最後的動作,字符串形式
var $welcome; //用在HELO後面,歡迎用戶
var $debug; //是否顯示調試信息
var $smtp; //smtp服務器
var $port; //smtp端口號
var $fp; //socket句柄

  其中,$lastmessage和$lastact用於記錄最後一次響應信息及執行的命令,當出錯時,用戶可以使用它
們。為了測試需要,我還定義了$debug變量,當其值為true時,會在運行過程中顯示一些執行信息,否則無
任何輸出。$fp用於保存打開後的socket句柄。

類的構造


--------------------------------------------------------------------------------
function send_mail($smtp, $welcome="", $debug=false)
{
if(empty($smtp)) die("SMTP cannt be NULL!");
$this->smtp=$smtp;
if(empty($welcome))
{
$this->welcome=gethostbyaddr("localhost");
}
else
$this->welcome=$welcome;
$this->debug=$debug;
$this->lastmessage="";
$this->lastact="";
$this->port="25";
}
--------------------------------------------------------------------------------
  這個構造函數主要完成一些初始值的判定及設置。$welcome用於HELO指令中,告訴服務器用戶的名字。
HELO指令要求為機器名,但是不用也可以。如果用戶沒有給出$welcome,則自動查找本地的機器名。

顯示調試信息

--------------------------------------------------------------------------------
1 function show_debug($message, $inout)
2 {
3 if ($this->debug)
4 {
5 if($inout=="in") //響應信息
6 {
7 $m='<< ';
8 }
9 else
10 $m='>> ';
11 if(!ereg("\n$", $message))
12 $message .= "
";
13 $message=nl2br($message);
14 echo "${m}${message}";
15 }
16 }
--------------------------------------------------------------------------------
  這個函數用來顯示調試信息。可以在$inout中指定是上傳的指令還是返回的響應,如果為上傳指令,則
使用"out";如果為返回的響應則使用"in"。

第3行,判斷是否要輸出調試信息。
第5行,判斷是否為響應信息,如果是,則在第7行將信息的前面加上"<< "來區別信息;否則在第10行加上
    ">> "來區別上傳指令。
第11-12行,判斷信息串最後是否為換行符,如不是則加上HTML換行標記。第13行將所以的換行符轉成HTML
的換行標記。
第14行,輸出整條信息,同時將信息顏色置為灰色以示區別。

執行一個命令


--------------------------------------------------------------------------------
1 function do_command($command, $code)
2 {
3 $this->lastact=$command;
4 $this->show_debug($this->lastact, "out");
5 fputs ( $this->fp, $this->lastact );
6 $this->lastmessage = fgets ( $this->fp, 512 );
7 $this->show_debug($this->lastmessage, "in");
8 if(!ereg("^$code", $this->lastmessage))
9 {
10 return false;
11 }
12 else
13 return true;
14 }
--------------------------------------------------------------------------------
  在編寫socket處理部分發現,一些命令的處理很相似,如HELO,MAIL FROM,RCPT TO,QUIT,DATA命令,
都要求根據是否顯示調試信息將相關內容顯示出來,同時對於返回的響應碼,如果是期望的,則應繼續處理,
如果不是期望的,則應中斷出理。所以為了清晰與簡化,專門對這些命令的處理編寫了一個通用處理函數。
函數的參數中$code為期望的響應碼,如果響應碼與之相同則表示處理成功,否則出錯。

第3行,記錄最後執行命令。
第4行,將上傳命令顯示出來。
第5行,則使用fputs真正向服務器傳換指令。
第6行,從服務器接收響應信息將放在最後響應消息變量中。
第7行,將響應信息顯示出來。
第8行,判斷響應信息是否期待的,如果是則第13行返回成功(true),否則在第10行返回失敗(false)。

  這樣,這個函數一方面完成指令及信息的發送顯示功能,別一方面對返回的響應判斷是否成功。

郵件發送處理

2008年2月22日 星期五

Postfix 阻擋垃圾信

Postfix 官方網站 http://www.postfix.org

下面這一段可以阻擋垃圾信件
smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
reject_rbl_client cbl.abuseat.org
reject_rbl_client bl.spamcop.net
# reject_rbl_client relays.ordb.org
reject_rbl_client sbl.spamhaus.org
# reject_rbl_client proxies.relays.monkeys.com
reject_rbl_client opm.blitzed.org
# check_policy_service unix:/var/spool/postfix/postgrey/socket


安裝好後請在 Postfix 主設定檔 /etc/postfix/main.cf 中 加上此行:

smtpd_sender_restrictions = reject_unknown_client,reject_unknown_sender_domain

這簡單的一行 就可以檔掉DNS 反查失敗的信件了 (一般都是廣告信!!)

2008年1月11日 星期五

DNS資源紀錄(Resource Record)介紹

DNS類型
SOA
NS
A
AAAA
PTR
CNAME
MX

SOA設定內容說明

Serial
Refresh
Retry
Expire
Minimum

DNS server內的每一個網域名稱都有自己的檔案,這個檔案一般會稱為區域檔案 (zone file),例如之前所提到的”named.ca”或”named.local” 檔案…等等。區域檔案是由多個記錄組成的,每一個記錄稱為資源記錄(Resource Record,簡稱RR)。當在設定DNS名稱解析、反向解析及其他的管理目的時,您需要使用不同類型的RR,底下將介紹常用的RR類型及表示法。
類型
SOA

Start Of Authority,這種 record 放在 zone file 一開始的地方,每一個記錄檔只能有一個 SOA,而且一定是檔案中第一個“記錄”,它描述這個 zone 負責的 name server,version number…等資料,以及當 slave server 要備份這個 zone 時的一些參數。 緊接在 SOA 後面指定了這個區域的授權主機和管理者的信箱,這裡分別是 "school.edu.tw" 和" root.school.edu.tw",也就是school.edu.tw主機和 root 的信箱。這裡要注意的是我們以"root.school.edu.tw"代表"root@school.edu.tw"
e.g.

@ IN SOA school.edu.tw. root.school.edu.tw. (
1999051401 ; Serial
3600 ; Refresh
300 ; Retry
3600000 ; Expire
3600 ) ; Minimum


在兩個括號中間的選項表示SOA的設定內容,底下會有更詳細的說明。
NS

name server,用來指定操作的DNS伺服器主機名稱,需注意的是不可以IP位址表示。
e.g.

IN NS dns.twnic.net.tw.


A

address,將DNS網域名稱對應到IPv4的32位元位址。
e.g.

server IN A 140.123.102.10


AAAA

可將DNS網域名稱對應到IPv6的128位元位址。
e.g.

twnic.net.tw. 86400 IN AAAA 3ffe: :bbb:93:5


PTR

pointer,定義某個 IP 對應的 domain name,即將 IP 位址轉換成主機的FQDN。
e.g.

20 IN PTR mail.twnic.net.tw.


CNAME

canonical name,可為同一部主機設定許多別名,例如 mix.twnic.net.tw的別名可為 www.twnic.net.tw和 ftp.twnic.net.tw,因此所設定的別名都會連至同一部伺服器。
e.g.

www IN CNAME mix


MX

mail exchanger,設定區域中擔任郵件伺服器的主機,所有要送往那部機器的 mail 都要經過 mail exchanger 轉送。而數字則是該主機郵件傳遞時的優先次序,此值越低表示有越高的郵件處理優先權。
e.g.

server IN MX 10 mail.twnic.net.tw.

相關問題回覆討論:
anan
2003-02-22, 02:21 AM
請教各位:

何謂MX記錄,要如何設定
小弟購買了尊龍的MAIL SERVER軟體,在設定郵件名稱時
它跳出一個視窗,告知我沒有MX記錄,會影響收信功能
請問真的會影響嗎?
小弟在DNS設定中有設一"郵件交換"內容是
郵件交換程式(MX) 請問這算不算是MX記錄呢?
參考所購買的書籍並沒有講解到MX記錄,所以來此向各
位請教,謝謝

SOA設定內容說明

SOA record,以之前例子來看,其中 @ 這個符號是縮寫,代表 named.conf 中這個 zone file 所對應的 zone。 SOA 後面的兩個參數是指這個 zone file 是在哪部主機 (school.edu.tw)定義的,以及這個 zone file 的負責人 (注意是寫成 root.school.edu.tw),然後是用括號括起來的 5 個參數, 分別由底下說明。
Serial

代表這個 zone file 的版本,每當 zone file 內容有變動,name server 管理者就應該增加這個號碼,因為 slave 會將這個號碼與其 copy 的那份比對以便決定是否要再 copy 一次 (即進行 zone transfer)。
Refresh

slave server 每隔這段時間(秒),就會檢查 master server 上的 serial number。不過這裡會發生一個問題就是,在 master server 在 update data 完成到 slave server 來檢查時再 update 可能還有 好一段時間,因此這段期間 master/slave DNS server間 zone files 就可能出現不一致。所以在Bind較新的版本中便加入"notify"功能,使用者在 "named.conf" 設定中在需要的 zone 中加入"notify"的設定,則 master server在 update 完成某個 zone file 的 data 後便會主動發個訊息(NOTIFY),藉以通知該其它的 slave servers,因此如果 slave servers 也有支援這個"notify"功能時,接下來 slave servers 馬上就可以做 zone transfer 來update data。
e.g.

zone "twnic.com.tw" {
type master;
file "twnic.hosts";
notify yes;
also-notify { 192.168.10.1; }; //指定slave server的IP位址
};


Retry

當 slave server 無法和 master 進行 serial check時,要每隔幾秒 retry 一次。
Expire

當時間超過 Expire 所定的秒數而 slave server 都無法和 master 取得連絡,那麼 slave 會刪除自己的這份 copy。
Minimum

代表這個 zone file 中所有 record 的內定的 TTL 值,也就是其它的 DNS server cache 這筆 record 時,最長不應該超過這個時間。

Schnaufer
2003-02-22, 02:26 AM
  要去設定 Domain Name System (DNS) 中的 Mail Exchanger (MX) record。

kaiser573
2003-02-24, 12:00 PM
那就是了

你買那一本啊
公佈一下吧
看看是你買錯了還是買到爛書

kenny0127
2003-02-25, 06:32 PM
MX record 昰要設定在DNS Servers內
就是將MX指定給郵件伺服器,讓網路上的伺服器知道郵件伺服器是哪一部
當網路上的MAIL SERVER在傳送信件時
就會查詢DNS上的MX所對應的伺服器是哪一部
可以很正確的將MAIL傳到郵件伺服器上
所以一般來說
若是當我們發一封MAIL昰 aa@pczone.com.tw
則我們的MAIL SERVER會去查詢DNS內有沒有紀錄pczone.com.tw這個網域所對應的IP
若是查不到, 則會轉向INTERNET上的其他DNS查詢
當查到PCZONE.COM.TW所對應的IP之後
會再繼續查詢擁有MX紀錄的是哪一部伺服器
則我們的MAIL SERVER就會將MAIL很正確的將郵件送到pczone.com.tw的郵件伺服器上了
所以有沒有MX紀錄跟能不能收到信是不是有關聯
你思考一下就知道了

kiner
2003-02-25, 06:37 PM
最初由 kenny0127 發表
MX record 昰要設定在DNS Servers內
就是將MX指定給郵件伺服器,讓網路上的伺服器知道郵件伺服器是哪一部
當網路上的MAIL SERVER在傳送信件時
就會查詢DNS上的MX所對應的伺服器是哪一部
可以很正確的將MAIL傳到郵件伺服器上
所以一般來說
若是當我們發一封MAIL昰 aa@pczone.com.tw
則我們的MAIL SERVER會去查詢DNS內有沒有紀錄pczone.com.tw這個網域所對應的IP
若是查不到, 則會轉向INTERNET上的其他DNS查詢
當查到PCZONE.COM.TW所對應的IP之後
會再繼續查詢擁有MX紀錄的是哪一部伺服器
則我們的MAIL SERVER就會將MAIL很正確的將郵件送到pczone.com.tw的郵件伺服器上了
所以有沒有MX紀錄跟能不能收到信是不是有關聯
你思考一下就知道了

觀念講解相當清楚 .. 佩服!

carasha
2003-02-26, 08:57 PM
補充一下
有一位仁兄說 "沒有 MX 也可以收的到信"
話是沒錯 , 不過那樣是欠缺正確的觀念的一種說法 , 大部分是不會沒有 MX Record 的

舉例來說 :
今天某家公司有一個 Domain Name : xyz.com.tw
他們有一台 Mail Server , ip 是 202.39.31.132
假設今天他們公司想用 xxx@xyz.com.tw 當作他們的 Email Address
(因為很多人不想用 xxx@mail.xyz.com.tw , 因為多了個 mail 使整個 email address 變的太長)
那麼你的 DNS Server 裡是不是要有一筆
@ A 202.39.31.132
這樣當 別人 寄到 xxx@xyz.com.tw 他才收的到信 , 沒錯吧

問題來了 , 今天如果他們公司想用 xzy.com.tw 當作他們 Web Site 的網址 , ip 是 202.39.31.133 , 那你怎麼辦 ? 不要跟我說那台 Mail Server 也可以當作 Web Server 喔 (我知道可以 , 不過一般有規模一點的公司是不會這樣做的 , 至於為什麼不會這樣做 , 你自己想一想吧 ^^)

所以繼續我們的問題 , 如果我們把 DNS Server 裡的 Record 改寫一下
@ MX mail
@ A 202.39.31.133
mail A 202.39.31.132
這樣應該很清楚吧 ?

當然 MX Record 的功能不只這樣 , 有一些比較嚴謹的 Mail System 會檢查 對方的 DNS 裡是不是有 MX Record , 如果沒有 , email 來往就會有問題

以上例子是為了說明 MX 的其中一個用途 , 實際上不一定會這樣 , 端看你如何規劃與設計你的網路

想更清楚瞭解 DNS 運作與管理 , 就要多去翻翻書和實作了

以上如有錯誤 , 歡迎批評指教 !

ryanxyz
2003-02-26, 09:09 PM
最初由 carasha 發表
補充一下
有一位仁兄說 "沒有 MX 也可以收的到信"
話是沒錯 , 不過那樣是欠缺正確的觀念的一種說法 , 大部分是不會沒有 MX Record 的

舉例來說 :
今天某家公司有一個 Domain Name : xyz.com.tw
他們有一台 Mail Server , ip 是 202.39.31.132
假設今天他們公司想用 xxx@xyz.com.tw 當作他們的 Email Address
(因為很多人不想用 xxx@mail.xyz.com.tw , 因為多了個 mail 使整個 email address 變的太長)
那麼你的 DNS Server 裡是不是要有一筆
@ A 202.39.31.132
這樣當 別人 寄到 xxx@xyz.com.tw 他才收的到信 , 沒錯吧

問題來了 , 今天如果他們公司想用 xzy.com.tw 當作他們 Web Site 的網址 , ip 是 202.39.31.133 , 那你怎麼辦 ? 不要跟我說那台 Mail Server 也可以當作 Web Server 喔 (我知道可以 , 不過一般有規模一點的公司是不會這樣做的 , 至於為什麼不會這樣做 , 你自己想一想吧 ^^)

所以繼續我們的問題 , 如果我們把 DNS Server 裡的 Record 改寫一下
@ MX mail
@ A 202.39.31.133
mail A 202.39.31.132
這樣應該很清楚吧 ?

當然 MX Record 的功能不只這樣 , 有一些比較嚴謹的 Mail System 會檢查 對方的 DNS 裡是不是有 MX Record , 如果沒有 , email 來往就會有問題

以上例子是為了說明 MX 的其中一個用途 , 實際上不一定會這樣 , 端看你如何規劃與設計你的網路

想更清楚瞭解 DNS 運作與管理 , 就要多去翻翻書和實作了

以上如有錯誤 , 歡迎批評指教 !

受教了 講解的很清楚

不應有恨
2003-03-04, 04:16 PM
最初由 carasha 發表
補充一下
有一位仁兄說 "沒有 MX 也可以收的到信"
話是沒錯 , 不過那樣是欠缺正確的觀念的一種說法 , 大部分是不會沒有 MX Record 的

舉例來說 :
今天某家公司有一個 Domain Name : xyz.com.tw
他們有一台 Mail Server , ip 是 202.39.31.132
假設今天他們公司想用 xxx@xyz.com.tw 當作他們的 Email Address
(因為很多人不想用 xxx@mail.xyz.com.tw , 因為多了個 mail 使整個 email address 變的太長)
那麼你的 DNS Server 裡是不是要有一筆
@ A 202.39.31.132
這樣當 別人 寄到 xxx@xyz.com.tw 他才收的到信 , 沒錯吧

問題來了 , 今天如果他們公司想用 xzy.com.tw 當作他們 Web Site 的網址 , ip 是 202.39.31.133 , 那你怎麼辦 ? 不要跟我說那台 Mail Server 也可以當作 Web Server 喔 (我知道可以 , 不過一般有規模一點的公司是不會這樣做的 , 至於為什麼不會這樣做 , 你自己想一想吧 ^^)

所以繼續我們的問題 , 如果我們把 DNS Server 裡的 Record 改寫一下
@ MX mail
@ A 202.39.31.133
mail A 202.39.31.132
這樣應該很清楚吧 ?

當然 MX Record 的功能不只這樣 , 有一些比較嚴謹的 Mail System 會檢查 對方的 DNS 裡是不是有 MX Record , 如果沒有 , email 來往就會有問題

以上例子是為了說明 MX 的其中一個用途 , 實際上不一定會這樣 , 端看你如何規劃與設計你的網路

想更清楚瞭解 DNS 運作與管理 , 就要多去翻翻書和實作了

以上如有錯誤 , 歡迎批評指教 !

MX是比較新的 dns record(也不新了)
基於向下相容的原則在RFC之內有說明沒有MX record之下的處理方式
這不是嚴謹不嚴謹而是有沒有效率的事
另外兄臺舉例的
-----
所以繼續我們的問題 , 如果我們把 DNS Server 裡的 Record 改寫一下
@ MX mail
@ A 202.39.31.133
mail A 202.39.31.132
這樣應該很清楚吧 ?
---------
似乎有誤耶!
這樣帳號還是要name@mail.domain吧?
你是否少加了一筆CNAME呢?

carasha
2003-03-04, 06:11 PM
最初由 不應有恨 發表
MX是比較新的 dns record(也不新了)
基於向下相容的原則在RFC之內有說明沒有MX record之下的處理方式
這不是嚴謹不嚴謹而是有沒有效率的事
另外兄臺舉例的
-----
所以繼續我們的問題 , 如果我們把 DNS Server 裡的 Record 改寫一下
@ MX mail
@ A 202.39.31.133
mail A 202.39.31.132
這樣應該很清楚吧 ?
---------
似乎有誤耶!
這樣帳號還是要name@mail.domain吧?
你是否少加了一筆CNAME呢?

這位仁兄你好
那樣的設定 , email address 可以是 name@domain , 也可以是 name@mail.domain , 不需要再另外增加一筆 CNAME 了 , 不知你所謂需要新增一筆 CNAME 的用途在哪邊 ?

不應有恨
2003-03-05, 09:19 AM
最初由 carasha 發表
這位仁兄你好
那樣的設定 , email address 可以是 name@domain , 也可以是 name@mail.domain , 不需要再另外增加一筆 CNAME 了 , 不知你所謂需要新增一筆 CNAME 的用途在哪邊 ?

@ MX mail
=>告知domain的MX record為mail
@ A 202.39.31.133
=>Domain之IP(此處之domain=URL/FQDN)tricky!!
mail A 202.39.31.132
=>告知mail的IP

這設定並未告知domain之MX=name@domain
而是讓它誤判
造成name@domain之domain為一個URL/FQDN
DNS server會以為domain不是一個"domain"而是一個FQDN(點/主機名稱)
此domain=202.39.31.133(domain在dns server看來是一個"點"而非網域)
所以dns server就會回應202.39.31.133
過程中並未使用你說的任何MX record
要使用MX record應改成
@ MX mail
@ CNAME mail
mail A 202.39.31.132
如此可達到要求又使用MX record
有誤請不吝賜教!!^^#

carasha
2003-03-05, 08:15 PM
最初由 不應有恨 發表
@ MX mail
=>告知domain的MX record為mail
@ A 202.39.31.133
=>Domain之IP(此處之domain=URL/FQDN)tricky!!
mail A 202.39.31.132
=>告知mail的IP

這設定並未告知domain之MX=name@domain
而是讓它誤判
造成name@domain之domain為一個URL/FQDN
DNS server會以為domain不是一個"domain"而是一個FQDN(點/主機名稱)
此domain=202.39.31.133(domain在dns server看來是一個"點"而非網域)
所以dns server就會回應202.39.31.133
過程中並未使用你說的任何MX record
要使用MX record應改成
@ MX mail
@ CNAME mail
mail A 202.39.31.132
如此可達到要求又使用MX record
有誤請不吝賜教!!^^#

我知道我問題所在了 , 這是我的筆誤 , 正確的寫法應該是

@ MX 10 mail.xyz.com.tw. (我之前沒有在 mail 後面加上 .xyz.com.tw.)
mail A 202.39.31.132

很抱歉 , 之前的寫法是我自己的疏忽 , 如造成網友的不便 , 請多包涵 ~

不應有恨
2003-03-06, 09:08 AM
如果改成這樣的話(其實其他行一樣啦只是少了@ A 203.39.31.132)
那只有宣告xyz.com.tw之MX record=mail.xyy.com.tw
而沒有xyz.com.tw之mx=xyz.com.tw喔
這樣更糟啦
寄來name@xyz.com.tw的信
都找不到家> <..

janglang
2003-03-06, 12:22 PM
不應有恨兄的"@ CNAME mail" 這行怪怪的,它是給mail一個別名,而此別名是domain ?? 好怪啊!
carasha兄的 MX 設定沒什麼錯啊,"@ MX 10 mail.xyz.com.tw." 本來就可以處理 aaa@xyz.com.tw 的信

若想要給 xyz.com.tw 一個ip,直接用A紀錄不就好了==> "xyz.com.tw. A 202.39.31.133"

kiner
2003-03-06, 02:47 PM
最初由 janglang 發表
不應有恨兄的"@ CNAME mail" 這行怪怪的,它是給mail一個別名,而此別名是domain ?? 好怪啊!
carasha兄的 MX 設定沒什麼錯啊,"@ MX 10 mail.xyz.com.tw." 本來就可以處理 aaa@xyz.com.tw 的信

若想要給 xyz.com.tw 一個ip,直接用A紀錄不就好了==> "xyz.com.tw. A 202.39.31.133"

應該是 @ mx 10 mail.xyz.com.tw.
然候是 mail.xyz.com.tw. a 202.39.31.133
防止一些無聊的動作在你的網域上 ..
會比較好 ..

不應有恨
2003-03-06, 04:02 PM
最初由 janglang 發表
不應有恨兄的"@ CNAME mail" 這行怪怪的,它是給mail一個別名,而此別名是domain ?? 好怪啊!
carasha兄的 MX 設定沒什麼錯啊,"@ MX 10 mail.xyz.com.tw." 本來就可以處理 aaa@xyz.com.tw 的信
==>這我試過是不行的(直覺看來也是),你確定嗎?
若想要給 xyz.com.tw 一個ip,直接用A紀錄不就好了==> "xyz.com.tw. A 202.39.31.133"

janglang
2003-03-06, 11:04 PM
本來就應該是這樣設啊!我架公司的 dns,sendmail 就這樣設,運作的很好,翻遍dns HOWTO,RFC也都這樣講,事實上我架過不少dns 與 mail server 了,應該算蠻確定的喔

carasha
2003-03-07, 02:28 AM
最初由 不應有恨 發表
如果改成這樣的話(其實其他行一樣啦只是少了@ A 203.39.31.132)
那只有宣告xyz.com.tw之MX record=mail.xyy.com.tw
而沒有xyz.com.tw之mx=xyz.com.tw喔
這樣更糟啦
寄來name@xyz.com.tw的信
都找不到家> <.. 不應有恨 大大 : 不好意思喔 , 老實說 我覺得你對 DNS 的觀念有點問題ㄋ ^^| 看看我上次回覆的設定 , 如下 , 我給他個標號 , 這樣討論起來比較方便: (1) @ MX 10 mail.xyz.com.tw. (我之前沒有在 mail 後面加上 .xyz.com.tw.) (2) mail A 202.39.31.132 (1) 是說 , xyz.com.tw 的 MX 是 mail.xyz.com.tw 這台主機 (2) 是說 , mail.xyz.com.tw 這台主機的 IP 是 202.39.31.132 (我設定上雖只有寫 mail , 這是個縮寫 , 正確的寫法應該是 mail.xyz.com.tw. , 不會有人不懂吧 ^^| ) 這樣當有人寄信到 name@xyz.com.tw 時 , (1) 會告訴他 xyz.com.tw 這個 domain 的 mail 主機是 mail.xyz.com.tw ; 然後就會去找 mail.xyz.com.tw 這台主機所對應的 IP , 所以 (2) 又告訴他 mail.xyz.com.tw 這台的 IP 是 202.39.31.132 , 所以信件就會往 202.39.31.132 送 . 這樣你理解了嗎 ? ^^|

不應有恨
2003-03-07, 09:05 AM
那寄給name@mail.xyz.com.tw的郵件呢?
上述設定也可以用嗎?
可否說明一下!!謝謝

carasha
2003-03-07, 11:41 AM
最初由 不應有恨 發表
那寄給name@mail.xyz.com.tw的郵件呢?
上述設定也可以用嗎?
可否說明一下!!謝謝

是的

上述設定 , name@mail.xyz.com.tw 也是可以用的

不應有恨
2003-03-07, 11:53 AM
試過不行> <..

kenny0127
2003-03-07, 12:30 PM
最初由 不應有恨 發表
試過不行> <.. 這應該還有關MAIL SERVER那部伺服器的設定 以正常來說 MAIL SERVER會接收來自@xyz.com.tw的信件 若是也想要接收來自@mail.xyz.com.tw的信件 那在mail server上的RELAY DOMAIN要再加上mail.xyz.com.tw這樣的資料 事實上 若是DNS設定OK 不需要加上CNAME 都可以將@xyz.com.tw以及@mail.xyz.com.tw的信件往正確的伺服器送 關鍵在於伺服器要不要收這封信罷了

kiner
2003-03-07, 12:42 PM
最初由 kenny0127 發表
這應該還有關MAIL SERVER那部伺服器的設定

以正常來說
MAIL SERVER會接收來自@xyz.com.tw的信件
若是也想要接收來自@mail.xyz.com.tw的信件
那在mail server上的RELAY DOMAIN要再加上mail.xyz.com.tw這樣的資料

事實上
若是DNS設定OK
不需要加上CNAME
都可以將@xyz.com.tw以及@mail.xyz.com.tw的信件往正確的伺服器送
關鍵在於伺服器要不要收這封信罷了

沒錯 .. 想收 mail.xyz.com.tw 時
反而是mail server 的設定問題了

不應有恨
2003-03-07, 01:13 PM
一般mail帳號不是name@domain嗎
所以name@mail.xyz.com.tw
mail.xyz.com.tw就是一個domain
而在dns server未指明
mail.xyz.com.tw的mx record為何之前
寄給name@mail.xyz.com.tw應該是一個一個A record試的吧
總覺得還須加上一行
mail in mx mail
or使用cname才行耶

achilles
2003-03-07, 04:40 PM
簡單的設法
@ IN A 202.39.31.133
@ IN MX 10 mail
mail IN A 202.39.31.132

完整的設法
@ IN A 202.39.31.133
@ IN MX 10 mail
mail IN A 202.39.31.132
mail IN MX mail

當然,在 202.39.31.132 主機上的 /etc/mail/local-host-names 裡必須要有
xyz.com.tw
mail.xyz.com.tw

上面的兩種設法我都試過,在 202.39.31.132 的主機上可以收到 name@xyz.com.tw 及 name@mail.xyz.com.tw 的郵件

而 CNAME 只是為一個已經宣告過名稱的主機再取一個別名,在這裡應該用不到。

不應有恨
2003-03-07, 05:06 PM
sorry!讓這個問題好活耀喔^^#
你確定較新的mail server才支援此功能的嗎?
因為dns 裡面本來沒有MX record的
那時候的dns根本看不懂 mx record
但是mail還是可以寄阿
是不是反過來
較新的mail server認為不需要向下相容
才將此看A record的功能拿掉才對阿(或是根本不曉得此功能而沒設計在內)
這個我再看過RFC
確認是正確的

mus000
2003-03-07, 05:36 PM
最初由 不應有恨 發表
sorry!讓這個問題好活耀喔^^#
你確定較新的mail server才支援此功能的嗎?
因為dns 裡面本來沒有MX record的
那時候的dns根本看不懂 mx record
但是mail還是可以寄阿
是不是反過來
較新的mail server認為不需要向下相容
才將此看A record的功能拿掉才對阿(或是根本不曉得此功能而沒設計在內)
這個我再看過RFC
確認是正確的

..... =.=
討論下去無意義了。我自刪 ....

kiner
2003-03-08, 01:30 AM
最初由 achilles 發表
簡單的設法
@ IN A 202.39.31.133
@ IN MX 10 mail
mail IN A 202.39.31.132

完整的設法
@ IN A 202.39.31.133
@ IN MX 10 mail
mail IN A 202.39.31.132
mail IN MX mail

當然,在 202.39.31.132 主機上的 /etc/mail/local-host-names 裡必須要有
xyz.com.tw
mail.xyz.com.tw

上面的兩種設法我都試過,在 202.39.31.132 的主機上可以收到 name@xyz.com.tw 及 name@mail.xyz.com.tw 的郵件

而 CNAME 只是為一個已經宣告過名稱的主機再取一個別名,在這裡應該用不到。

插嘴一下 ..
mail In mx mail
這種是自打嘴巴式設法..
但是在有些比較白目的mail server
不設就寄不過去信..唉..

winsonying
2003-08-18, 12:26 AM
因為公司之前DNS給ISP代管~
我後來接手又遇到公司搬家兼換ISP~
於是自己便架了一台DNS來用~(原mx記錄在ISP那忘了砍=_=|||,沒交接到T_T)
結果有的信收的到~有些固定區域的就收不到...
查到最後把ISP那的MX砍了後就一切正常...呼..那兩天查到胃抽筋...
誰叫自己功力不夠...

不過現在用win2k做DNS還蠻快的..
打個IP後一直按下一步...
反查的也是一直下一步...
基本的就都自動設完了...
最後加個MX 記錄就OK了..
沒遇到甚或大問題..
我的設法是:
xyz.com.tw A記錄 192.168.100.1
mail01.xyz.com.tw A記錄 192.168.100.2
mail02.xyz.com.tw A記錄 192.168.100.3
xyz.com.tw MX記錄 5 mail01.xyz.com.tw
mail02.xyz.com.tw MX記錄 5 mail02.xyz.com.tw
我簡略的內容是這樣,
然後信寄到xyz.com.tw or mail01.xyz.com.tw都會在192.168.100.2這台mail server收到,
而192.168.100.3這台只會收到寄給mail02.xyz.com.tw

kib83726
2003-12-28, 10:16 AM
提供一份網路上的文件給大家參考:
http://freebsd.lab.mlc.edu.tw/dns/dns_data.html
點選左邊的「正解網域設定區」,裡頭的設定範例有相關的「MX」說明。

2008年1月6日 星期日

[php]發送mail 注意事項

無法查看此摘要。請 按這裡查看文章。