2016-09-06 48 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這樣的數字)時,它得到了解決。

相關問題