JAVA寄信問題「HELO requires domain address」的解決方法
當我利用VirtualBox架設虛擬機器時,會發現沒辦法正常地使用註冊信的功能。這是因為虛擬機器內部的domain name並不是其他domain name server認可的名稱,只是我測試用的名字。此時可以自行在伺服器當中新增此domain name,對應到127.0.0.1,也就是本機端,就可以解決此問題。
以下詳述這個問題的發生與解決過程。
虛擬機器中DSpace的郵件設定
##### Email settings ###### # SMTP mail server mail.server = 127.0.0.1 # SMTP mail server authentication username and password (if required) # mail.server.username = myusername # mail.server.password = mypassword # SMTP mail server alternate port (defaults to 25) mail.server.port = 25 # From address for mail mail.from.address = dspace-noreply@dspace-dlll.nccu.edu.tw # Currently limited to one recipient! feedback.recipient = dspace-help@dspace-dlll.nccu.edu.tw # General site administration (Webmaster) e-mail mail.admin = dspace-help@dspace-dlll.nccu.edu.tw
必須說明到,上述設定當中的「dspace-dlll.nccu.edu.tw」完全沒有註冊在任何domain name server當中。因此執行時就會發生錯誤。
認不出domain name的錯誤訊息
在此設定當中進入DSpace的使用者註冊時,就會發生錯誤。我們來到DSpace的記錄檔當中看看,預設位置在「[dspace]/log/dspace.log」,可以用文字編輯器來開啟。
錯誤訊息如下:
2009-10-02 23:58:27,828 INFO org.dspace.app.webui.servlet.RegisterServlet @ anonymous:session_id=29633B32BF10EEEF95FCF4DC71B5C7FD:ip_addr=10.0.2.2:sendtoken_register:email=puddingchen.35@gmail.com 2009-10-02 23:58:30,669 INFO org.dspace.app.webui.servlet.RegisterServlet @ anonymous:session_id=29633B32BF10EEEF95FCF4DC71B5C7FD:ip_addr=10.0.2.2:error_emailing:email=puddingchen.35@gmail.com javax.mail.MessagingException: 501 5.0.0 HELO requires domain address at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363) at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375) at javax.mail.Service.connect(Service.java:275) at javax.mail.Service.connect(Service.java:156) at javax.mail.Service.connect(Service.java:105) at javax.mail.Transport.send0(Transport.java:168) at javax.mail.Transport.send(Transport.java:98) at org.dspace.core.Email.send(Email.java:362) at org.dspace.eperson.AccountManager.sendEmail(AccountManager.java:296) at org.dspace.eperson.AccountManager.sendInfo(AccountManager.java:256) at org.dspace.eperson.AccountManager.sendRegistrationInfo(AccountManager.java:101) at org.dspace.app.webui.servlet.RegisterServlet.processEnterEmail(RegisterServlet.java:287) at org.dspace.app.webui.servlet.RegisterServlet.doDSPost(RegisterServlet.java:202) at org.dspace.app.webui.servlet.DSpaceServlet.processRequest(DSpaceServlet.java:147) at org.dspace.app.webui.servlet.DSpaceServlet.doPost(DSpaceServlet.java:105) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619)
你可能會發現到IP很奇怪,因為這是VirtualBox配給的內部IP。
這段記錄的重點在於錯誤訊息「HELO requires domain address」,代表的意思是HELO認不出來「dspace-dlll.nccu.edu.tw」對應到哪台主機。
設定伺服器當中的domain name對照表
用指令列來修改「/etc/hosts」,增加下列設定:
127.0.0.1 dspace-dlll.nccu.edu.tw dspace-dlll
然後得重新啟動網路,指令是「/etc/init.d/network restart」
或著你也可以用圖形介面來設定。
先進入「網路」當中。
切換到「主機」那一頁,然後按「新增」。
設定位址、要對應的主機名稱跟其別名。
最後記得要儲存才會生效。
以上,大功告成。用虛擬機器果然是比較麻煩了一些,不過也可以藉此在精進網路知識就是了。