2010-04-27 219 views
0

以下代码会导致错误。请帮助我了解什么是错的。JavaMail:无法连接到SMTP服务器

import javax.mail.*; 
import javax.mail.internet.*; 
import java.util.*; 
public class SendMail 
{ 
    public static void main(String [] args)throws MessagingException 
    { 
    SendMail sm=new SendMail(); 
    sm.postMail(new String[]{"[email protected]"},"hi","hello","[email protected]"); 
    } 

public void postMail(String recipients[ ], String subject, String message , String from) throws MessagingException 
{ 
    boolean debug = false; 

    //Set the host smtp address 
    Properties props = new Properties(); 
    props.put("mail.smtp.host", "webmail.emailmyname.com"); 

    // create some properties and get the default Session 
    Session session = Session.getDefaultInstance(props, null); 
    session.setDebug(debug); 

    // create a message 
    Message msg = new MimeMessage(session); 

    // set the from and to address 
    InternetAddress addressFrom = new InternetAddress(from); 
    msg.setFrom(addressFrom); 

    InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
    for (int i = 0; i < recipients.length; i++) 
    { 
     addressTo[i] = new InternetAddress(recipients[i]); 
    } 
    msg.setRecipients(Message.RecipientType.TO, addressTo); 


    // Optional : You can also set your custom headers in the Email if you Want 
    msg.addHeader("MyHeaderName", "myHeaderValue"); 

    // Setting the Subject and Content Type 
    msg.setSubject(subject); 
    msg.setContent(message, "text/plain"); 
    Transport.send(msg); 
} 
} 

Exception: 
<pre> 
com.sun.mail.smtp.SMTPSendFailedException: 450 smtpout04.dca.untd.com Authentication required 

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829) 
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886) 
    at javax.mail.Transport.send0(Transport.java:191) 
    at javax.mail.Transport.send(Transport.java:120) 
    at SendMail.postMail(SendMail.java:52) 
    at SendMail.main(SendMail.java:10) 

+0

@javacode,请不要转贴同样的问题,如果你有什么要补充的,请更新您原来的问题。展示活动将在网站上提出您的问题,并将获得更多观众。 – 2010-04-27 19:39:41

+0

可能重复的http:// stackoverflow。com/questions/2724053/run-time-error-whats-wrong – 2010-04-27 19:40:31

+1

BAH!没有编辑! – 2010-04-27 19:45:04

回答

0

需要注意的是很多,许多ISP阻止他们的网络之外的服务器访问外部端口25。 ISP会迫使你使用他们的SMTP服务器。

如果您获得“需要验证”,您必须先输入您的用户名和密码,并至少发出一个请求,例如检查新邮件。尽管SMTP不需要发送电子邮件的用户名和密码,但许多SMTP服务器仍然通过让您登录并通过POP或IMAP检查邮件来实现此目的,然后才能发送邮件。

+0

我可以有代码吗? – user327136 2010-04-27 19:53:16

+0

我应该在哪里指定用户名和密码? – user327136 2010-04-27 19:54:54

+0

这是通过POP或IMAP完成的。 – 2010-04-27 19:56:30

1

异常消息中的“需要身份验证”表明目标SMTP服务器要求您登录(可能通过TLS或SSL)。直到几年前,这在SMTP服务器上并不常见(这是一种反垃圾邮件措施),因此很容易忽视。

authenticate with JavaMail

使用SMTP认证连接到SMTP服务器时,您需要使用用户名和密码设置mail.smtp.auth属性(见下文)或提供SMTP传输。为此,您可以使用下列方法之一:

  • 创建邮件会话时提供一个Authenticator对象,并提供身份验证回调过程中的用户名和密码信息。

    注意,mail.smtp.user属性可以设置以提供回调默认的用户名,但密码仍然需要明确地提供。

    这种方法可以让你使用静态交通运输发送方法来发送消息。

  • 呼叫传输用户名和密码参数明确连接方法。

该方法要求您显式管理传输对象并使用传输sendMessage方法发送消息。 transport.java演示程序演示了如何管理传输对象。以下是大致相当于静态交通发送方法,但提供所需的用户名和密码:

运输TR = session.getTransport(“SMTP”);

tr.connect(smtphost,username,password);

msg.saveChanges(); //不要忘记这个

tr.sendMessage(味精,msg.getAllRecipients());

tr.close();

+0

如何登录smtp服务器? – user327136 2010-04-27 19:58:09

+0

我搜索了Javadoc并粘贴了一个报价。 – 2010-04-27 22:37:27

+0

您的服务器未使用“SMTP验证”。如果使用“SMTP身份验证”,您将得到530响应,而不是450响应。如果响应为450,则服务器很可能使用“POP before SMTP”。发送邮件之前,您需要通过POP或IMAP进行连接。 – 2010-04-28 14:25:37