2017-10-14 130 views
0

我是java郵件API的新用戶。我正試圖發送不同的PDF到不同的電子郵件ID。這裏的電子郵件ID和文件路徑是 取自一個Excel文件使用ArrayList,由另一個 類返回。但是附件文件在收件人郵件上已經損壞。我 已經檢查了有關堆棧溢出相關 這個問題的所有問題和答案,但是沒有任何結果。請幫幫我。給我編寫的程序我有 。請幫幫我。我使用Java郵件API發送不同的PDF到Excel文件中的不同郵件,在收件人郵件上遭到破壞?

package emailsending; 

import java.util.ArrayList; 
import java.util.Properties; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.mail.Message; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

public class Email { 

    String username; 
    String password; 
    String excelFileName; 
    String result = null; 
    String filename, status; 
    ArrayList email; 

    byte[] buf = {}; 
    ArrayList list_filename; 
    public Email(String username, String password, String excelFileName) { 
     this.username = username; 
     this.password = password; 
     this.excelFileName = excelFileName; 
     excelReading er = new excelReading(excelFileName); 
     ArrayList li = er.email_file(); 
     email = (ArrayList) li.get(0); 
     list_filename = (ArrayList) li.get(1); 
    } 

    public Email() { 

    } 

    public String sendToAll() { 
     try { 
      Properties props = System.getProperties(); 
      props.put("mail.smtp.starttls.enable", "true"); 
      props.setProperty("mail.transport.protocol", "smtp"); 
      props.setProperty("mail.host", "smtp.gmail.com"); 
      props.put("mail.smtp.port", "465"); 
      props.put("mail.smtp.SocketFactory.port", "465"); 
      props.put("mail.smtp.SocketFactory.class", "javax.net.ssl.ssLSocketFactory"); 
      System.err.println("Properties set----"); 

      Session session = Session.getDefaultInstance(props); 
      session.setDebug(false); 

      MimeMessage message = new MimeMessage(session); 
      message.setFrom(new InternetAddress(username)); 
      message.setSubject("Client Receipt"); 
      //1. First body part 
      MimeBodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText("This is your receipt"); 

      MimeMultipart multipart = new MimeMultipart(); 

      MimeBodyPart fileBodyPart = new MimeBodyPart(); 
      for (int i = 0; i < email.size(); i++) { 
       status = "Sending first mail:-" + email.get(i); 
       System.err.println(status); 
       message.setRecipients(Message.RecipientType.TO, 
         InternetAddress.parse(((String) email.get(i)).trim())); 
       filename = ((String) list_filename.get(i)).trim(); 
       DataSource source = new FileDataSource(filename); 
       DataHandler lDataHandler = new DataHandler(source); 

       fileBodyPart.setDataHandler(lDataHandler); 
       fileBodyPart.setFileName(filename); 

       multipart.addBodyPart(fileBodyPart); 
       multipart.addBodyPart(messageBodyPart); 

       message.setContent(multipart); 

       Transport transport = session.getTransport("smtps"); 
       transport.connect("smtp.gmail.com", username, password); 
       transport.sendMessage(message, message.getAllRecipients()); 
       result = "Sucessfully sent Email"; 
      } 
     } catch (Exception ex) { 
      result = "Unable to send Email" + ex.getMessage(); 
      System.out.print(ex); 
     } 
     return result; 
    } 
} 

回答

0

JavaMail的嘗試選擇基於所述附件的內容的附件正確的編碼。在極少數情況下,某些文件(如pdf文件)看起來像純文本文件,但實際上包含二進制數據,導致JavaMail選擇錯誤的編碼。嘗試使用MimeBodyPart method that allows you to specify the encoding,並使用「base64」編碼。如果這不能解決問題,我們將需要更多關於接收文件如何「損壞」的詳細信息。

+0

我已經嘗試過您的建議,但它仍然無法正常工作。我已經嘗試過的標題: ** fileBodyPart.setDataHandler(lDataHandler); fileBodyPart.setFileName(lDataHandler.getName()); fileBodyPart.setHeader(「Content-Type」,「multipart/mixed」); fileBodyPart.setHeader(「Content-Transfer-Encoding」,「base64」); multipart.addBodyPart(fileBodyPart); multipart.addBodyPart(messageBodyPart); ** –

+0

您是否添加了所有這些標題,或者您是否按照我的建議進行了操作?如果它還沒有工作,我需要更多的細節。 –

相關問題