2016-09-06 69 views
1

我使用JavaMail和SMTP(Gmail的),这里是我的代码:必须发出STARTTLS命令的第一个Java

import java.util.Properties;  
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class Email {  
    Properties emailProperties; 
    Session mailSession; 
    MimeMessage emailMessage; 

    public static void main(String args[]) throws AddressException, 
      MessagingException { 

     Email javaEmail = new Email(); 

     javaEmail.setMailServerProperties(); 
     javaEmail.createEmailMessage(); 
     javaEmail.sendEmail(); 
    } 

    public void setMailServerProperties() { 

     String emailPort = "587";//gmail's smtp port 

     emailProperties = System.getProperties(); 
     emailProperties.put("mail.smtp.port", emailPort); 
     emailProperties.put("mail.smtp.auth", "true"); 
     emailProperties.put("mail.smtp.starttls.enable", "true"); 

    } 

    public void createEmailMessage() throws AddressException, 
      MessagingException { 
     String[] toEmails = { "[email protected]" }; 
     String emailSubject = "Java Email"; 
     String emailBody = "This is an email sent by JavaMail api."; 

     mailSession = Session.getDefaultInstance(emailProperties, null); 
     emailMessage = new MimeMessage(mailSession); 

     for (int i = 0; i < toEmails.length; i++) { 
      emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i])); 
     } 

     emailMessage.setSubject(emailSubject); 
     emailMessage.setContent(emailBody, "text/html");//for a html email 
     //emailMessage.setText(emailBody);// for a text email 

    } 

    public void sendEmail() throws AddressException, MessagingException { 

     String emailHost = "smtp.gmail.com"; 
     String fromUser = "yourusername";//just the id alone without @gmail.com 
     String fromUserEmailPassword = "your_password"; 

     Transport transport = mailSession.getTransport("smtp"); 

     transport.connect(emailHost, fromUser, fromUserEmailPassword); 
     transport.sendMessage(emailMessage, emailMessage.getAllRecipients()); 
     transport.close(); 
     System.out.println("Email sent successfully."); 
    } 

} 

错误消息:

Exception in thread "main" javax.mail.MessagingException: 530 5.7.0 
Must issue a STARTTLS command first. n80sm23847952pfi.25 - gsmtp 
    at 
com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1020) 
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:716) 
    at 
com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:388) 
    at com.mail.Email.sendEmail(Email.java:68) at 
com.mail.Email.main(Email.java:26) 

回答

0

你能尝试改变这一行:

Transport t = session.getTransport("smtps"); 

您必须提供所需的相应用户名和密码通过 您的邮件服务器。请注意,您可以将协议更改为“smtps”,以 通过SSL建立安全连接。 。

完整的信息在这里: - *罐子http://www.oracle.com/technetwork/java/javamail/faq/index.html#gmail

+0

是的,我给一个有效的用户名和密码。在更改该行后出现以下错误:线程“main”中出现异常“javax.mail.NoSuchProviderException:没有提供smtps \t at javax.mail.Session.getProvider(Session.java:436) \t at javax.mail .Session.getTransport(Session.java:631) \t在javax.mail.Session.getTransport(Session.java:612) \t在com.mail.Email.sendEmail(Email.java:65) \t在COM。 mail.Email.main(Email.java:26) –

+0

听起来像这样的问题:http://stackoverflow.com/questions/2980408/java-mail-no-provider-for-smtp –

+0

支持jar:mail.jar和activation.jar存在于我的类路径中。 –

0

在我而言,当我使用IBM-是上述问题的发生。当我将jar切换到javax.mail-version.jar(版本是1.5.5这样的数字)时,它得到了解决。

相关问题