台灣最大程式設計社群網站
線上人數
1754
 
會員總數:245912
討論主題:189503
歡迎您免費加入會員
討論區列表 >> Linux / Unix >> 為什麼使用php mail()無法寄送信件
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
為什麼使用php mail()無法寄送信件
價值 : 15 QP  點閱數:7362 回應數:22
樓主

Yu
門外漢
0 4
88 17
發送站內信

請問我Linux主機有裝sendmail
在終端指令使用mail可以收發信件,也可以寄到hotmail gmail這些信箱
修改mail.rc也可以使用外部信箱收發信件

在php上使用mail()為什麼信件都無法寄出去?
那台Linux主機沒有申請網域,只有ip,沒辦法測收信
使用pear測試 SMTP設置外部信箱 也是無法寄出 顯示...
Failed to connect to 203.64.215.25:25 [SMTP: Failed to connect socket: Permission denied (code: -1, response: )]
username , password都有設了!!
我用mail外部信箱 smtp也是設置這個ip位址卻可以正常寄送
到底問題出在哪邊 卡了好久

本篇文章發表於2012-10-10 15:47
1樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
http://www.cc.tpcu.edu.tw/ezfiles/25/1025/img/91/email_manual_120326.pdf

看起來是所謂的POP before SMTP

找找關鍵字:PHP POP before SMTP
http://phpmailer.worxware.com/index.php?pg=examplebpop




怪怪,一個很單純的東西,怎麼會搞到這麼麻煩...
所以,Log都完全沒在看的?
本篇文章回覆於2012-10-12 23:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
忘了問
sendmail.cf有沒有設定過了??
本篇文章回覆於2012-10-12 23:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Yu
檢舉此回應
要使用POP before SMTP
是不是得移除sendmail改用postfix+POP before SMTP
我看到幾篇教學文都是寫postfix+POP before SMTP

sendmail.cf當然有設定
不然終端mail指令應該也無法寄信了吧

Log檔我有看,但是很多都有看沒有懂
mail是檢查maillog吧?
我看近期的Log裡面出現了很多這串訊息
Oct 11 10:02:34 fun sendmail[4261]: NOQUEUE: SYSERR(apache): can not chdir(/var/spool/clientmqueue/): Permission denied
本篇文章回覆於2012-10-15 00:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
學校主機的POP Before SMTP機制跟你的主機有啥關聯? Orz
跟你的程式有關啊~~~~~~~~~~~~~~~~是你的程式要先對該主機做POP3的動作,再做SMTP的動作...
(題外話,POP Before SMTP,Sendmail也可以用啊,我在某公司架的Mail server就是...)


SYSERR(apache): can not chdir(/var/spool/clientmqueue/): Permission denied
表示apache這個帳號,無權限進入/var/spool/clientmqueue/
等於無法發信...(信件會先在這個目錄佇列等候發送)

http://www.linuxquestions.org/questions/linux-software-2/php-mail-problem-w-sendmail-361209/
似乎是SELinux作祟?(那是個我一灌起來就remove掉的東西,因為我很懶 Orz)
本篇文章回覆於2012-10-15 10:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Yu
檢舉此回應
其實我對這些東西都不認識,算是邊弄邊學習狀態 -_-

學校主機的POP Before SMTP機制跟你的主機有啥關聯? Orz
跟你的程式有關啊~~~~~~~~~~~~~~~~是你的程式要先對該主機做POP3的動作,再做SMTP的動作...

上面這段我有點看不太懂,我現在操作都是用遠端連上放在學校的那台linux伺服器主機操作的
php程式也是連上那台主機遠端撰寫跟測試
203.64.215.25則是學校郵件的smtp

POP Before SMTP,Sendmail1部份是不是把postfix改成sendmail就好了?

apache這個帳號,無權限進入
可我使用的是root登入操作的 也會遇上權限問題嗎 是不是哪邊的權限需要更改為apache
本篇文章回覆於2012-10-15 12:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
1.你現在弄的,是從你放在學校的主機(以下簡稱A),發信,信件會透過學校的SMTP主機(以下簡稱B)發信至一般的Internet吧?
2.還是,只是單純要從A直接發信到Internet?

1的話,一般POP Before SMTP的機制是,某台遠端主機有成功對[目標主機]做了POP3的動作,所以[目標主機]會暫時允許遠端主機做發信Relay,
所以sendmail.cf要設定Relay主機為B主機,php.ini卻是要設定為Localhost
所以,跟你主機有沒有架POP before SMTP無關

2的話,應該不太需要啥設定,頂多是IP反解,hostname,Anti spam relay一類的
但是php在本機上mail()卻無法寄信,是不是你php.ini已經先改成學校的SMTP主機了?
你要不要先改回localhost試試?
本篇文章回覆於2012-10-16 10:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Yu
檢舉此回應
我算是1
從家裡電腦遠端A主機,從A主機指定B學校SMTP測試發信

sendmail.cf部份 我是照著教學要修改的地方去修改的

其他部分沒有動到 還有其他部分需要修改嗎?

php.ini smtp我是設定localhost


mail/acces部份是



203.64.216.13是A主機IP
203.64.215.25是B學校郵件IP

不知以上的東西設定上有沒有問題
本篇文章回覆於2012-10-16 16:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
sendmail.cf裡,應該有個 "Smart" relay host 的設定
http://freebsd.lab.mlc.edu.tw/mail/set_mail.shtml#smart

剩下的就是透過一些方式,定時去POP3學校SMTP Server,讓它允許你的主機寄信,透過它做Relay
本篇文章回覆於2012-10-17 18:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

Yu
檢舉此回應
我有找到"Smart" relay host
改成DS203.64.215.25
寄信部分還是不行 問題一樣...
A主機使用終端指令mail寄信收信都沒問題
A主機設定mail.rc指定B主機 然後由終端輸入指令mail一樣可以指定B主機發信
能從終端機順利收發信 指定外部寄信 sendmail部分設定應該沒問題才對呀?
自己寫簡單php mail()測試每次都是跳出Failed to connect to 203.64.215.25:25
目前只是單純想從PHP網頁程式中去指定外部信箱幫我寄信而已(比如網站管理員要寄發信件或是讓系統自動寄信)
我不拿A主機當SMTP 也暫時沒打算用A主機收發信 (因為沒有申請網域)

要怎麼檢查自己主機是否有POP3
原本要照著那篇教學中的方式裝POP3 結果發現那台主機沒裝FreeBSD
也沒有make.conf 這些東西都是必備的嗎?
本篇文章回覆於2012-10-18 17:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
你沒申請Domain只是收不了信,卻不代表你不能用你自己的主機寄信啊~~~~~
POP3...你又不是用你的主機當POP3 Server,裝它做啥? :Q
本篇文章回覆於2012-10-18 18:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

Yu
檢舉此回應
那回歸原本的問題
單純要讓放在A主機伺服器的PHP程式能夠順利寄信
該怎麼解決呢
本篇文章回覆於2012-10-18 22:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
很簡單,通常就什麼事都不用做...
php.ini有設定在localhost,
sendmail"沒有"設Smart Relay就好

有錯誤訊息,請再看一下maillog,到底寫了啥
本篇文章回覆於2012-10-18 23:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

Yu
檢舉此回應
php.ini有設定在localhost --> 這個我有設定
sendmail"沒有"設Smart Relay就好 --> 這是sendmail.cf的嗎 是找smart部分有沒有設到Relay?

請問錯誤訊息是看
/var/log/maillog-xxxxxxxx(日期)
還是看/var/log/maillog
今天是19號,我去執行了寄信php檔有回傳Failed to connect to 203.64.215.25:25錯誤訊息後
去/var/log/找 沒有看到產生maillog-20121019的檔案
在/var/log/maillog裡面也沒看到我13:09分執行寄信php發生錯誤而產生的訊息
抓不到問題點在哪
本篇文章回覆於2012-10-19 13:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
你乾脆先將sendmail移除掉再安裝上去
至少sendmail組態應該會回到原始設定...

apache restart,sendmail restart,都試試
本篇文章回覆於2012-10-19 20:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

Yu
檢舉此回應
我有重新裝sendmail
apache restart
sendmail restart

還是不行...
本篇文章回覆於2012-10-23 18:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.