简体   繁体   中英

Setting Multipart for email that has attachment

From my application i am send mails that has attachments. the complete code is here

public int sendMail(MailDraft mailDraftInstance, mailInstance, path){                               //Send the mail
    String mailSubject  = mailDraftInstance.subject
    String toAddress    = mailDraftInstance.toAddress
    String ccAddress    = mailDraftInstance.ccAddress
    String bccAddress   = mailDraftInstance.bccAddress
    String fromAddress  = mailDraftInstance.fromAddress
    String body         = mailDraftInstance.body

    String smtpUsername = 'myusername'
    String smtpPassword = 'mypwd'

    /*** set the SMTP properties and Authenticate*****/
    Properties smtpMailProperties
    Session mailSession
    smtpMailProperties = mailInstance.getSmtpConnectionProperties()
    mailSession = mailInstance.getMailSession(smtpMailProperties, smtpUsername, smtpPassword)

    try {

        /**** Set the Header *************/
        User loggedInUser = User.get(SecurityContextHolder.context.authentication.principal.id)
        Address address = new InternetAddress(mailDraftInstance.fromAddress);
        Address replyAddress = new InternetAddress(mailDraftInstance.fromAddress);
        Message message = new MimeMessage(mailSession);
        message.setFrom(address); 
        //message.addFrom(address); //Set the from address with the logged in user email
        message.setReplyTo(replyAddress)

        /*** set Recipients*********/
        String recipientType = 'TO'
        setMailRecipients(message, toAddress, recipientType, toAddressError)
        recipientType = 'CC'
        setMailRecipients(message, ccAddress, recipientType, ccAddressError)
        recipientType = 'BCC'
        setMailRecipients(message, bccAddress, recipientType, bccAddressError)

        message.setSubject(mailSubject);    

        Multipart multiPart = new MimeMultipart("alternative");   // Create an "Alternative" Multipart message
        // Multipart multiPart = new MimeMultipart("mixed");


        MimeBodyPart text = new MimeBodyPart();
        MimeBodyPart html = new MimeBodyPart();

        text.setText(body.replaceAll("\\<[^>]*>","").replaceAll("&nbsp;"," ").replaceAll("&amp;","&"));  //set the text/plain version
        html.setContent(Jsoup.parse(body).html(), "text/html");     //set the text/html version

        multiPart.addBodyPart(text);
        multiPart.addBodyPart(html);


        /*  // Set the Body 
        Multipart multiPart = new MimeMultipart();
        MimeBodyPart messageHtml = new MimeBodyPart();  //Create a mime body 
        messageHtml.setContent(body, "text/html");      //set the content type as HTML
        multiPart.addBodyPart(messageHtml);*/

        // Add the Attachments
        if(!mailDraftInstance.attachments.isEmpty()){
            Mail.attachFiles(mailDraftInstance.attachments, multiPart, path)
        }  
        int i=0;
        mailDraftInstance.attachments.each{
            i++
        }
        message.setContent(multiPart);      //set the content
        Transport.send(message);            //send the mail
    }catch (Exception e) {
        if(e instanceof AddressException){
            println "Email Recipient Address error"                             //Error with the TO Or CC Or BCC Adresss
            return addressErrorType
        }else{
            println e                                                           //Other errors, may be with the SMTP server
            println "Cannot send email as an error occurred"
            return addressErrorType
        }
    }
    return mailSentSuccessfully    //mail sent successfully
}



  public static attachFiles(def attachments, Multipart multiPart, String path){                     //Attach files
    attachments.each {

        def attachmentId = it.id
        String newFile= TrainingService.createFile(attachmentId, path)

        MimeBodyPart fileAttachmentPart = new MimeBodyPart();
        FileDataSource attachmentfile = new FileDataSource(newFile);
        fileAttachmentPart.setDataHandler(new DataHandler(attachmentfile));
        println "newFile============="+attachmentfile.getName()
        fileAttachmentPart.setFileName(attachmentfile.getName());
        multiPart.addBodyPart(fileAttachmentPart);

    }

}

if i set

  Multipart multiPart = new MimeMultipart("alternative"); 

some of the clients (yahoomail) does not receive attachments..

so should be the Multipart setting to receive email that has got both text, html and attachments?

Try this:

     public int sendMailWithSingleAttachment(String to, String subject, String body, String fileName, String sendFileName) {
    final String username = "Your Username";
    final String password = "Your Password";
    Properties props = new Properties();
    props.put("mail.smtp.user", username);
    props.put("mail.smtp.host", "smtp.live.com");
    props.put("mail.smtp.port", "25");
    props.put("mail.debug", "true");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.EnableSSL.enable", "true");
    props.setProperty("mail.smtp.port", "587");
    props.setProperty("mail.smtp.socketFactory.port", "587");
    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    });
    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(username));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSubject(subject);
        message.setText(body);
        BodyPart messageBodyPart = new MimeBodyPart();
        Multipart multipart = new MimeMultipart();
        BodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent("<html>hello</html>", "text/html");
        DataSource source = new FileDataSource(fileName);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(sendFileName);
        multipart.addBodyPart(messageBodyPart);
        multipart.addBodyPart(htmlPart);
        message.setContent(multipart);
        Transport.send(message);

        return 1;
    } catch (Exception e) {


        return 0;
    }
}

Please use the port according to your service provider, I am using outlook. The library used is java mail .

If you want a message contains both alternative parts and attachments, you need two multiparts, one nested in the other. The outer multipart should be multipart/mixed. The first body part of that multipart should be a multipart/alternative part. The second body part of the outer multipart should be the attachment. The inner multipart contains the plain text and html body parts.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM