• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • sendmail大全

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    本章要點: 本章討論電子郵件服務的基本概念及其配置、管理。 本章具體包括以下內容。 郵件傳送的基本過程 sendmail 的配置 郵件服務的一些特殊功能 qmail的簡單介紹 7.1 sendmail 和SMTP 7.1.1 smtp和郵件傳輸代理 sendmail 是最重要的郵件傳輸代理程序。理
    本章要點:

    本章討論電子郵件服務的基本概念及其配置、管理。

    本章具體包括以下內容。

    郵件傳送的基本過程

    sendmail的配置

    郵件服務的一些特殊功能

    qmail的簡單介紹

    7.1 sendmail 和SMTP

    7.1.1 smtp和郵件傳輸代理

    sendmail是最重要的郵件傳輸代理程序。理解電子郵件的工作模式是非常重要的。一 般情況下,我們把電子郵件程序分解成用戶代理,傳輸代理和投遞代理。

    用戶代理用來接受用戶輸入的指令,將用戶給出的信件報文傳送至信件傳輸代理。而 投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱。顯然,最終用戶只能看到 用戶投遞代理。

    當用戶試圖發送一封電子郵件的時候,他并不能直接將信件發送到對方的機器上,用 戶代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。

    信件傳輸代理得到了郵件后,首先將它保存在自身的緩沖隊列中,然后,根據郵件的 目標地址,信件傳輸代理程序將找到應該對這個目標地址負責的郵件傳輸代理服務器, 并且通過網絡將郵件傳送給它。對方的服務器接收到郵件之后,將其緩沖存儲在本地, 直到電子郵件的接收者察看自己的電子信箱。

    顯然,郵件傳輸是從服務器到服務器的,而且每個用戶必須擁有服務器上存儲信息的 空間(稱為信箱)才能接受郵件。(發送郵件不受這個限制)

    可以看到,一個郵件傳輸代理的主要工作是監視用戶代理的請求,根據電子郵件的目 標地址找出對應的郵件服務器,將信件在服務器之間傳輸并且將接收到的郵件緩沖或者 提交給最終投遞程序。

    有許多的程序可以作為信件傳輸代理,但是sendmail是其中最重要的一個,事實證明 它可以支持數千甚至更多的用戶,而且占用的系統資源相當少。不過,sendmail的配置 十分復雜,因此,也有人使用另外的一些工具,如qmail。當然,基 于Windows NT的Exchange Server和NetScape Message Server也是這種產品的例子。

    無論什么產品,它們必須支持同樣的規范,如信件傳輸的報文格式,監聽的端口等等 。一般來說,系統管理員并不需要了解信件傳輸的命令標準,用戶代理會生成正確的命 令。但是,了解其他一些信息是重要的。

    信件傳輸代理運行在25端口接受請求,當接受用戶的請求時,它不需要了解用戶的真 實身份,或者說不需要身份驗證。因此用戶不需要提交用戶口令就可以發出電子郵件, 這意味著任何用戶都可以冒充成另外一個用戶發出假的電子郵件,這是電子郵件設計的 一個基礎,無法消除。(關于這一點目前有一點說明。許多基于UNIX的系統運行indent d,可以記錄客戶機器上的用戶的登錄名字。不過,這個功能實際上用處不大,畢竟大部 分人不會用UNIX/Linux作為他的個人機器)。

    sendmail程序得到一封待發送的郵件的時候,它需要根據目標地址確定將信件投遞 給那一個服務器,這是通過DNS服務實現的。例如,有一封郵件的目標地址是someone@y ahoo.com,那么,sendmail首先確定這個地址是用戶名(someone)+機器名(yahoo.co m)的格式,然后,通過查詢DNS來確定需要把信件投遞給某個服務器。

    DNS數據中,與電子郵件相關的是MX記錄,這可以在查詢DNS時設置查詢類型為mx來得 到:

    [wanghy@mail ~]$ nslookup

    Default Server: www.asnc.edu.cn

    Address: 202.199.248.2

    set q=mx

    yahoo.com

    Server: www.asnc.edu.cn

    Address: 202.199.248.2

    Non-authoritative answer:

    yahoo.com preference = 0, mail exchanger = mx1.mail.yahoo.com

    yahoo.com preference = 1, mail exchanger = mx2.mail.yahoo.com

    mx1.mail.yahoo.com internet address = 128.11.68.225

    mx2.mail.yahoo.com internet address = 128.11.68.217

    顯然,在DNS中說明yahoo.com有兩個信件交換(MX)服務器,于是,sendmail試圖將 郵件發送給兩者之一。一般來說,排在前面的的MX服務器的優先級別比較高,因此服務 器將試圖連接mx1.mail.yahoo.com的25端口,試圖將信件報文轉發給它。如果成功,你 的smtp服務器的任務就完成了,在這以后的任務,將由mx1.mail.yahoo.com來完成。在 一般的情況下,mx交換器會自動把信件內容轉交給目標主機,不過,也存在這樣的情況 ,目標主機(比如yahoo.com)可能并不存在,或者不執行smtp服務,而是由其mx交換器 來執行信件的管理,這時候,最終的信件將保存在mx機器上,直到用戶來察看它。

    可以簡單地在DNS記錄中用MX關鍵字設置信件交換,例如,在我們的設置中:

    @ IN SOA openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn. (

    1997022700 ; Serial

    28800 ; Refresh

    14400 ; Retry

    3600000 ; Expire

    86400 ) ; Minimum

    IN NS openlab.asnc.edu.cn.

    IN MX 10 mail.asnc.edu.cn.

    IN MX 20 mail2.asnc.edu.cn.

    openlab IN A 202.199.248.6

    openlab IN MX 10 mail2.asnc.edu.cn.

    mail IN A 202.199.248.11

    www IN A 202.199.248.2

    mail2 IN A 202.199.248.177

    這里面定義了三個MX記錄,MX記錄的規則是[機器名/域名] IN MX [優先級] [服務 器]。優先級是一個整數,數值越小優先級越高。第一個IN MX 10 mail.asnc.edu.cn.因 為沒有機器名,使用來自named.conf的缺省后綴,就是asnc.edu.cn,這個定義也就是讓 所有some@asnc.edu.cn的信件傳送到mail.asnc.edu.cn。IN MX 20 mail2.asnc.edu.cn .的概念差不多,只是其優先數為20,也就是說只有當mail.asnc.edu.cn拒絕接受(比如 ,服務器忙或者當機)的時候,信件才會投遞到mail2.asnc.edu.cn。openlab IN MX 1 0 mail2.asnc.edu.cn.定義凡是someone@openlab.asnc.edu.cn的信件要發送到mail2.a snc.edu.cn,以此類推。

    MX記錄可以使得整個子域內的用戶使用同樣的郵件主機和傳輸代理,另外,如果你的 主機不 姨瘓了,那么信件可以暫時存儲在你的信件 換主機上,直到你自己的機器恢 復為止。比如說,mail.yourdomain.com是一臺smtp主機,而mx2.yourdomain.com是另外 一個smtp主機,你希望在mail.yourdomain.com正常的時候直接由其自身收發郵件,而萬 一mail崩潰,mx2為它暫時存儲一段時間的郵件直到mail恢復正常工作-這是常見的設置 ,那么,你需要把mail以比較高的優先數設置成自己的信件交換主機,而mx2作為一個優 先數較低的信件交換主機,也就是,在你的DNS配置文件中,應該這樣配置:

    mail IN MX 0 mail

    IN MX 10 mx2

    如果DNS查詢無法找出對某個地址的MX記錄(通常因為對方沒有信件交換主機),那么 sendmail將是試圖直接與對方的主機(來自郵件地址)對話并且發送郵件。例如,test@ openlab.asnc.edu.cn在DNS中沒有對應的MX記錄,因此sendmail在確定MX交換器失敗后 ,將從DNS取得對方的IP地址并直接和對方對話試圖發送郵件。

    sendmail發送郵件時,如果經過設定的時間后仍然未能將信件投遞到目的主機,它將 返回一個錯誤信息并且休息一段時間,然后重新試圖投遞,如果連續多次失敗,sendma il最終將放棄投遞并將錯誤信息投遞給postmaster用戶。在許多機器上,postmaster用 戶是root用戶的一個別名(參考下面關于別名的內容),你應該將它設置為郵件的實際 管理員的用戶名。

    上面說的基本就是sendmail的工作方式,然而仍然有一個很讓人迷惑的東西,就是所 謂“信封地址”。簡單地說,當sendmail向目標地址發信的時候,它并不是直接用你的 信件內容發送,相反,它依賴于你給它的命令。例如,你可能會用mail程序向某個地址 這樣發信:

    $mail someone@somedomain.com

    To:other@otherdomain.com

    Subject:test mail

    test

    .

    那么,當sendmail發信的時候,它是向someone@somedomain.com發信而不是other@ot herdomain.com。相應地,如果你想向兩個人發信,例如你在outlook里面寫上:“投遞 給user1@a.com,抄送user2@b.com”,那么sendmail應該怎么做?直接同時向兩個地址 發信嗎?否,它試圖構造兩個包裝(稱為信封),每個包裝上只列出一個投遞地址,各 投遞一次。雖然郵件正文的頭部仍然包含兩個地址,但是sendmail不會看它。

    7.1.2 sendmail的配置

    sendmail是一個極為復雜的程序,其行為主要地依賴于在UNIX界“臭名昭著”的/etc /sendmail.cf配置文件。實際上,我懷疑會有誰真的從頭去寫一個sendmail.cf文件。一 般來說,我們總是用m4宏處理來書寫sendmail.cf。實際上,m4程序幾乎和sendmail.cf 一樣復雜,不過,通常我們只需要關心一些比較重要的部分。

    要使用宏處理程序,必須確定你已經安裝了m4和sendmail-cf這樣兩個軟件包,我們這 里討論的是sendmail版本8.9.3,缺省下,sendmail-cf安裝在/usr/lib/sendmail-cf目 錄下。 錄下。

    我們首先從構造一個簡單的可以使用的sendmail.cf文件開始,首先建立這樣一個文件 ,稱為sendmail.mc,并將其拷貝到/usr/lib/sendmail-cf/cf目錄下:

    include(`../m4/cf.m4)

    define(`confDEF_USER_ID,``8:12)

    OSTYPE(`linux)

    FEATURE(redirect)

    FEATURE(always_add_domain)

    FEATURE(use_cw_file)

    FEATURE(local_procmail)

    MAILER(procmail)

    MAILER(smtp)

    注意里面的正反引號,而且不能隨便加入空格。

    然后,用m4程序可以生成一個sendmail.cf:

    m4 sendmail.mc /etc/sendmail.cf

    接下來,啟動sendmail程序:

    killall sendmail

    sendmail –bd –q15m

    你會發現現在你可以在這臺主機上發送電子郵件了。

    一般情況下,我們可以象這樣用m4程序生成sendmail.cf,通過更改模板來改變sendm ail.cf的內容。一個mc模板文件通??梢园瑤讉€段落:

    divert

    通??偸窃O置為divert(-1)讓m4在輸出中去掉一些垃圾。

    OSTYPE OSTYPE

    定義使用的操作系統類型,當然在我們的情況下就是linux,但是一定要注意m4程序中 引號的用法,一個反引號和一個正引號才代表把對應的東西括起來。

    define

    定義一些全局設置,對于Linux系統,設置了OSTYPE之后,可以定義下面的一些全局 參數,如果不定義,就使用缺省值。例如:

    define(ALIAS_FILE,/etc/aliases)

    變量名 說明(方括號中為缺省值)

    ALIAS_FILE [/etc/aliases]

    別名文件的位置。如果有多個別名文件,需要把它們用引號括起來(別忘了引號規則 ?。?。

    confCR_FILE [/etc/mail/relay-domains]

    缺省的域定義文件,在這個域中定義的域中機器可以通過你的服務器進行郵件發送。

    HELP_FILE [/usr/lib/sendmail.hf]

    此文件中含有對SMTP的HELP命令進行響應時要列出的信息。

    QUEUE_DIR [/var/spool/mqueue]

    郵件隊列文件所在目錄。

    STATUS_FILE [/etc/sendmail.st]

    sendmail的狀態信息文件。

    LOCAL_MAILER_PATH [/bin/mail]

    用于投遞本地郵件的程序。

    LOCAL_MAILER_FLAGS [rmn9]

    local mailer要用到的標志,永遠包含標志lsDFM。

    LOCAL_MAILER_ARGS [mail -d $u]

    在投遞本地郵件時所傳送的參數。

    LOCAL_MAILER_MAX [沒有]

    如定義了此參數,則為此郵件服務器所能接收最大單個郵件大小。

    LOCAL_MAILER_CHARSET [沒有]

    如果定義了此參數,則被轉化為MIME格式的從其他地址到local mailer的含有8位字符 的信息將被標為此字符集。

    LOCAL_SHELl_PATH [/bin/sh]

    用于投遞利用管道功能處理的郵件的shell.

    LOCAL_SHELL_FLAGS [eu9]

    prog mailer用到的標志。在此標志中永遠包含標志lsDFM.

    LOCAL_SHELL_DIR [$z:/]

    shell運行時所要查找的目錄路徑。

    USENET_MAILER_PATH [/usr/lib/news/inews]

    用于投遞電子新聞組的程序名稱。

    USENET_MAILER_FLAGS [rlsDFMmn]

    usenet mailer的投遞標志。

    USENET_MAILER_ARGS [-m -h -n]

    usenet mailer的命令行參數。

    USENET_MAILER_MAX [100000]

    usenet mailer所能接收的最大信息大小。

    SMTP_MAILER_FLAGS [沒有]

    SMTP mailer附加標志。對所有基于SMTPmailer其默認標志為mDFMUX;基于esmtp的郵差 (mailer)加上a標志;而基于"smtp8"的郵差則加上8。

    SMTP_MAILER_MAX [沒有]

    使用smtp,smtp8或esmtp傳輸的單個郵件最大容量。

    SMTP_MAILER_CHARSET [沒有]

    如果定義了此參數,則被轉化為MIME格式的從其他地址到任一個smtp mailer的含有8 位字符的信息將被標為此字符集。

    POP_MAILER_PATH [/usr/lib/mh/spop]

    pop郵差的路徑名。

    POP_MAILER_FLAGS [Penu]

    pop郵差附加標志。同時總是加上標志lsDFM。

    POP_MAILER_ARGS [pop $u]

    傳給pop郵差的參數。

    PROCMAIL_MAILER_PATH [/usr/local/bin/procmail]

    procmail程序的路徑名。此外FEATURE(local procmail)也用到此參數。

    PROCMAIL_MAILER_FlAGS [SPhnu9]加給Procmail郵差的標志。同時總是加上"DFM"標志。

    PROCMAIL_MAILER_MAX [沒有]

    procmail所接收的最大單個郵件容量。如果你對某些人發送巨大的郵件感到困擾,啟 用這個選項。

    FEATURE

    定義sednamil的一些運行參數,通常對我們來說最重要的一些選項是:

    use_cw_file

    讀取文件/etc/sendmail.cw以確定這臺機器應該替哪些機器接受郵件。此主機的別名 。當你使用 MX記錄將此主機定義為其他主機的郵件交換機時需要使用這個特性。例如: FEATURE(use_cw_file)

    relay_hosts_only

    通常情況下,sendmailsendmail.cf中明確列出的域(一般是localhost)和/etc/ mail/relay-domains中定義的域進行投遞代理。缺省下這兩處定義的都是域的名字。如 果你定義了這個參數,那么這兩處的內容將被解釋為主機名字。

    use_ct_file

    讀取文件/etc/sendmail.ct以取得系統“信任”的用戶名字,這些用戶可以使用-f設 置其發信信封上的from地址而不產生警告信息。

    redirect

    使用REDIRECT特性,這個特性允許你對某些已經搬遷的用戶發出重定向信息。(見下 一節)。例如:

    FEATURE(redirect)

    mailertable

    包含一個用于覆蓋到特定域路由(routing)的"mailer table".此特性參數定義可以是 一個關鍵詞定義。如未指定任何參數, 其定義通常是:

    FEATURE(mailertable,`hash -o /etc/mailertable)

    domaintable

    包含一個用于提供域名映象的"domain table",當改變你自已的域名時可能有用(如 你公司由oldname.com改為newname.com)。其定義通常是:

    FEATURE(domiaintable,`hash -o /etc/domaintable)

    always_add_domain

    在本地發送郵件時也加上其主機域名。例如:

    FEATURE(always_add_domain)

    allmasquerade

    如果使用了偽裝(masquerading,使用MASQUERADE_AS),則此特性將使接收者的地址也偽 裝為來自所偽裝為主機。

    limitd_masquerade

    通常情況下$w所列出的所有主機將被偽裝。如果使用了此特性,則只對那些$m所列出 的主機進行偽裝。

    masquerade_entire_domain

    如使用了偽裝且設置了MASQUERADE_DOMAIN,此特性將引起 地址重寫,使所要偽裝的網 域整個被隱藏。所有含有被偽裝域名的主機用偽裝域名(通常是MASQUERADE_AS)進行重寫。

    masquerade_envelope

    用此特性告知sendmail將信封和信件頭中上的發送者和接收者進行偽裝。

    定義了有關masq的選項之后,就可以使用偽裝了,可以直接將偽裝命令寫入mc模板, 示例如下:

    MASQUERADE_AS(masq.com)

    MASQUERADE_DOMAIN(foo.org)

    這意味著我們的someone@foo.org發信的時候,sendmail將會把它的信封偽裝為some one@masq.com。這對于統一整個域的電子郵件是非常重要的。

    virtusertable

    允許在同一個主機上使用多個虛擬域。參考下一節。例如:

    FEATURE(`virtusertable,`hash –o /etc/mail/virtusertable)

    nullclient

    這是一個特殊情況--它生成一個除了支持將所有的郵件通過本地的基于SMTP的網絡轉 遞到一個中心郵件HUB之外不含任何內容的配置文件。其參數是此郵件HUB的主機名。唯 一可與nullclient一起使用的其他特性是"nocanonify"(這樣可以使非完全地址可通過S MTP連接進行發送;通常情況下地址將使用偽裝名字轉變為完全郵件名稱,此偽裝名字默 認值為郵件HUB主機的名字)。 在此特性使用是不應定義任何郵差。當然也不進行別名 處理或轉寄。

    local_procmail

    使用procmail作為本地郵差。

    smrsh

    對到程序的郵件使用使用sendmail發行版所帶的SendMail Restricted SHell (smrsh )而不是/bin/sh。由于sendmail是以root權限執行,某個發送到惡意程序的郵件可以破 壞系統,只要利用別名轉向使得郵件被轉發到對應的程序,因此缺省下sendmail用smrs h來處理郵件轉發到程序的請求。這可以提高本地系統管理員控制對那些通過郵件運行程 序的行為,例如

    FEATURE(`smrsh,`/usr/sbin/smrsh)

    注意有些程序無法通過smrsh運行(例如majordomo的wrapper程序),這是出于安全 性的考慮,smrsh不準用戶程序使用一些setuid功能。如果你一定要使用這些程序,清將 smrsh定義成其他shell程序,如sh。

    access_db

    本地存取控制文件的名字,缺省是/etc/mail/access.db,也可以用命令行指出,例 如:

    FEATURE(`access_db)

    或者 或者

    FEATURE(`access_db,`hash –o /etc/mail/access)

    mailertable

    允許使用mailertable文件。這個文件定義對某確定的域使用什么樣的郵差。例如:

    FEATURE(`mailertable’,`hash –o /etc/mail/mailertable)。

    blacklist_recipients

    允許你用前面定義的access_db來禁止某個地方來的郵件,或是某個人的郵件,等等 。

    relay_based_on_MX

    是否允許別人用你的機器當成MX交換器。如果你設置了這個選項,那么任何人只要在 域名服務器中將你的機器設置成為他的MX交換就可以用你的機器轉發電子郵件。這個功 能意味著:你的機器替它接受電子郵件,再提交給它;一般來說這個功能是不必要的; 如果你一定要使用這個選項,記住你可能被龐大的郵件流量吞沒。但是在一種情況下這 個功能又是不可缺少的:假如你的系統有防火墻,只有郵件服務器能夠對外連接,那么 這個功能是使網絡內部其他主機能夠接受自己電子郵件的唯一方法。

    DOMAIN

    這個關鍵字一般用來定義郵件中繼,假如你的系統里面除了Internet互連之外還有類 似Decnet,UUCP之類的東西,那么你就需要設置DOMAIN來保證非internet的郵件被正確 中繼。對于一般的系統,不需要定義這個屬性。

    MAILER

    定義可以使用的投遞程序(郵差)。

    例如:

    MAILER(smtp)

    定義smtp投遞。

    MAILER(local)

    定義局部投遞。

    如果你想做郵件服務,這樣兩個郵差是必須的。

    一般情況下,當安裝sendmail-cf包的時候,會自動在/usr/sendmail-cf/cf目錄下產 生一個模板,名字是redhat.mc。我們可以根據上面的描述對它進行修改以便滿足自己的 需要,最后用m4 redhat.mc sendmail.cf產生配置文件。要注意我們這里只列出了一 些常用的配置命令,許多與時間相關的配置定義我們并沒有描述,如confMESSAGE_TIME OUT等等,這一類的命令通常缺省值已經足夠,除非你準備作一個相當龐大的站點,在這 種情況下,你應該去參考/usr/lib/sendmail-cf/README文件得到更多的信息。

    在生成了sendmail.cf之后,就可以啟動sendmail程序了,我們需要把建立的sendmai l-cf文件拷貝到/etc下面,然后啟動sendmail。

    /usr/sbin/sendmail程序支持許多命令參數,對我們來說,最重要的是-bd參數,它表 示將sendmail作為一個守護進程來運行:

    sendmail –bd –q1h

    -q1h表示每隔一個小時發送一次郵件,類似地,-q15m是15分鐘,等等。

    7.1.3 sendmail 的相關文件

    我們在define和feature相關的子句中討論了一些sendmail的相關文件,現在我們來解 釋這些文件的用法。這些文件的名字通常都可以在對應的mc子句里面更改。

    主機別名

    首先是/etc/sendmail.cw。這個文件非常簡單,它給出本地主機的別名。如果你的主 機有多個名字,或者你的主機是整個域的信件交換主機,你就需要這個文件了。例如, 按照我們在前面的那個配置,mail.asnc.edu.cn是asnc.edu.cn域的信件交換主機,所以 我們需要在sendmail.cw里面寫上這樣一行:

    $ cat /etc/sendmail.cw

    # sendmail.cw - include all aliases for your machine here.

    asnc.edu.cn

    如果你有多個別名或者需要負責的交換域,每個需要單獨寫上一行。

    用戶別名

    接下來的文件是/etc/mail/aliases,這個文件用來設置用戶的別名。最簡單的情況是 需要作信件分發的情況。例如,一般情況下,電子郵件出現問題的時候,我們需要把出 錯的郵件頭發送到本機的postmaster用戶,但是也許你的系統上有多個系統管理員,因 此每個人都需要得到一份這個郵件頭的拷貝。這種情況下就需要使用用戶別名文件了。

    aliases文件的格式是郵件別名:實際用戶名,如果一個別名有多個用戶就用逗號分開 ,每個別名一行。例如,要把發給postmaster的信件發送給supervisor和manager,需要 寫上這樣一行:

    postmaster:supervisor,manager

    別名還可以用在這樣的情況,即定義自動的郵件轉發。例如,某個用戶以前在你的系 統上接受電子郵件,現在他有了一個新的電子郵件,希望發到你的機器上的郵件自動被 轉發到他新的電子郵件地址上,那么,可以使用類似這樣的別名方式:(假設你的機器是 joe@yourdomain.com)

    joe:joe@newaddr.com

    以后發給joe@yourdomain.com的電子郵件就自動中轉到joe@newaddr.com。注意左邊自 動加上你的機器名字,所以左邊只能是賬號名字,不能是全限定郵件地址。

    別名的右側也可以是文件或程序。例如,上面的postmaster別名可以用這樣方法來設 置:

    postmaster::include:/etc/mail/myaliases

    include:關鍵字表示讓sendmail去讀取對應的包含文件。而/etc/mail/myaliases的 內容要設置成:

    supervisor

    manager

    就可以了。

    要把郵件重定向到程序,可以使用管道,例如:

    test_param:"|/home/test/test"

    那么,sendmail會將發給test_param的郵件的內容作為/home/test/test程序的輸入來 執行這個程序。

    在修改了別名文件之后,需要用-bi參數重新初始化別名數據庫

    sendmail –bi

    另一個常用的辦法是重定向。如果你在模板文件中定義了REDIRECT特性,那么可以使 用這個功能。例如,某個人在你的機器上開了一個賬戶user1,后來遷移到user2@serve r2.com。那么,你可以將其別名寫成

    user1: user2@server2.com.REDIRECT

    以后當有人向這個地址發信的時候,你的sendmail會將其退回,并且返回一個551 Us er not local; please try user2@server2.com的信息。

    在使用別名的時候,必須注意的是不要造成循環,例如user1轉發給user2,user2又將 其轉發給user1....如此循環。在這種情況下,轉發17次后,sendmail將把它退還給發信 人。最常見的錯誤發生在你試圖在轉發郵件的同時在本地保留備份的情況下,例如:

    user1: user1,user2

    就構成了一個循環。

    要在本地保留備份,使用轉義符號,例如

    user1: user1,user2

    建立了別名文件之后,需要將其初始化,這可以通過newaliases命令完成:

    [root@mail mail]# newaliases

    /etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total

    也可以使用sendmail –bi命令:

    [root@mail mail]# sendmail -bi

    /etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total

    兩種方式實際是完全一樣的。

    類似于通過aliases文件進行郵件轉發,用戶也可以使用自己的轉發文件,例如,某個 用戶user1想讓發送給自己的郵件全部轉發到user2@domain.com,但是又不希望建立全局 的用戶別名,那么可以在自己的宿主目錄下面建立一個.forward文件,內容只要一行:

    user2@domain.com

    就可以了。

    這種技術可以讓每個用戶自己管理自己的郵件別名。

    允許投遞 允許投遞

    如同我們說的那樣,smtp協議是不需要身份認證的,也就是說任何人都可能telnet到 你的25端口并且發送莫名其妙的郵件。為了避免不必要的麻煩,比較高版本的sendmail 缺省直接禁止其他不明身份的機器利用你的系統投遞郵件。這種情況下,一個非本地的 機器使用你的系統投遞會產生一個"550 relay denied"錯誤。但是如果你要作一個郵件 服務器,你終究得打開投遞代理功能。

    sendmail的第一個投遞代理設置文件是relay-domains。這個文件是一個簡單的文本文 件,文件的缺省名字是/etc/mail/relay-domains,可以在confCR_FILE中定義。內容類 似這樣:

    yourdomain.com

    #所有*.yourdomain.com的機器可以使用你的機器作為smtp服務。

    192.168

    #所有192.168.*.*的機器可以使用你的機器作為服務

    /etc/mail/relay-domains文件是一個簡單文本文件,當需要投遞的域很多的時候,其 效率不是很高。因此,sendmail還可以使用access.db來設定哪些地址的機器可以連接到 你的25端口投遞信件。這個文件的缺省名字是/etc/mail/access.db,但是可以用FEATU RE(access_db)來修改(例如:FEATURE(access_db,`hash –o /etc/access)。

    一般/etc/mail/access.db是一個散列表數據庫,它是用/etc/mail/access為模版產生 出來的。/etc/mail/access文件的格式是這樣:

    [地址] [操作]

    中間的分割符是空格鍵。

    [地址]欄可以是主機地址或者名字,也可以是統配符,規則是這樣:

    yourdomain.com 代表所有*.yourdomain.com的名字。

    192.168.12 代表所有192.168.12.*的地址。

    202.135 代表所有202.135.*.*的地址。

    someone@somedomain.com 代表一個特定的郵件發信人

    而在每個地址后面可以跟上相應的操作,通常的操作有

    OK 正常接受這封郵件

    RELAY 允許SMTP代理投遞,這樣這封郵件就可以從你的機器中轉到別的機器上去

    REJECT 拒絕接受

    DISCARD 忽略這封郵件,這種情況下,郵件看上去是正常投遞了,但是由于沒有人接 受,郵件會自動地“消失”在網絡中。

    錯誤代碼+任何其他字符串:將向發信者返回這個字符串作為出錯信息。錯誤代碼是R FC 822定義的標準出錯代碼。例如

    550 We don like a spammer!

    客戶機器在投遞郵件的時候,就會產生一個“we don like a spammer”投遞失敗信 息。比如,你認為someone@spammer是個專門投遞垃圾郵件的家伙,那么你可以這樣寫:

    someone@spammer 550 we don like a spammer

    修改了access文件之后,需要重新生成一下access.db,這可以用makemap命令完成:

    makemap hash access.db < access

    然后重新啟動sendmail就可以使用這些功能了。

    虛擬域

    如同Apache一樣,sendmail也允許使用虛擬主機功能,這是通過FEATURE(virtuserta ble)功能實現的,而虛擬主機的文件缺省是/etc/mail/virtusertable.db,它用/etc/m ail/virtusertable文件生成,這個文件的形式類似于aliases文件,即左地址 右地址 ,中間用Tab鍵分開。例如:

    someone@otherdomain.com localuser

    這樣一行意味著本來應該發送給someone@otherdomain.com的郵件現在要發送給本機的 用戶localuser。當然,這意味著:第一,你的DNS記錄中,本機應該是otherdomain.co m的MX交換器;第二,你的本機sendmail.cw文件應該包含otherdomain.com這個名字。

    當然純粹的這樣的域意義不大,但是sendmail還支持郵件虛擬域的參數翻譯。例如:

    @testdomain.com test@mydomain.com

    意味著所有發往xxx@testdomain的郵件都會被發送到test@mydomain.com。而

    @testdomain.com %1test@mydomain.com

    則代表參數轉義,例如user1@testdomain.com的郵件被發送到user1test@mydomain.c om,user2@testdomain.com被發送到user2test@mydomain.com。同樣,這樣的功能也要 通過MX記錄和CW文件加上去。

    建立virtusertable的方法與建立access的辦法是一樣的:

    makemap hash virtusertable.db < virtusertable

    然后重新啟動sendmail。

    定義郵差

    /etc/mail/mailertable文件(在FEATURE(`mailertable’)里定義)用來定義對某個 域名或者用戶使用什么樣的郵差,如local:user,smtp:mail.test1等等。一般情況下, 并不需要定義這個功能。建立這個文件的方式與上面的幾個hash數據庫相同。

    需要注意的是,當前版本的sendmail對各種附加文件和配置文件的屬性都有著嚴格的 要求,特別是/etc/aliases文件,必須至少為0644以避免非授權的修改。

    7.1.3 郵件分揀

    Linux的sendmail使用procmail作為信件的最終投遞代理。這個程序有一些非常有用的 ,對于我們來說,最重要的功能是信件的自動過濾和分揀功能。

    信件分揀大概是用戶最希望的功能,它按照郵件的文件頭(發信地址,收信地址等等 )甚至郵件的正文進行歸類,并且可以自動存放在各個文件中或者轉發給別的用戶賬號 。馬上我們會看到,用procmail配置自動分揀是一件非常容易的事情。

    通常的sendmail配置中已經使用了procmail作為郵件最終投遞代理,如果你的sendma il已經改亂了,可以使用FEATURE(local_procmail)設置這個功能。

    procmail主要依靠用戶宿主目錄下面的.procmailrc中的信息來處理郵件.如果這個配 制文件不存在,則procmail只是簡單的將郵件保存到用戶的信箱中.

    一般來說,.procmailrc文件由配置行和行為規則組成。配置行是一些基本參數的設置 ,不過一般配置行可以不寫;而行為規則通常由(查詢)(行為)完成,下面是一個簡 單的例子:

    0 H

    * ^From:.*test@mydomain.com

    { {

    0 c

    ! who@somewhere.edu

    0

    testsave

    }

    這個.procmailrc文件將所有來自test的信件轉發給who@somewhere.edu,同時在本地 留一個保存一個備份在文件testsave中。

    上面的形式是.procmailrc行為規則的基本格式,規則的一般格式是

    0 選項

    [零個或多個條件,每個一行]

    [動作命令] [動作命令]

    0表示開始一條規則,后面可以加上一些單字符的選項,選項主要有下面的一些:

    H 搜索匹配郵件頭部

    B 搜索匹配整個郵件

    D 匹配時區分大小寫

    A 如果前面最近的一個沒有A或a選項的規則執行,執行本規則

    a 如果上面一條規則執行,則本規則執行

    E 同A相反,前面最近的沒有E或e選項的規則沒有執行,則執行本規則

    e 同a相反

    h 通過管道傳送郵件首部(缺省)

    b 通過管道傳送郵件主體(缺省)

    c 復制一個郵件

    I 忽略所有寫操作中的錯誤

    r 原始模式,即procmail不對mail進行任何模式的處理

    條件用一個*號開始,后面跟上正則表達式(參考第十一章)。

    動作命令就是procmail在規則成功之后使用的命令,一般的命令有下面一些:

    {}

    開始一個語句段,表示把一組命令集合成一個動作。如果你要嵌套處理規則,(例如 ,對于來自test的郵件,區分是含有computer字符串還是含有physics字符串)那么必須 使用語句段把子規則括起來。

    !

    轉發信件給某個用戶

    |

    啟用管道將郵件傳送給后面的程序,例如|auto-reply表示啟動auto-reply程序并且將 郵件內容作為標準輸入傳遞給它。

    任意文件名

    將郵件存入某個文件。如果文件已經存在,就添加在文件的末尾。

    顯然,前面的.procmailrc的含義是:

    0 H開始了一個對郵件頭部的搜索,^From.*test@mydomain.com表示郵件頭部發現了 From: test@mydomain.com之類的內容,于是行為規則被啟動。這里的行為規則是一個語 句塊,因此在語句段里面的子規則被執行。

    0 c開始的規則首先復制一份副本,然后將郵件轉發給who@somewhere.edu,這樣郵件 本身消失了,但是副本仍然存在,于是副本繼續執行下面的:0規則組,這個規則是存儲 郵件到文件testsave,于是,郵件副本也被處理掉了,正好規則結束。

    對于熟悉perl或C語言的的用戶,很容易用procmail的管道功能做出郵件的自動回復程 序,這里不再介紹了,想進一步了解procmail的用戶可以用

    man procmail

    man procmailrc

    man procmailex

    獲得更加詳細的信息。

    7.1.4 Fetchmail

    許多用戶有多個郵件賬戶,有些在你的管理范圍之內,有些在別的服務器上面。管理 所有這些郵件是非常惡心的事情。另外,也許你的系統僅僅是一個撥號代理(參考第八 章),不可能始終接在internet上面。你需要的是在系統連接到internet的時候發出電 子郵件,同時自動去接收電子郵件。在國內,典型的做法是每人申請一個本地電子郵件 賬戶和一個免費電子郵件賬號,問題就是,如何從另外的ISP提供的電子郵件賬號哪里自 動地接收郵件?

    當然你可以讓你的用戶自己解決這個問題,不過這種僵硬的方法不見得合適。一般我 們采用另外的辦法,就是fetchmail,它是一個自動的郵件接力程序,可以讓它從遠程的 pop3賬號處取得郵件,然后扔進用戶的本地郵箱。(關于pop3的情況參考下一節)

    可以直接用命令行調用fetchmail:

    $ fetchmail –p [協議] -u [用戶名] [服務器]

    fetchmail得到的信息將直接投入localhost機器,賬號是你啟動fetchmail時使用的賬 號。

    $ fetchmail -p POP3 -u yuanban mail.asnc.edu.cn

    Enter password for yuanban@mail.asnc.edu.cn:

    使用pop3協議從mail.asnc.edu.cn取得yuanban的信件。fetchmail要求你輸入yuanba n的密碼,然后進行驗證,成功的話會出現下面的信息:

    1 message for yuanban at mail.asnc.edu.cn (551840 octets).

    reading message 1 of 1 (551840 octets) ................................... .....d

    表示已經完成了一封信件的轉交。

    對于更復雜的情況,建議你使用fetchmail的配置文件,即用戶宿主目錄下面的.fetc hmailrc。這個文件的詳細資料可以參考fetchmail的文檔,這里只用一個簡單地例子來 介紹它。我們看一個簡單的.fetchmailrc范例:

    set syslog

    set postmaster "isee"

    poll 202.96.44.11 with proto POP3 and options

    envelope Delivered-To:

    user "mere" there with password "xxxxxxx" is isee@snail.home here

    no keep

    user "isee" there with password "yyyyyyy" is isee@snail.home here

    no keep

    這個范例相當簡單。fetchmail在讀取配置文件的時候會忽略所有的"there","here", "and","with","has","wants","options"之類的單詞。

    第一行set syslog程序定義fetchmail的記錄文件使用系統記錄功能。set postmaste r設置的是出錯時的管理員賬號,接下來的poll行定義了fetchmail使用的協議為POP3, 連接的服務器是202.96.44.11。

    envelope Delivered-To:這個選項比較有趣,它在信封上加上一個Delivered-To說明 ,這主要是為了讓fetchmail可以把信件投遞到一些使用qmail(見下面)的系統中。

    接下來是fetchmail的主體部分,一個user的行定義了一個接力方法,現在的定義是取 得202.96.44.11服務器上mere賬號的信件,取信的口令是xxxxxxx,然后投遞到isee@sn ail.home,同樣,isee的信件也被自動投遞到isee@snail.home。no-keep選項表示不在 原始服務器上保留郵件。

    下面是配置fetchmail的一些常用選項:

    set logfile 制定log文件

    set syslog 使用系統log文件

    via 指定DNS機器名來取代poll中的機器明

    proto 指定協議

    port 指定端口

    timeout 指定超時時間

    interface 指定網絡界面

    user 指定遠程用戶

    is 將本地用戶和遠程用戶聯系起來

    to 同is

    pass 口令

    preconnect 連接開始前執行的外部命令

    postconnect 連接結束后執行的外部命令

    keep 在服務器上保留郵件備份

    no keep 不保留郵件備份

    在配置了.fetchmailrc之后,只要直接執行fetchmail就可以實現自動的信件投遞了。 實際上,你甚至可能使用fetchmail作為一個daemon程序來實現自動的郵件轉交,或是設 置fetchmail讓它支持qmail的虛擬域。

    在fetchmail的發行版本中還提供了一個圖形化的fetchmail配置程序,稱為fetchmail conf。如果你對fetchmail的語法感到困難,只要使用這個程序就可以進行配置。啟動這 個程序的方法很簡單,直接在xterm下面執行fetchmailconf &:

    圖7.1 配置fetchmail

    選擇configure fetchmail出現:

    圖7.2 配置fetchmail(2)

    只要選擇Novice Configuration,然后出現服務器設置選單:

    圖7.3 配置fetchmail(3)

    在New Server中加入你準備收信的服務器,然后回車,服務器名字就會出現在列表框 中,雙擊服務器名字,編輯關于服務器的設置:

    圖7.4 配置fetchmail(4)

    設置服務器的類型和服務器上的賬戶名字,雙擊賬戶名字并且輸入對應的密碼以及和 本地賬戶之間的對應關系,OK退出就可以了

    7.1.5 測試sendmail

    測試sendmail意味著許多東西,一方面是測試地址規則是否正確,另一方面是測試投 遞代理是否正確打開。關于規則集我們不想多說,因為除非你已經理解了sendmail.cf, 否則它不會給你什么幫助;對于我們來說,主要是測試投遞過程。

    可以直接連接到服務器的25端口測試投遞代理:

    [root@mail mail]# telnet 202.199.248.11 25

    Trying 202.199.248.11...

    Connected to 202.199.248.11.

    Escape character is ^].

    220 mail.asnc.edu.cn ESMTP Sendmail 8.9.3/8.9.3; Fri, 3 Mar 2000 09:26:47 +0800

    mail from:

    250 ... Sender ok

    rcpt to:

    250 ... Recipient ok

    data

    354 Enter mail, end with "." on a line by itself

    test

    .

    250 JAA08415 Message accepted for delivery

    quit

    221 mail.asnc.edu.cn closing connection

    Connection closed by foreign host.

    加粗的是我們輸入的內容,上面的操作定義了一個從wanghy@mail.asnc.edu.cn到rus ter@263.net的郵件發送過程?,F在的回應說明郵件投遞代理是正常的。如果有任何的錯 誤,就會在回應中出現。

    為了使用這種測試技術,你需要了解SMTP協議的基本命令,這樣的命令有14個,在下 面列出:

    HELO

    標志發起smtp請求的主機,例如,從client1發起smtp會話,可以使用

    HELO client1

    MAIL FROM: MAIL FROM:

    啟動一個郵件會話,在這個行中需要標志發信人的信封地址,例如,要從user1@clie nt1發出郵件,使用MAIL FROM:,注意尖括號的用法。

    RCPT TO:

    標志收信人的信封地址,例如,要發送給user2@mail2,使用RCPT TO: 。在一個MAIL FROM之后可以給出多個收信人地址,以便實現多副本的傳送。

    VRFY

    驗證某個地址,例如,要確定test@mail是一個可以投遞的地址,使用VRFY test@mai l。

    EXPN

    顯示某個收件人地址或者用戶名的實際名字。例如,要顯示postmaster用戶的實際投 遞地址,使用EXPN postmaster。如果在某個用戶的目錄下有.forward文件,這個文件的 內容將會被自動使用。

    DATA

    開始寫信,在MAIL和RCPT之后可以使用這個命令傳輸信件正文,傳輸完畢之后輸入一 個.退出。

    QUIT

    關閉smtp會話

    RSET

    復位連接狀態

    HELP

    顯示這個命令表。

    7.2 POP3服務

    Sendmail并不處理最終的投遞,當然也不會處理如何把郵件提交給最終用戶這樣的任 務。一般來說,我們總是在Windows客戶機器上處理各種電子郵件,因此需要一個服務程 序負責將sendmail存儲的郵件轉交給Windows或其他任何客戶機器。有兩種基本的方法, 一種是將郵件傳送到客戶的本地機器上處理,這是通過所謂的郵局協議實現的;另一種 是允許用戶遠程操作其郵箱并且實現對郵件的瀏覽和管理,這是通過所謂的IMAP協議。

    7.2.1 POP3服務

    POP3即郵局協議3,這是目前郵件客戶傳輸的標準協議之一。幾乎所有的郵件客戶程序 都會支持這個協議。

    Pop3服務程序通??梢詮脑S多程序包中得到。與Linux發行版一起提供的通常是pop和 imap放在一起的服務器程序,例如imap-4.5-4??梢杂胷pm程序安裝這個產品。安裝后, pop3d服務程序放在/usr/sbin下,名字是ipop3d。

    ipop3d程序通常是由inetd服務程序啟動,不過缺省的情況下這個服務是關閉的。為了 打開這個服務,你必須確認/etc/services文件中有這樣的行:

    pop-3 110/tcp # POP version 3

    pop-3 110/udp

    然后在/etc/inetd.conf中加入:

    pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

    重新啟動inetd,就可以使用pop服務了。

    imap程序包中還包括imap服務器,imap方式用的比較少,但是它也有自己的優點,因 為imap服務是直接操作服務器的文件夾,不需要把文件下載到本地,因此可以避免pop服 務把郵件副本弄的遍地都是。這對于沒有自己的確定計算機的用戶特別重要。不過,支 持imap的郵件客戶程序并不是很多,好在通常使用的outlook 5可以操作imap。

    要使用imap服務,在/etc/services里面加上

    imap2 143/tcp imap # Interim Mail Access Proto v2

    imap2 143/udp imap

    然后在/etc/inetd.conf里面加上:

    imap stream tcp nowait root /usr/sbin/tcpd imapd

    重新啟動inetd就可以了。

    通常pop的配置對于任何熟悉windows的用戶都是很簡單的,也許將郵件處理協議設置 成imap對于某些用戶可能比較困難,這是你需要給一些幫助。

    安裝了pop支持之后,可以直接telnet到110端口看pop服務是否正常運行了,例如:

    [wanghy@mail /etc]$ telnet 202.199.248.19 110

    Trying 202.199.248.19...

    Connected to 202.199.248.19.

    Escape character is ^].

    +OK POP3 mail.asnc.edu.cn v7.59 server ready

    這樣的信息表示pop3服務已經就緒。你可以接著實驗看看能否瀏覽郵箱:

    user zhangfl

    +OK User name accepted, password please

    pass test

    +OK Mailbox open, 3 messages

    list list

    +OK Mailbox scan listing follows

    1 40934

    2 29619

    3 6001

    .

    這樣的返回信息說明已經一切正常,可以提供服務了。

    7.2.2 安全性和其他問題

    如同我們解釋的那樣,smtp發送信件的時候不需要知道用戶口令。相反,pop3程序在 允許用戶接受郵件之前必須首先確認用戶口令。在一般情況下,pop3客戶/服務器之間用 明文傳送用戶名和口令。這是一種不太可靠的方式,因為一個惡意的分析者可能通過以 太網監聽你的用戶口令。

    解決問題的辦法之一是使用qpopper程序,它提供了一些高級的選項,特別是支持以加 密方式在客戶和服務器之間轉發口令字,以及對pop3使用與賬號登錄不同的認證口令。 你可以自己到網上下載qpopper程序并且編譯安裝。

    另外一個問題是sendmail虛擬域。虛擬域功能是非常有用的,但是它卻有一個很嚴 重的問題,就是pop3服務程序并不能正確地支持sendmail虛擬域。通常這種情況意味 著你必須自己編寫一個pop3服務程序。不過,實際上,最好的辦法是使用某些基于web的 信件瀏覽程序。

    7.3 管理郵件隊列

    一般當你發送一封郵件的時候,sendmail傾向于立刻發送這一封電子郵件。但是如果 當前網絡忙使得無法立刻投遞信件,或者是目標地址的連接速度太慢,無法在短時間內 投遞到目標地址處,那么sendmail將把待發送的郵件排入隊列,并在合適的時候重新發 送。

    隊列文件通常存放在/var/spool/mqueue下面,每個待發送的郵件由幾個文件構成,例 如,我們可以看到下面的目錄文件列表:

    [root@mail mqueue]# ls

    dfRAA27175 xfAAA00733 xfBAA00819 xfEAA32763 xfXAA00706

    qfRAA27175 xfAAA00784 xfDAA01360 xfFAA01616

    文件名字總是由一個兩字符的前綴加上一個隨機數字。前綴有四鐘:

    df:郵件內容

    qf:郵件頭和一些控制信息

    xf:一些臨時文件

    tf:qf文件的臨時存儲文件

    可以通過看隊列中的qf文件來確定當前隊列信息,不過通常都可以用mailq程序來完成 對隊列狀態的查詢:

    root@mail mqueue]# mailq

    Mail Queue (1 request)

    --Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient----------- -

    RAA27175 22429 Fri Feb 25 17:34

    : deferred)

    chaszhj@21cn.net

    這表示隊列中目前只有一封信,由zhangfl發出,收信人是chaszhj@21cn.net。

    sendmail接受到的信件在用戶取走之前將暫時存儲在/var/spool/mail目錄下面,存 儲的方法非常簡單,就是每個有待讀郵件的用戶一個文件:

    [root@mail spool]# ls -l /var/spool/mail |more

    total 19364

    -rw-rw---- 1 anyi mail 7559035 Feb 28 22:04 anyi

    -rw-rw---- 1 baixuan mail 514 Nov 7 01:32 baixuan

    -rw-rw---- 1 cwc mail 515 Feb 28 08:35 cwc

    如果一個用戶有多封電子郵件,那么這些郵件就被簡單地連接在一起構成一個大文件 (所以你會看到非常巨大的郵件文件)。

    要察看郵件系統的狀態,使用mailstats命令。

    如果你面對的是一個很龐大的郵件服務系統,有時會在某個郵件隊列中擁塞太多的消 息,你可能想把這個隊列暫停并且在網絡空閑的時候再發送,暫停一個郵件隊列的辦法 非常簡單,就是將/var/spool/mqueue目錄移走:

    killall sendmail

    mv /var/spool/mqueue /var/spool/mqueue.stop

    mkdir /var/spool/mqueue

    sendmail –bd

    當網絡空閑的時候,可以用-oQ參數立即處理擁塞的隊列:

    sendmail –oQ/var/spool/mqueue.stop -q
    ,

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>