1. 程式人生 > >配置Mail使用SMTP傳送郵件

配置Mail使用SMTP傳送郵件

今天分享在Linux上使用mail命令通過SMTP對外發郵件。  mail、mailx和sendmail  先看一下三者的關係:mail是mailx的別名,最初叫nail(與arch linux目前用的S nail基因相同);mail是Heirloom的一個子專案,sendmail是Eric Allman的作品,都是開源專案;mail是使用者代理(客戶端),sendmail是郵件傳輸代理(伺服器);mail預設使用sendmail對外發送郵件。  總結:mail和mailx是同一個東西,大約類似於發信用的foxmail、outlook等工具,sendmail大約相當於163/qq郵箱的伺服器軟體。  SSL、TLS和STARTTLS
  由前文我們知道雲伺服器基本上不允許25埠對外通訊,要對外發郵件只能考慮465和587埠。那麼465和587埠有什麼區別?這要先從SSL、TLS和STARTTLS的區別開始說。  SSL(Secure Socket Layer)是加密傳輸層,TLS(Transport Layer Security)是SSL的繼承者和升級版,提供更好的安全性和效能。SSL有SSL v2、SSL v3兩個版本,目前都不建議使用。TLS有TSL v1.0-v1.3,建議至少使用TLS v1.2。  TLS和STARTTLS兩者關係不大,但更讓人容易產生誤解,原因是名字中都帶有TLS。STARTTLS是升級非安全連線為安全連線的協議,並沒有強制使用加密。當服務端支援時,客戶端和服務端才協商將已經建立的連線升級到SSL或者TLS加密。  接著看465埠和587埠。我們知道25埠剛被設計出來時是用於轉發郵件的,沒有考慮認證、加密等問題。隨著垃圾郵件氾濫、網路安全
問題嚴重,MSA、ESMTP/SMTPS等概念和協議被設計出來。1997年465埠被註冊用於加密方式(SMTPS)提交郵件,那時STARTTLS還沒有搗騰出來。1998年STARTLS標準出爐,規定用587埠以STARTTLS方式提交郵件,465埠被吊銷。然而許多客戶端不支援STARTTLS,加上非常多郵件服務提供商都在使用465埠作為加密提交埠,於是465就一直這麼被用到今天。  簡單來說,465埠只支援加密傳輸,不符合網際網路號碼分配結構(The Internet Assigned Numbers Authority,IANA)的標準,但一直被使用和支援;587埠專門被設計用來提交郵件,傳輸可以加密也可以不加密。  配置mail
  明白了基本概念,接下來配置mail使用SMTP對外發送郵件。mail命令的系統級配置檔案是/etc/mail.rc,使用者級別的預設配置檔案是~/.mailrc,也可以通過MAILRC環境變數設定配置檔案路徑。作為普通使用者,我們在本地的~/.mailrc檔案進行配置,SMTP的主要配置如下:
set smtp=smtps://smtp.xxx.com:465   # 這裡填入smtp地址set smtp-auth=login                 # 認證方式set [email protected]     # 這裡輸入郵箱賬號set smtp-auth-password=password     # 這裡填入密碼set ssl-verify=ignore               # 忽略證書警告set nss-config-dir=/etc/pki/nssdb   # 證書所在目錄set [email protected]               # 設定發信人郵箱和暱稱#set smtp-use-starttls=yes          # STARTTLS時使用
  幾個注意點:  如果是465埠,需要加上smtps://協議;如果是587埠,不需要加smtps://或者寫smtp://;  如果使用587埠通訊,應當顯示設定smtp-use-starttls;  郵件的來源應當與郵箱相同,或者將發信人姓名寫在郵箱後的括號中。例如:set [email protected]或set [email protected](nickname);如果郵箱與認證的不一致,將出現“smtp-server: 553 Mail from must equal authorized user”的錯誤;  有些郵件伺服器的587埠不是使用STARTTLS而是SMTPS,此時仍需加上smtps://協議,例如126郵箱。  配置好後,使用mail命令傳送郵件:  echo '郵件內容' | mail -s '郵件標題' 收件人郵箱  #或者:  cat 郵件內容.txt | mail -s '郵件標題' 收件人郵箱  #或者  mail -s '郵件標題' 收件人郵箱 < 郵件內容.txt  mail命令的選項非常豐富,具體可檢視其文件或這篇文章。  多賬戶  如果想切換髮送郵箱怎麼辦?答案是利用配置檔案的account指令或在命令列中指定配置。先看配置檔案中指定,在~/.mailrc中將配置改成如下:
# 126不支援STARTTLS,使用465埠account 126 {set smtp=smtps://smtp.126.com:465set smtp-auth=loginset [email protected]set smtp-auth-password=passwordset ssl-verify=ignoreset nss-config-dir=/etc/pki/nssdbset [email protected]}# QQ郵箱支援STARTTLS,使用587埠account qq {set smtp=smtp://smtp.qq.com:587set smtp-auth=loginset [email protected]set smtp-auth-password=passwordset ssl-verify=ignoreset nss-config-dir=/etc/pki/nssdbset from="[email protected](nickname)"set smtp-use-starttls=yes}
  配置檔案中定義了兩個賬戶,傳送郵件時可用-A引數指定發信賬戶:  echo 'mail test for 126' | mail -A 126 -s 'mail test' [email protected]  echo 'mail test for qq' | mail -A qq -s 'mail test' [email protected]  除了配置檔案,也可以在命令列中用-S引數進行設定。例如:  echo 'mail test for command line option' | mail -s 'mail test' -S smtp=smtp://smtp.qq.com:587 -S smtp-auth=login -S [email protected] -S smtp-auth-password=password -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from="[email protected](nickname)" -S smtp-use-starttls=yes [email protected]  這種方法比較繁瑣,就是將配置檔案的每一行都作為選項寫在命令中。在程式中呼叫mail命令傳送郵件時可以採取這種方法。  解決警告  雖然郵件能順利傳送,但每次執行都會出現一行警告:“Error in certificate: Peer's certificate issuer is not recognized.”。這是由於使用加密通訊,但客戶端不能確認證書是否真實。如果我們將配置中的set ssl-verify=ignore改成set ssl-verify=strict,連線將直接中斷而不會繼續發郵件。  要解決這個警告,需要將郵件伺服器的證書加入到信任列表。操作步驟如下:  獲取郵件伺服器證書:  # 465埠  echo -n "" | openssl s_client -connect smtp.xxx.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt  # 587埠  echo -n | openssl s_client -starttls smtp -connect smtp.xxx.com:587 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt  # 也可以直接在瀏覽器上開啟網頁版,儲存證書為PEM(base64格式)格式然後上傳到伺服器  將證書新增到受信任列表:  certutil -A -n 'xxxx' -t "P,P,P" -d . -i ./xxx.crt  上述命令中-A表示新增,-n是nickname,可以隨意取,例如126或qq;-t表示受信任的標籤,可取值是t/c/p三種或者其組合;-d表示證書所在目錄,-i指示證書檔案的位置。  在配置檔案中更改證書目錄:  # 指向證書檔案目錄  set nss-config-dir=/path/to/cert-dir  網上許多教程的-t標籤都是"C,,",實踐中發現使用該標籤仍會報錯(gmail的證書是google自己簽發的,用C標籤沒問題,許多博主估計沒試就直接抄來)。通過查閱certutil的用法,使用P標籤順利解決問題。  配置完成後,再使用mail命令傳送郵件,煩人的警告消失不見。  其他  "Unexpected EOF on SMTP connection",基本上是由於埠只支援SMTPS導致,將協議改成smtps://即可。上文內容不用於商業目的,如涉及智慧財產權問題,請權利人聯絡博為峰小編(021-64471599-8017),我們將立即處理。

bash: mail: command not found的解決方法

yum -y install mailx

一、mail命令

1.配置 

vim /etc/mail.rc

檔案尾增加以下內容 

set from=[email protected] smtp="smtp.qq.com"
set smtp-auth-user="[email protected]" smtp-auth-password="123456"
set smtp-auth=login
說明:from: 對方收到郵件時顯示的發件人
smtp: 指定第三方傳送郵件的smtp伺服器地址
smtp-auth: SMTP的認證方式。預設是LOGIN,也可改為CRAM-MD5或PLAIN方式
smtp-auth-user: 第三方發郵件的使用者名稱
smtp-auth-password: 使用者名稱對應密碼

2.Mail命令

% mail --h
mail: illegal option -- -
Usage: mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users

注:部分系統引數稍有差異,最好看幫助

1)  無郵件正文
  •   mail -s "主題"  收件地址
% mail -s "測試"  1968089885@foxmail.com

2) 有郵件正文

  •  mail -s "主題"  收件地址< 檔案(郵件正文.txt)
% mail -s "郵件主題"  1968089885@foxmail.com < /data/findyou.txt
  •  echo "郵件正文" | mail -s 郵件主題  收件地址
echo "郵件正文內容" | mail -s "郵件主題"  1968089885@foxmail.com
  •  cat 郵件正文.txt | mail -s 郵件主題  收件地址 
cat  /data/findyou.txt | mail -s "郵件主題"  1968089885@foxmail.com
3)  帶附件
  •  mail -s "主題"  收件地址  -a 附件 < 檔案(郵件正文.txt) 
% mail -s "郵件主題"  1968089885@foxmail.com -a /data/findyou.tar.gz < /data/findyou.txt

3.指令碼

sendmail.sh

複製程式碼#!/bin/bash
#author:findyou
help(){
   echo "eg: $0 [Subject] [address] [content_file] [file]"
   echo ""
   exit 1
}

if [ ! -n "$1" ] ; then
    help
fi

cDate=`date +%Y%m%d`

if [ ! -n "$2" ] ; then
    help
else
    mail_to=$2
    echo "      Send Mail to ${mail_to}"
fi

if [ ! -n "$4" ] ; then
    mail -s $1 ${mail_to}<$3
else
    mail -s $1 -a $4 ${mail_to}<$3
fi複製程式碼

使用

[[email protected]123]$ ./sendmail.sh  test  1968089885@qq.com  abc.txt
      Send Mail to 1968089885@qq.com
[[email protected]123]$

說明:建議直接使用命令 ,有指令碼只是為了在列印顯示相關資訊,多此一舉。

相關推薦

CentOS 6/7 配置 sendEmail 傳送郵件

sendEmail是Linux下優秀的第三方郵件命令,非常簡單,可以設定 smtp,不會被認定為SPAM(垃圾郵件)或直接拒收。 1、sendEmail 下載 2、解壓、安裝 tar zxvf sendEmail-v1.56.tar.gz c

Ubuntu 中sendmail 的安裝、配置傳送郵件的具體實現

一、安裝 ubuntu中sendmail函式可以很方便的傳送郵件,ubuntu sendmail先要安裝兩個包。 必需安裝的兩個包: 程式碼  sudo apt-get install sendmail  sudo apt-get install sendmail-

常見網站系統後臺配置smtp傳送郵件

現在大多數系統都有郵件傳送功能,但有很多使用者不會配置導致程式郵件相關的功能不能正常工作。由於主機不支援mail函式,網站要使用郵件傳送功能就需要呼叫外部的smtp,同時郵箱自身也要開啟smtp/pop功能才可以正常呼叫。常見第三方smtp如下: 騰訊企業郵箱:s

jenkins配置自動傳送郵件

1.開通QQ的SMTP服務,需要發一條簡訊,qq會給你一個密碼(不是你的QQ郵箱密碼哦)   2.安裝 E

織夢會員註冊郵箱驗證傳送郵件配置教程

環境要求 主機465埠是開啟和放行的 php擴充套件openssl是開啟的 php擴充套件sockets是開啟的 1、QQ郵箱 或者 163郵箱 126郵箱 開啟SMTP服務,拿到授權碼,根據自己的來 QQ郵箱開啟SMTP服務 和 獲取授權碼 163郵箱開啟SM

記錄一次 .Net 框架 Bug 發現和提交過程:SmtpClient一處程式碼編寫錯誤導致非同步傳送郵件時DeliveryFormat配置項無法正確工作

問題已經發到了開發者社群 developercommunity.visualstudio.com/content/pro… 涉及到的Github倉庫: github.com/xiangyuecn/… .Net開發者社群富文字編輯器太難用了,還是簡書的編輯器好用,然後掘金的版面好看,最後還是喜歡cnb

django 傳送郵件配置

拿qq郵箱當做發件箱舉例子,首先配置郵箱 在qq郵箱的賬戶設定裡面設定如下   得到第三方登陸授權碼 setting.py中設定如下: # 傳送郵件設定 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBac

Jenkins--傳送郵件配置

 使用Jenkins可以進行構建,並可以傳送郵件。今天我們來講一下郵件的配置。 首先:下載安裝外掛; 進入【Jenkins-系統管理-外掛管理-可選外掛】,搜尋“Email Extension”進行安裝,安裝完成後要重新啟動服務。搜尋可能有點慢,等一下~ 下圖是我安裝好後的顯示頁面 &n

docker: gitlab傳送郵件配置

docker版gitlab 8.7.5-ce.0 #!/bin/bash docker run --detach \     --hostname gitlab.domain.cn \     --publish 38443:4

Jenkins傳送郵件配置(不是QQ郵箱)

1.首先確認下是否安裝了Email Extension Plugin 外掛 在系統設定》外掛管理中檢視 2.系統管理》系統設定中進行如下配置 2.1配置系統管理員郵箱 2.2Extended E-mail Notification設定 2.3郵件通知配

Zabbix 配置通過sendEmail傳送郵件報警

## 1、安裝sendEmail### 1.1、下載安裝sendEmail1. 通過Linux下載命令`wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz`(wget安裝命令:`rpm install w

Java傳送郵件的基本配置與步驟

Java傳送郵件的基本配置與步驟 java 這裡簡單介紹一種利用Java來發送郵件的方法。 Maven的POM.xml檔案載入jar包 <dependency> <gro

WordPress系列教程(五)----WordPress配置傳送郵件

一、前言 WordPress中有使用者註冊使用者、使用者填入相應的郵件,後臺會發送郵件給使用者,Wordpress預設是使用 PHP 的 mail() 功能傳送郵件,如果主機沒有開啟這一功能,那麼 wordpress 當然就無法發出郵件了。但即便是伺服器支援 PHP mai

CentOS 7.5配置mailx使用外部smtp傳送郵件

1.連線現成的smtp伺服器去傳送(此方法比較簡單,直接利用現有的smtp伺服器比如qq、新浪、網易等郵箱,只需要直接配置mail.rc檔案即可實現) 2.自己搭建私有的smtp伺服器(需要用到postfix、bind等服務) 本文章只介紹第一種方式去實現 具體配置步驟如下: 1、安裝mailx y

yii2 配置郵件賬號傳送郵件

use yii\swiftmailer\Mailer; $config = [ 'class' => 'Swift_SmtpTransport', 'host' => 'yo

在阿里雲上使用django傳送郵件配置

傳統配置如下: EMAIL_HOST = "smtp.163.com" #這裡使用的是163郵箱 EMAIL_PORT = 25 EMAIL_HOST_USER = "郵箱使用者名稱" EMAIL_HOST_PASSWORD = "授權碼" EMAIL_FROM = '任意名

Spring cloud admin 配置傳送郵件功能

首先引入pox配置 <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spr

django傳送郵件相關配置

1、用django傳送簡單郵件相關配置: #settings.py #郵件配置 EMAIL_HOST = 'smtp.gmail.com' #SMTP地址 EMAIL_PORT = 25

PHP中呼叫mail()函式傳送郵件所需sendmail的基本配置和html格式的郵件資訊

首先從http://glob.com.au/sendmail上下載sendmail壓縮包;並將其解壓到D:盤中(一般最好不要解壓到C:盤,且目錄不要太長)。 設定一下PHP.ini檔案: [mail function] ; For Win32 only. ; http://

利用傳送郵件SpringMail+thymeleaf+配置Bean實現

以QQ郵箱為例子。 1.確保smtp郵件服務開啟,並獲取密碼 2.配置JavaBean的郵件傳送器 3.測試 1.確保Stmp郵件服務開啟,並獲取密碼 1.登入郵箱 >>> 設定>>> 賬戶 POP3/IM