當有個功能要發送通知郵件時 , 大家都會去用PHPMailer來呼叫第三方的smtp發信 , 經常遇到莫名其妙的錯誤 ,不知道是什么原因 .
今天我也遇到了這種問題 , 在發信時一直都是false , 找了半天
這個類別庫最侄訓是拼接的smtp協議 , 與我們自己手動telnet然后 auth login ,mail from 等是一樣的 , 但是我們不知道他最終拼成的smtp協議究竟是什么樣的 , 所以不知道原因
需要使用strace命令來查看類別庫究竟發送和接收到了什么 ?
可以這樣使用 strace -e sendto,recvfrom -s 1024000 php testmail.php
-e是過濾引數的意思 , 只列印 sendto和recvfrom的資訊 , -s是資料的長度 ,寫長一點 ,得到以下結果
sendto(3, "EHLO localhost.localdomain\r\n", 28, MSG_DONTWAIT, NULL, 0) = 28
recvfrom(3, "220 smtp-30-235.smtpsmail.email.yf.sinanode.com ESMTP\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 55
sendto(3, "HELO localhost.localdomain\r\n", 28, MSG_DONTWAIT, NULL, 0) = 28
recvfrom(3, "250-smtp-30-235.smtpsmail.email.yf.sinanode.com\r\n250-AUTH LOGIN PLAIN\r\n250-AUTH=LOGIN PLAIN\r\n250-STARTTLS\r\n250 8BITMIME\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 121
sendto(3, "AUTH LOGIN\r\n", 12, MSG_DONTWAIT, NULL, 0) = 12
recvfrom(3, "250 smtp-30-235.smtpsmail.email.yf.sinanode.com\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 49
sendto(3, "bm90aWNlaQHaNpbmEubmV0\r\n", 22, MSG_DONTWAIT, NULL, 0) = 22
recvfrom(3, "334 VXNlcm5hbWU6\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 18
sendto(3, "dG9uZ3paoaV8yMDMa5NDRfMQ==\r\n", 26, MSG_DONTWAIT, NULL, 0) = 26
recvfrom(3, "334 UGFzc3dvcamQ6\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 18
sendto(3, "MAIL FROM:<[email protected]>\r\n", 29, MSG_DONTWAIT, NULL, 0) = 29
recvfrom(3, "235 OK Authenticated\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 22
The following From address failed: [email protected]
看到這么一段資訊 , 里面清楚的標出了sendto發出去的資料 和recvfrom識訓來的資料 , 經過對比class.smtp.php 代碼
最終發現是在新浪企郵的smtp回傳資訊 與其他免費郵箱的smtp資訊 多幾行 , 而類別庫還是按照他自己的邏輯只讀取了一行記錄 , 因此很多地方就對不上了 , 錯位了
把smtp代碼里 讀取回傳資料的地方對應好 , 他切分前三個數字作為回傳碼進行判斷 ,有些也判斷的不對 , 多對應一下改一改原始碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/77605.html
標籤:PHP
下一篇:求助: 現在有兩個串列, 找出串列1中不在串列2內的資料, 已知兩個串列資料量都很大. 串列2已按字串長度倒序.
