歡迎您光臨本站 註冊首頁

也談用Socket發送電子郵件

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  作者:尚軒

在phpuser.com的文章中limodou大哥發表了文章《用Socket發送電子郵件》。在smtp協議中郵件的結束是以 . 結束,但是要和內容不在同一行,否則,郵件伺服器認為郵件還沒有結束,伺服器還在等待數據的上傳!下面請看outlook發的郵件內容:

>>> smileyou@netease.com
<<< smileyou@localhost

X-Server: Advanced Direct Remailer (www.elcomsoft.com)
Message-ID: <002d01c04b32$60196960$0300a8c0@zyh>
From: "zyh"
To:
Subject: Fw: aa
Date: Sat, 11 Nov 2000 00:22:09 +0800
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_002A_01C04B75.6E2BE080"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 5.00.2615.200
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2615.200

This is a multi-part message in MIME format.

------=_NextPart_000_002A_01C04B75.6E2BE080
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: base64

DQphYQ0K

------=_NextPart_000_002A_01C04B75.6E2BE080
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdi
MjMxMiIgaHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNS4w
MC4yNjE0LjM1MDAiIG5hbWU9R0VORVJBVE9SPg0KPFNUWUxFPjwvU1RZTEU+DQo8L0hFQUQ+DQo8
Qk9EWSBiZ0NvbG9yPSNmZmZmZmY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBzaXpl
PTI+YWE8L0ZPTlQ+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg==

------=_NextPart_000_002A_01C04B75.6E2BE080--

.


大家可以看到最後是換行+.+換行結束的!而且內容使用了base64編碼,在limodou的文章中,沒有將內容編碼,
所以,有的朋友就無法看到信件的內容!我們將內容解碼,得到的內容是"aa"這兩個字母。那我們怎麼讓
上傳的內容最後換行+.+換行呢?
其實很簡單,fputs上去的數據直接換行就可以了:請看下面的例子:


$smtpserver="localhost" ;
$fp = fsockopen($smtpserver, 25, &$errno, &$errstr, 10);

echo ($hostreply=fgets($fp,128));

$server_name=strstr(ltrim($hostreply)," ") ;
$server_name=substr(ltrim($server_name),0,strlen ($server_name )-12) ;
echo "
server_name:".$server_name."
" ;
fputs($fp,"HELO $server_name n");

$hostreply=fgets($fp,128);
fputs($fp,"MAIL FROM: smileyou@netease.comn") ;
echo($hostreply=fgets($fp,128));
echo "
--------------------------
";
fputs($fp,"RCPT TO: smileyou@sina.com.cnn") ;
echo($hostreply=fgets($fp,128)) ;




fputs($fp,"DATAn") ;
echo($hostreply=fgets($fp,128)) ;
echo "
--------------------------
n";
$mail_from="smileyou@netease.com";
$mail_to="smileyou@sina.com";
$subject="test";
$mail_from="From: <$mail_from>";
$mail_to="TO: <$mail_to>";
$subject="Subject: $subject";
$message=base64_encode("this is a test leter");
fputs($fp,$mail_from."
") ;
fputs ($fp ,$mail_to."
");
fputs ($fp,$subject."
");
fputs ($fp,$message."

");
fputs ($fp,".");
fputs ($fp,"
");
echo($hostreply=fgets($fp,128));
fputs($fp,"QUIT") ;

fclose($fp) ;
?>

大家看到,fputs郵件內容是直接換行的,而不是用php中"n"或者"r"的,可是一部分卻以"n"換行的,
我沒法搞懂那部分,哪位明白的話告訴小弟一聲。這個郵件就這樣發出去了。


好,下面讓我們看一個帶附件的郵件的發送情況。下面是附件為line.gif,主題為「附件」,內容為「附件」
的郵件發送到smtp伺服器的數據內容:

>>> smileyou@netease.com
<<< smileyou@netease.com

X-Server: Advanced Direct Remailer (www.elcomsoft.com)
Message-ID: <000901c04b3c$b7aa82e0$0300a8c0@zyh>
From: "zyh"
To:
Subject: =?gb2312?B?uL28/g==?=
Date: Sat, 11 Nov 2000 01:36:11 +0800
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_0005_01C04B7F.C5A30960"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 5.00.2615.200
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2615.200

This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C04B7F.C5A30960
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_0006_01C04B7F.C5AC3120"


------=_NextPart_001_0006_01C04B7F.C5AC3120
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: base64

uL28/g0K

------=_NextPart_001_0006_01C04B7F.C5AC3120
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdi
MjMxMiIgaHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNS4w
MC4yNjE0LjM1MDAiIG5hbWU9R0VORVJBVE9SPg0KPFNUWUxFPjwvU1RZTEU+DQo8L0hFQUQ+DQo8
Qk9EWSBiZ0NvbG9yPSNmZmZmZmY+DQo8RElWPjxGT05UIHNpemU9Mj64vbz+PC9GT05UPjwvRElW
PjwvQk9EWT48L0hUTUw+DQo=

------=_NextPart_001_0006_01C04B7F.C5AC3120--

------=_NextPart_000_0005_01C04B7F.C5A30960
Content-Type: image/gif;
name="line.gif"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="line.gif"

R0lGODlhugEHAJEAAP9/D////wAAAAAAACwAAAAAugEHAEACfIyPqcvtD6OctNqLs968+w+GDQAY
pFkGp5qubgujMju/dUznto7vfg+8CXnDXzFITBqVyKWzCT1KmdNnNUrNWnOirvcLDovH5LL5jE6r
1+y2+w2Py+f0uv2Ol2/3WP71r9UnCOgXSDhomFi4iMh4+KjYiJRHWWl5iZnJUAAAOw==

------=_NextPart_000_0005_01C04B7F.C5A30960--

.

大家可以看到subject部分變化了,還有變化的有X-Priority: 3上面的Content-Type變了,
在phpuser的站長hunte的文章《用PHP發送有附件的電子郵件》中了解到以下的內容:
這個頭告訴郵件程序電子郵件是由一個以上的部分組成的。不含附件的郵件只有一個部分:消息本身。
帶附件的電子通常至少由兩部分組成:消息和附件。這樣,帶兩個附件的郵件由三部分組成:消息,第一
個附件和第二個附件。

帶附件的電子郵件的不同部分之間用分界線來分隔。分界線在Content-type頭中定義。郵件的每個新部分
以兩個連字號(--)和分界線開始。最後一個分界線后也有兩個連字號,表示這個郵件中沒有其它的部分了。

在每個分界線後有一些行,用來告訴郵件程序這個部分的內容的類型。比如,看看上面例子中第一個分界
線後面的兩行--以Content-type: text/plain開頭的行。這些行說明後面的部分是gb2312字符集的純文本。跟在第二
個分界線后的行告訴郵件程序現在的部分是一個HTML文件,它的名字是"attachment.html"。

Content-disposition這持告訴郵件程序如果可能就以內嵌的方式顯示附件。現在新的郵件程序會在消息后
顯示HTML的內容。如果Content-disposition被設為attachment,那麼郵件程序就不會顯示HTML文件的內容
,而是顯示一個連接到文件的圖標(或其它的類似的東西)。收件人要看附件的內容,必須點擊這個圖標。
一般情況下,如果附件是一些文本(包含HTML),Content-disposition會被設為inline,這是因為
現在大部分郵件程序能夠不藉助其它瀏覽器而直接顯示附件(文本)的內容。如果附件不是文本(比如
圖片或其它類似的內容),Content-disposition就設為attachment。


郵件的內容的content-type是text/html,圖片的content-type是image/gif,而且多用了base64編碼。現在我們將
其改進一下,



if ($submit){
/*--------------------
#打開附件、讀取內容、並編碼、分割
$fpfile = fopen($file, "r");
$read = fread($fpfile, filesize($file));
$read = base64_encode($read);
$read = chunk_split($read);
----------------------*/


/*-----------------
#獲得文件的類型
if ($file_type){
$mimeType = $file_type;
}
else {$mimeType = "application/unknown";}
--------------------*/


[火星人 ] 也談用Socket發送電子郵件已經有271次圍觀

http://coctec.com/docs/program/show-post-72420.html