1. 程式人生 > >linux實戰(七)----傳送郵件通知----例項運用

linux實戰(七)----傳送郵件通知----例項運用

我們在前面幾章已經學習了一些常用的用法,有時候我們需要在監控出現異常情況時給管理員傳送郵件。

本章學習  在shell指令碼中 傳送郵件通知。

我們在實戰六的 示例程式碼上 增加發送郵件的功能   實現每次檢查完目錄空間備份後  就傳送郵件。

實戰六指令碼程式碼回顧

checkSpace.sh如下: 檢查目錄的佔用磁碟 並把結果檔案備份

#!/bin/bash   
  
function GetDiskSpc     
 {     
    if [ $# -ne 1 ]     
    then     
        return 1     
    fi     
    
    Folder="$1$"    
    DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'`  
    echo $DiskSpace     
 }    
   
  
  
  
function CheckDiskSpc     
 {     
    
 DiskSpace=`GetDiskSpc $1`     
    
 echo "The system $Folder disk space is $DiskSpace%"    
    
  echo "The system $Folder disk space is $DiskSpace%"  >> space.txt  
    
 if [ $DiskSpace -gt 90 ]     
 then     
 {     
    echo "The usage of system disk($Folder) is larger than 90%"    
       echo "The usage of system disk($Folder) is larger than 90%"   >> space.txt  
 }     
 else     
 {     
    echo "The usage of system disk($Folder)  is normal"    
     echo "The usage of system disk($Folder)  is normal"   >> space.txt  
 }     
 fi    
    
}    
  
  
CheckDiskSpc  /boot    
  
time=`date +%F`   
  
tar cvf  - /data/shell/space.txt  > /data/shell/${time}space.tar  
  
rm space.txt  


安裝和配置sendmail

不需要註冊公網域名和MX記錄(不需要架設公網郵件伺服器),通過linux系統自帶的mail命令即可對公網郵箱傳送郵件。不過mail命令是依賴sendmail的,所以我們需要先檢查安裝和配置sendmail。

一般系統都自帶sendmail,但是隻能給內網的郵箱發郵件。如果想給公網的郵箱發郵件(比如qq郵箱)就需要配置sendmail.

這裡記錄sendmail的安裝啟動配置,各取所需。

下載安裝mailutils

wget ftp://ftp.gnu.org/gnu/mailutils/mailutils-2.2.tar.gz



下載完成後在當前目錄中可以看到壓縮檔案,解壓進入,執行安裝命令。
tar -xvf mailutils-2.2.tar.gz
cd ./mailutils-2.2
./configure
make && make install
yum install -y sendmail
yum install sharutils   # 使用帶附件功能
service sendmail start 

檢視sendmail啟動沒:

  ps aux |grep sendmail
測試:    echo 'content test' | mail -s "title test"  -t [email protected]
此時發覺只能給公司內部發郵件, 如果需要還能給外面的郵箱(比如我的qq郵箱)發郵件則還需要

vi  /etc/mail/sendmail.mc
找到包含Addr的這一行:    
DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')dnl
修改Addr=0.0.0.0  ,表明可以連線到任何伺服器
End

這時候測試 這裡[email protected]修改成自己的郵箱,能傳送到就通了。

<pre name="code" class="plain" style="font-size: 13.3333339691162px;">echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe"   [email protected]
如果郵件被拒絕,請移步文章末尾的 可能遇到的問題---根據步驟把linux域名加入qq郵箱白名單。

linux系統郵件mail命令

我們學習一下mail命令。

mail用法

mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr]  to-addr ...  [--sendmail -options ...]

mail [-iInNv] -f [name]

mail [-iInNv] [-u user]

引數解析

i 忽略 tty 的中斷訊號。 (interrupt)

I 強迫設成互動模式。 (Interactive)

v 列印出訊息,例如送信的地點、狀態等等。 (verbose)n 不讀入 mail.rc 設定檔。

s 郵件標題。

c cc 郵件地址。

b bcc 郵件地址。

CC 英文全稱是 Carbon Copy(抄送);

BCC英文全稱是 Blind CarbonCopy(暗抄送)。 

這兩個的區別是什麼呢? cc:每個收件人都能看到抄送人的地址。 bcc:祕密抄送的郵件地址,其他收件人是看不到的 如果你想將郵件一次發給多人,而又不想讓別人知道你一次發給多人,那就使用祕密抄送了

使用例項

直接使用shell當編輯器

mail -s "Hello from mzone.cc by shell"    [email protected]
hello,this is the content of mail.
welcome to www.mzone.cc
第一行是輸入的命令,-s表示郵件的主題,後面的[email protected]則是郵件的接收人,輸入完這行命令後回車,會進入郵件正文的編寫,我們可以輸入任何文字,比如上面的兩行。當郵件正文輸入完成後,需要按CTRL+D結束輸入,此時會提示你輸入Cc地址,即郵件抄送地址,沒有抄送地址則直接回車就完成了郵件的傳送。


使用管道進行郵件傳送

echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe"    [email protected]
使用管道直接敲入這行命令即可完成郵件的傳送,其中echo後的是郵件正文。



使用檔案進行郵件傳送

mail -s "Hello from mzone.cc by file"  [email protected] < mail.txt
使用上面的命令後,我們就可以把mail.txt檔案的內容作為郵件的內容傳送給[email protected]了。





總結分析

使用上述三種方式都可以給外部郵箱進行郵件傳送,但因為前面2種都是直接在shell中敲入郵件內容,因此無法輸入中文,即使我們使用貼上的方式輸入了中文,那麼收到的郵件也是亂碼的。

但第3種方式,我們可以在window下編輯好郵件內容後,放到linux下,再進行傳送,這樣就可以正常傳送中文了。不過目前郵件的中文標題暫時沒有找到解決辦法。
這裡我主要介紹的是在CentOS下使用mail傳送電子郵件的一些使用方法,需要的要求是你的linux必須安裝了sendmail並開啟了,同時保證可以連線外網。


設定發件郵箱


 因為mail程式本身就是呼叫sendmail來進行郵件傳送的,因此我們可以在mail命令中使用sendmail的引數進行配置,比如我想使用特定的發件人傳送郵件,可以使用如下命令:


mail -s "Hello from mzone.cc with sender"   [email protected]   -- -f   [email protected]<mail.txt
 上面的命令中,我們使用了– -f   [email protected]這樣的引數,這是sendmail的選項,其中-f表示郵件的傳送人郵件地址。更多sendmail引數請檢視這裡http://www.courier-mta.org/sendmail.html,或者在shell中man sendmail進行幫助獲取。


新增附件

很多情況下,我們也需要使用郵件來發送附件,在linux下使用mail命令傳送附件也很簡單,不過首先需要安裝uuencode軟體包,這個程式是對二進位制檔案進行編碼使其適合通過郵件進行傳送,在CentOS上安裝該軟體包如下:

yum install sharutils
安裝完成後我們就可以來進行附件的傳送了,使用如下命令:

uuencode   test.txt   testfilename | mail -s "hello,see the attachement"   [email protected]  <  mail.txt
 完成後就可以把text.txt檔案作為郵件的附件傳送出去了。uuencode有兩個引數,第一個是要傳送的檔案,第二個是顯示的檔名稱。



檢查郵件是否發出

檢查所傳送的電子郵件是否送出,或滯留在郵件伺服器中
語法:
/usr/lib/sendmail -bp
若螢幕顯示為“Mail queue is empty” 的資訊,表示mail 已送出。
若為其他錯誤資訊,表示電子郵件因故尚未送出。

讀取郵件

系統收到郵件都會儲存在“/var/spool/mail/[linux使用者名稱]”檔案中。

在linux中輸入mail回車 ,就進入了收件箱,並顯示二十封郵件列表。


此時命令提示符為”&”:(可以輸入以下命令對郵件進行相關操作) 
&    help //如果不會使用或者忘記了什麼命令,就輸入 help 或者 ? 來獲取幫助
 Mail   Commands
    t                打印出資訊 【注意】多個資訊用空格分開,如 t 1 7
    n                                    打印出下一條資訊
    e                編輯資訊
    f                輸出資訊的頭行
    d                刪除資訊
    s file           追加資訊到檔案file
    u                不刪除某資訊
    R                回覆發件人
    r                回覆發件人和本資訊所有的收件人
    pre              保留資訊在 /usr/spool/mail  1*
    m                   發郵件,多個收件人用空格分開【需要sendmail支援】
    x            退出mail命令平臺,並不儲存之前的操作,比如刪除郵件
   q         退出mail命令平臺,儲存之前的操作,比如刪除已用d刪除的郵件,已閱讀郵件會轉存到當前使用者家目錄下的                   mbox檔案中。如果在mbox中刪除檔案才會徹底刪除。   

    !                               讓shell執行某命令,如 !ls 輸出ls命令結果
    cd [directory]                  改變目錄,這裡不用 !cd,但列印當前目錄需要 !pwd

指令碼中發郵件

我們現在把mail命令和實戰六的指令碼結合起來,我們這裡使用管道方法。

我這裡傳送到我的郵箱[email protected]

echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe"   [email protected]

最終指令碼checkSpace.sh如下:

#!/bin/bash 

function GetDiskSpc   
 {   
    if [ $# -ne 1 ]   
    then   
        return 1   
    fi   
  
    Folder="$1$"  
    DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'`
    echo $DiskSpace   
 }  
 



function CheckDiskSpc   
 {   
  
 DiskSpace=`GetDiskSpc $1`   
  
 echo "The system $Folder disk space is $DiskSpace%"  
  
  echo "The system $Folder disk space is $DiskSpace%"  >> space.txt
  
 if [ $DiskSpace -gt 90 ]   
 then   
 {   
    echo "The usage of system disk($Folder) is larger than 90%"  
	   echo "The usage of system disk($Folder) is larger than 90%"   >> space.txt
 }   
 else   
 {   
    echo "The usage of system disk($Folder)  is normal"  
	 echo "The usage of system disk($Folder)  is normal"   >> space.txt
 }   
 fi  
  
}  


CheckDiskSpc  /boot  

time=`date +%F` 

tar cvf  - /data/shell/space.txt  > /data/shell/${time}space.tar

rm space.txt

echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe"   [email protected]


執行結果:

成功收到郵件


可能遇到的問題

情況分析

有時候會發送不出去,特別是qq郵箱,遇到的問題可能有以下這些:

  • 550 Mailbox unavailable or access denied出錯原因:您要傳送的收件人短時間內收到大量郵件,為避免受到惡意攻擊,暫時禁止向該收件人發信。改善建議:暫停向該收件人發信,稍後重新嘗試。

  • 501 Bad address syntax出錯原因:您所填寫的收件人地址格式不正確。您可以按照以下步驟檢查您填寫的收件人地址:1、請檢查域名是否包含有不允許被使用的字元,如 / , * ? ; 等。這些字元有可能是您在敲擊鍵盤時無意間輸入的錯誤字元;2、請檢查域名格式是否合法,一般來說,域名格式為 domain.com;3、請檢查您輸入的收件人地址中是否有不該出現的空格;4、再次核對您輸入的收件人地址,檢查地址中是否存在一些容易混淆的字元造成您輸入錯。例如:大寫字母 O 與數字 0 ,小寫字母 l 與數字 1 ,小寫字母 g 與數字 9 ,小寫字母 l 與大寫字母 I 。改善建議:經過以上檢查後您還是無法找到收件人地址的錯誤原因,請您聯絡對方,確認該郵件地址是否正確。

  • 552 Message too large出錯原因:您所傳送的郵件大小超出騰訊郵箱限制。改善建議:縮減郵件大小,避免夾帶超大附件。

  • 550 Mailbox not found出錯原因:您要傳送的收件人不存在。 改善建議:請與您的收件人確認正確的郵件地址。

  • 550 Mail content denied出錯原因:該郵件內容涉嫌大量群發,並且被多數使用者投訴為垃圾郵件。對於具有群發性質的郵件,如果出現使用者普遍表示反感或集中投訴的情況,騰訊郵箱將禁止類似此郵件內容繼續傳送。改善建議:如果您是此群發郵件的管理員,請停止群發對使用者造成騷擾的廣告及推廣類郵件。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。

  • 550 Connection denied出錯原因:該伺服器IP的發信頻率大幅度超過QQ郵箱限制。QQ郵箱對來自相同IP的外部發信伺服器有一定的頻率限制:1、超過每分鐘發信量限制,此IP地址被禁止發信若干分鐘。2、超過每小時發信量限制,此IP地址被禁止發信若干小時。3、超過每日發信量限制,此IP地址本日內禁止再發信。4、以上頻率限制數值屬於QQ郵箱保密資料,恕不公開。改善建議:如果您是該伺服器IP的管理員,請暫停該伺服器IP的發信,稍後降低頻率重新嘗試發信。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。

  • 550 Mail content denied出錯原因:該郵件內容涉嫌大量群發,並且被多數使用者投訴為垃圾郵件。對於具有群發性質的郵件,如果出現使用者普遍表示反感或集中投訴的情況,騰訊郵箱將禁止類似此郵件內容繼續傳送。改善建議:如果您是此群發郵件的管理員,請停止群發對使用者造成騷擾的廣告及推廣類郵件。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。

  • 550 Ip frequency limited出錯原因:該伺服器IP的發信頻率超過騰訊郵箱限制。騰訊郵箱對來自相同IP的外部發信伺服器有一定的頻率限制:1、超過每分鐘發信量限制,此IP地址被禁止發信若干分鐘。2、超過每小時發信量限制,此IP地址被禁止發信若干小時。3、超過每日發信量限制,此IP地址本日內禁止再發信。4、以上頻率限制數值屬於騰訊郵箱保密資料,恕不公開。改善建議:如果您是該伺服器IP的管理員,請暫停該伺服器IP的發信,稍後降低頻率重新嘗試發信。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。

  • 550 Domain frequency limited出錯原因:該發件人域名的發信頻率超過騰訊郵箱限制。騰訊郵箱對相同的發件人域名有一定的頻率限制:1、超過每分鐘發信量限制,此發件人域名被禁止發信若干分鐘。2、超過每小時發信量限制,此發件人域名被禁止發信若干小時。3、超過每日發信量限制,此發件人域名本日內禁止再發信。4、以上頻率限制數值屬於騰訊郵箱保密資料,恕不公開。改善建議:如果您是該發件人域名的管理員,請暫停該發件人域名的發信,稍後降低頻率重新嘗試發信。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。

  • 550 Sender frequency limited出錯原因:該發件人的發信頻率超過騰訊郵箱限制。騰訊郵箱對相同的發件人有一定的頻率限制:1、超過每分鐘發信量限制,此發件人被禁止發信若干分鐘。2、超過每小時發信量限制,此發件人被禁止發信若干小時。3、超過每日發信量限制,此發件人本日內禁止再發信。4、以上頻率限制數值屬於騰訊郵箱保密資料,恕不公開。改善建議:如果您是該發件人域名的管理員,請暫停該發件人的發信,稍後降低頻率重新嘗試發信。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。

  • 550 Connection frequency limited出錯原因:該伺服器IP的發信頻率超過騰訊郵箱限制。騰訊郵箱對來自相同IP的外部發信伺服器有一定的頻率限制:1、超過每分鐘發信量限制,此IP地址被禁止發信若干分鐘。2、超過每小時發信量限制,此IP地址被禁止發信若干小時。3、超過每日發信量限制,此IP地址本日內禁止再發信。4、以上頻率限制數值屬於騰訊郵箱保密資料,恕不公開。改善建議:如果您是該伺服器IP的管理員,請暫停該伺服器IP的發信,稍後降低頻率重新嘗試發信。如果您是個人郵箱使用者,請向您的電子郵件提供商報告此情況。


解決方法

方法一:不用qq郵箱

方法二:把linux域名加入qq郵箱白名單

如下圖

域名可在拒絕郵件中找到。



成功收到郵件!

相關推薦

linux實戰()----傳送郵件通知----例項運用

我們在前面幾章已經學習了一些常用的用法,有時候我們需要在監控出現異常情況時給管理員傳送郵件。 本章學習  在shell指令碼中 傳送郵件通知。 我們在實戰六的 示例程式碼上 增加發送郵件的功能   實現每次檢查完目錄空間備份後  就傳送郵件。 實戰六指令碼程式碼回

Jenkins任務失敗,傳送郵件通知

1、進入系統管理->系統設定,然後進行下面設定: 2、配置管理員郵件賬號,需要和後面的郵件傳送者一致。否則可能會發送不成功 3、配置基礎的郵件傳送的配置 4、配置郵件擴充套件配置--用來自定義郵件格式等,這裡需要注意一點:定義的郵件伺服器等配置要和上面的郵件普通配置一致 5、在每

laravel 使用阿里雲【郵件推送】服務傳送郵件通知

使用這個包:https://github.com/HyanCat/aliyun-direct-mail 1、安裝: composer require hyancat/aliyun-direct-mail:dev-master 2、在 config/services.php 中新增如下

linux學習-mail傳送郵件(mail不能發郵件

主機:centos 7 , 安裝sendmail,啟動sendmail,一般就可以了,但是有些同學為什麼不行,就是啟不動出現如下的情況!那現在如何解決。 yum install sendmailsystemctl start sendmail.service system

Linux——使用mail傳送郵件給外部郵箱

相信大家都用過電子郵箱,例如網易163、騰訊QQ、Gmail等等。 在上一篇部落格裡小編剖析了crond&crontab(部落格連結http://blog.csdn.net/enchanting_/article/details/73752291),然

linux 安裝msmtp傳送郵件

Linux下可以直接用mail命令傳送郵件,但是發件人是[email protected],如果機器沒有外網的dns,其他人就無法回覆。此時,有一個可以使用網路免費郵箱服務的郵件傳送程式就比較重要了。msmtp就是這樣的一個程式。 #1、下載原始碼包 wge

Linux使用mailx傳送郵件--技術流ken

  前言   最近想要監控系統服務執行情況並實現自動傳送郵件報警,zabbix雖然也可以實現這樣的功能,但是這裡使用一個非常簡單的辦法就可以實現。需要安裝mailx工具,mailx是一個小型的郵件傳送程式。   安裝步驟  

JavaWeb中使用JavaMail實現傳送郵件功能例項詳解

現在很多的網站都提供有使用者註冊功能, 通常我們註冊成功之後就會收到一封來自注冊網站的郵件。郵件裡面的內容可能包含了我們的註冊的使用者名稱和密碼以及一個啟用賬戶的超連結等資訊。今天我們也來實現一個這樣的功能,使用者註冊成功之後,就將使用者的註冊資訊以Email的形式傳送到使

使用 HtmlEmail 傳送郵件 簡單例項

import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; public static void main(S

Linux搭建SMTP傳送郵件伺服器

該例子使用的是Centos6系統作為SMTP郵件伺服器 其他的Linux發行版配置基本一樣,只是命令會有些不同。 安裝postfix 檢查postfix是否已安裝 rpm -qa | grep postfix 如果已安裝則會顯示 postfix-

JavaMail傳送郵件api例項

郵件傳送程式 我們先使用JavaMail API傳送一封簡單的郵件,步驟為 建立包含郵件伺服器的網路連線資訊的Session物件。建立代表郵件內容的Message物件。建立Transport物件、連線伺服器、傳送Message、關閉連線。 這樣使用JavaMail AP

Linux Shell指令碼傳送郵件

傳送郵件指令碼 #shell send email from_name="[email protected]" from="[email protected]test.com" to="[email protected]" cc_name="A

檢測環境中是否有core檔案並自動傳送郵件通知

最近遇到幾次測試人員間隔好些天發現環境中出現了core檔案,因為時間太長導致版本和相關資訊缺失的情況,因此想到寫一個指令碼用於監控環境中core檔案的產生,併發及時傳送郵件告警。 指令碼如下: ########################################

檢測到有人登錄到linux,mysql,ftp,就發郵件通知管理員

mysql ftp 檢測到有人登錄到linux 就發郵件通知管理員 最近老板總感覺有人能登錄到公司的linux系統,我排查了半天也沒有找到任何蛛絲馬跡,幹脆設置一個陷阱,等著那個人往裏走【1】使用sendmail搭建簡單郵件服務器第一步:安裝sendmail並啟動服務yum -y instal

Linux系統使用mailx命令傳送郵件

一、環境核實以及準備。     在centos7系統中預設有安裝mailx命令進行系統郵件的傳送。如果沒有相關的命令可以自行通過yum安裝     #yum install mailx -y    使用#ss  &nbs

【SSH網上商城專案實戰25】使用java email給使用者傳送郵件

      當用戶購買完商品後,我們應該向使用者傳送一封郵件,告訴他訂單已生成之類的資訊,郵箱地址是從使用者的基本資訊中獲取,好了,首先我們來看一下java中傳送郵件的方法。

java傳送郵件例項

JavaMail傳送郵件到qq郵箱:前提是QQ郵箱裡帳號設定要開啟POP3/SMTP協議,步驟如下: ​​​​​​​1. 登陸你的QQ即可,找到QQ郵箱圖示。 2.進入郵箱後後點選設定。     3.找到賬戶。 4.往下拉將POP3/SMTP開啟。&nb

阿里雲 Linux 啟用465埠傳送郵件

阿里雲 Linux 啟用465埠傳送郵件 環境:阿里雲 Linux Centos 7.4 x64 注:阿里雲預設禁用25郵件埠,需要啟動465埠加密進行郵件傳送。 注:確保郵箱開啟SMTP服務,POP3,並申請了密碼。 注:確保已經安裝mailx,sendmaill,dos2unix 安裝教程:ht

linux 傳送郵件(centos)

1.安裝mailx 安裝mailx: yum install mailx vi /etc/mail.rc set [email protected] set smtp="smtps://smtp.qq.com:465" set smtp-auth-user=12345678

Linux實用技巧——mail傳送郵件命令以及中文亂碼解決

文章目錄 0 前言及準備 1 mailx安裝及配置 1.1 安裝 1.2 編輯配置檔案 2 傳送郵件 2.1 無正文郵件 2.2 有正文郵件 3 郵件中文亂碼問題解決