2013-09-03 8 views
2

이메일을 보내려고합니다. 첨부 파일없이 보내면 전자 메일이 올바르게 전송됩니다. 첨부하려고하면 작동하지 않습니다. Javamail, 첨부 파일을 보낼 때 오류가 발생했습니다.

더 클래스 :

import com.sun.mail.smtp.SMTPTransport; 

import java.io.File; 
import java.security.Security; 
import java.util.Date; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.FileDataSource; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Part; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
import javax.swing.JOptionPane; 

/** 
* 
* @author doraemon 
*/ 
public class GoogleMail { 
    public static void Send(String from, String pass, String[] to, String assunto, String mensagem, File[] anexos) { 
     String host = "smtp.risantaisabel.com.br"; 
     Properties props = System.getProperties(); 
     props.put("mail.smtp.starttls.enable", "true"); // added this line 
     props.put("mail.smtp.host", host); 
     props.put("mail.smtp.user", from); 
     props.put("mail.smtp.password", pass); 
     props.put("mail.smtp.port", "587"); 
     props.put("mail.smtp.auth", "true"); 

     //String[] to = {"[email protected]"}; // added this line 

     Session session = Session.getDefaultInstance(props, null); 
     MimeMessage message = new MimeMessage(session); 
     try { 
      message.setFrom(new InternetAddress(from)); 
     } catch (AddressException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     InternetAddress[] toAddress = new InternetAddress[to.length]; 
     boolean enviado = true; 
     // To get the array of addresses 
     for(int i=0; i < to.length; i++) { // changed from a while loop 
      try { 
       toAddress[i] = new InternetAddress(to[i]); 
      } catch (AddressException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     // System.out.println(Message.RecipientType.TO); 

     for(int i=0; i < toAddress.length; i++) { // changed from a while loop 
      try { 
       message.addRecipient(Message.RecipientType.TO, toAddress[i]); 
      } catch (MessagingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     try { 
      message.setSubject(assunto); 
      //message.setContent(mensagem, "text/plain"); 
      message.setText(mensagem); 
      Transport transport = session.getTransport("smtp"); 
      transport.connect(host, from, pass); 

      if(anexos.length == 0){ 
      } 
      else { 
       Multipart mp = new MimeMultipart();   
       BodyPart messageBodyPart = new MimeBodyPart(); 

       for(int i = 0; i < anexos.length;i++) { 
        MimeBodyPart mbp2 = new MimeBodyPart();  

        FileDataSource fds = new FileDataSource(anexos[i].getPath()); 

        mbp2.setDataHandler(new DataHandler(fds));   
        mbp2.setFileName(fds.getName());  

        mp.addBodyPart(mbp2); 
       } 
       messageBodyPart.setContent(message, "multipart/mixed"); 
       mp.addBodyPart(messageBodyPart); 
       message.setContent(mp); 
      } 
      transport.sendMessage(message, message.getAllRecipients()); 
      transport.close(); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      JOptionPane.showMessageDialog(null, "<html><b>Email não enviado, tente novamente confirmando seus dados"); 
      enviado = false; 
      e.printStackTrace(); 
     } 
     if(enviado) { 
      JOptionPane.showMessageDialog(null, "<html><b>Email enviado.</html></b> \n\n Caso tenha digitado errado o email, somente pela sua caixa de entrada poderá confirmar se chegou. \n\n<html> Email da parte digitado:<b><font size = 3 COLOR=#ff0000> " + to[0]); 
     } 
    } 
} 

I 일반/텍스트로하여의 setContent를 변경하는 경우, 내가 얻을 : 나는 다중 부분/혼합하는의 setContent를 변경하는 경우

javax.mail.MessagingException: IOException while sending message; 
nested exception is: 
java.io.IOException: "text/html" DataContentHandler requires String object, was given object of type class javax.mail.internet.MimeMessage 
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1167) 

, 내가 얻을 :

javax.mail.MessagingException: MIME part of type "multipart/mixed" contains object of type javax.mail.internet.MimeMessage instead of MimeMultipart 

어떻게 해결할 수 있습니까? 감사.

답변

4

변경

messageBodyPart.setContent(message, "multipart/mixed"); 

messageBodyPart.setText(mensagem); 

message.setText(mensagem); 

제거하고와 "에 대한"루프 위의 다음 줄을 이동합니다.

또한 his JavaMail FAQ entry of common mistakes을 참조하십시오.

1

이제 JMS API를 사용하여 첨부 파일과 본문 내용이 포함 된 메일을 보낼 수 있습니다. 여러 첨부 파일을 첨부하는 데 효과적입니다.

final String fromAddress = formBean.getString ("fromEmail"); final String password = "password";

Properties props = new Properties(); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.port", "465"); 
    props.put("mail.transport.protocol", "smtp"); 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

    Session session = Session.getInstance(props, new javax.mail.Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(fromAddress, formBean.getString(password)); 
     } 
    }); 
    Transport transport = null; 

    try { 
     transport = session.getTransport(); 
     Message message = new MimeMessage(session); 
     String messageBody = "<div style=\"color:red;\">" + formBean.getString("mailBody") + "</div>"; 
     message.setSentDate(new Date()); 

     message.setSubject(formBean.getString("subject")); 
     // message.setContent(mensagem, "text/plain"); 

     Multipart mp = new MimeMultipart(); 
     BodyPart messageBodyPart = new MimeBodyPart(); 

     String[] filesNameArray=new String[]{"C:\\Users\\karola\\Desktop\\context.xml","C:\\Users\\karola\\Desktop\\site.xml"}; 

     for(String fileToAttached:filesNameArray){ 
      MimeBodyPart mbp2 = new MimeBodyPart(); 
      FileDataSource fds = new FileDataSource(new File(fileToAttached)); 
      mbp2.setDataHandler(new DataHandler(fds)); 
      mbp2.setFileName(fds.getName()); 
      mp.addBodyPart(mbp2); 
     } 

     messageBodyPart.setText(messageBody); 
     mp.addBodyPart(messageBodyPart); 
     message.setContent(mp); 

     transport.connect(); 
     message.setReplyTo(InternetAddress.parse(formBean.getString("replyTo"))); 
     Transport.send(message, InternetAddress.parse(formBean.getString("toAddress"))); 
     // message(RecipientType.TO, 
     // InternetAddress.parse(formBean.getString("toAddress"))); 
     // transport.sendMessage(message, message.getAllRecipients()); 
     transport.close();