javaMail发邮件的例子和碰到的问题

来源:互联网 发布:java计算两个时间差 编辑:程序博客网 时间:2024/05/04 17:15

1、邮件服务器的反垃圾邮件功能使信件无法发出。

下面的代码在早些时间是可用的(JavaMail version 1.3.3)。
try {
    Properties props = new Properties(); //也可用Properties props = System.getProperties();
    String mailHost = "mail.zqu.edu.cn";
    props.put("mail.smtp.host", mailHost); //存储发送邮件服务器的信息

    //props.put("mail.smtp.auth", "true"); //身份验证

    Session s = Session.getDefaultInstance(props, null); //根据属性新建一个邮件会话
    s.setDebug(true);

    MimeMessage message = new MimeMessage(s); //由邮件会话新建一个消息对象

    //设置邮件
    //从html表单中获取邮件信息
    String from = request.getParameter("from"); // 从表单中获取
    String to = "james@zqu.edu.cn";
    String subject = request.getParameter("subject"); //设置主题
    String content = request.getParameter("content"); //设置内容

    message.setFrom(new InternetAddress(from)); //设置发件人
    message.setRecipient(Message.RecipientType.TO,
      new InternetAddress(to)); //设置收件人,并设置其接收类型为TO
    message.setSubject(subject); //设置主题
    message.setText(content); //设置信件内容
    message.setSentDate(new Date()); //设置发信时间

    message.saveChanges(); //存储邮件信息

    //发送邮件
    Transport transport = s.getTransport("smtp");
    transport.connect(mailHost, "james", "password"); //在mailHost上的一个邮箱帐号
    transport.sendMessage(message, message.getAllRecipients()); //发送邮件,其中第二个参数是所有已设好的收件人地址
    transport.close();
   } catch (Exception e) {
    e.printStackTrace();
   } 

后来再运行的时候,出问题了,简单的出错信息(从完整的调试信息中抽取)如下:
================================================================
EHLO nc-james

504 5.5.2 <nc-james>: Helo command rejected: need fully-qualified hostname
DEBUG SMTP: Invalid Addresses
DEBUG SMTP:   james@zqu.edu.cn
DEBUG SMTP: Sending failed because of invalid destination addresses

javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
 class com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <nc-james>: Helo command rejected: need fully-qualified hostname
================================================================

EHLO nc-james:这个命令相当于你的机器告诉邮件服务器,我是nc-james,但是现在很多邮件服务器有反垃圾邮件功能,它只认有域名的机器(可能必须通过DNS解析),nc-james显然不是域名主机,所以导致信件无法发出。所以上面的代码要加入一行:

props.put("mail.smtp.localhost", "zqu.edu.cn"); //用163.com或其他也行

就可以了,如果不行,重启web服务器或eclipse(这个我也觉得很奇怪)。成功的调试信息中有:
EHLO zqu.edu.cn,我的机器的域名不是zqu.edu.cn,但是信件也能发出。其他的smtp服务器是不是这么好骗,就不知道了。

完整的调试信息(出错):
================================================================
DEBUG: setDebug: JavaMail version 1.3.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "mail.zqu.edu.cn", port 25, isSSL false
220 ns4.zqu.edu.cn ESMTP Postfix
DEBUG SMTP: connected to host "mail.zqu.edu.cn", port: 25

EHLO nc-james
250-ns4.zqu.edu.cn
250-PIPELINING
250-SIZE 20000000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "20000000"
DEBUG SMTP: Found extension "ETRN", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<james05y@gmail.com>
250 2.1.0 Ok
RCPT TO:<james@zqu.edu.cn>
504 5.5.2 <nc-james>: Helo command rejected: need fully-qualified hostname
DEBUG SMTP: Invalid Addresses
DEBUG SMTP:   james@zqu.edu.cn
DEBUG SMTP: Sending failed because of invalid destination addresses
RSET
250 2.0.0 Ok
javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
 class com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <nc-james>: Helo command rejected: need fully-qualified hostname

 at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1141)
 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:536)
 at org.apache.jsp.apps.sendMail_jsp._jspService(sendMail_jsp.java:232)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at english.LoginFilter.doFilter(LoginFilter.java:39)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
 at java.lang.Thread.run(Thread.java:595)
javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
 class com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <nc-james>: Helo command rejected: need fully-qualified hostname

 at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1141)
 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:536)
 at org.apache.jsp.apps.sendMail_jsp._jspService(sendMail_jsp.java:232)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at english.LoginFilter.doFilter(LoginFilter.java:39)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
 at java.lang.Thread.run(Thread.java:595)
================================================================

完整的调试信息(成功):
================================================================
DEBUG: setDebug: JavaMail version 1.3.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "mail.zqu.edu.cn", port 25, isSSL false
220 ns4.zqu.edu.cn ESMTP Postfix
DEBUG SMTP: connected to host "mail.zqu.edu.cn", port: 25

EHLO zqu.edu.cn
250-ns4.zqu.edu.cn
250-PIPELINING
250-SIZE 20000000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "20000000"
DEBUG SMTP: Found extension "ETRN", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<james05y@gmail.com>
250 2.1.0 Ok
RCPT TO:<james@zqu.edu.cn>
250 2.1.5 Ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   james@zqu.edu.cn
DATA
354 End data with <CR><LF>.<CR><LF>
Message-ID: <26596606.01180005372671.JavaMail.james@nc-james>
Date: Thu, 24 May 2007 19:16:12 +0800 (CST)
From: james05y@gmail.com
To: james@zqu.edu.cn
Subject: 1.3.3
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

test
.
250 2.0.0 Ok: queued as EFF21B2431
QUIT
================================================================

 参考:
1. 新浪新反垃圾系统说明.http://www.gobuy.com.cn/problem/problemyoujianfuwuqi/200607/6039.html.
2.Sending email using JavaMail and SSL.http://forums.devshed.com/java-help-9/sending-email-using-javamail-and-ssl-303077.html

 

原创粉丝点击