当前位置: 代码迷 >> Java Web开发 >> 替邮件添加附件是报Not in multipart mode - create an appropriate MimeMessageHelper via a c
  详细解决方案

替邮件添加附件是报Not in multipart mode - create an appropriate MimeMessageHelper via a c

热度:1422   发布时间:2016-04-16 21:39:00.0
为邮件添加附件是报Not in multipart mode - create an appropriate MimeMessageHelper via a c
邮件代码
package cn.pss.util.service;

import java.io.File;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

import cn.pss.util.bean.SsnMailMessage;


/**        
 * <p>app. desc: 邮件发送服务</p>
 * <p>company: redlotus </p>
 * <p>time Dec 7, 2006 </p>
 *
 * @version 1.0
 * @author blogw
 */
public class SendMailService{


protected  Map   pdto;
//protected IReader h8Reader; 
/**
 * Log
 */
private final Log log = LogFactory.getLog(getClass());
/**
 * 邮件发送人的编号
 */
private   String  eid;
/**
 * 邮件发送人的部门名称
 */
private   String  deptname;
/**
 * 邮件定义
 */
private       SsnMailMessage mailMessage ;

/**
 * 邮件发送Bean
 */
private static  JavaMailSender mailSender;
/**
 * 邮件送信地址
 */
private String to;

/**
 * 邮件标题
 */
private String subject;

/**
 * 邮件模板路径
 */
private String pp;

/**
 * 替换Velocity模版内容的数组
 */
private String[] args;

/**
 * @param mailMessage 邮件定义
 */
public void setMailMessage(SsnMailMessage mailMessage) {
this.mailMessage = mailMessage;
}

/**
 * 取得邮件信息
 * @return
 */
public SsnMailMessage getMailMessage() {
return mailMessage;
}
/**
 * @param mailSender 邮件发送Bean
 */
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}

/**
 *<p>desc: 送信</p>
 */
public  void   sendmail() {

try{
log.info("send mail thread start....");
String encode= mailMessage.getEncode();
String subject=(this.subject!=null?this.subject:mailMessage.getSubject());
String templete=mailMessage.getTemplete();
String prefix=mailMessage.getPrefix();
String from=mailMessage.getFrom();
         MimeMessage message = mailSender.createMimeMessage(); 
         MimeMessageHelper messageHelp = new MimeMessageHelper(message,encode); 
         //velocity create mail context
         VelocityContext context = new VelocityContext();
         StringWriter sw = new StringWriter();
         for(int i=0;i<args.length;i++){
                context.put(prefix+(i+1), args[i]);
         }
//         VelocityEngine velocity=velocityConfig.getVelocityEngine();
         //初始化参数
            Properties properties=new Properties();
            //设置velocity资源加载方式为file
            properties.setProperty("resource.loader", "file");
            String path = this.getClass().getResource("/").toString().replaceAll("^file:/", "");
            path = path.substring(0, path.length()-1);
            System.out.println(pp);
            properties.setProperty("file.resource.loader.path", path.substring(0,path.lastIndexOf("/"))+pp);
            //设置velocity资源加载方式为file时的处理类
            properties.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
            //实例化一个VelocityEngine对象
            VelocityEngine velocity=new VelocityEngine(properties);
         velocity.mergeTemplate(templete, encode, context, sw);
         messageHelp.setTo(to); 
         messageHelp.setFrom(from);
         messageHelp.setSubject(subject);
         messageHelp.setText(sw.toString(), true); 
         FileSystemResource img=new FileSystemResource(new File("d:\\2009824172729.rar"));
         messageHelp.addAttachment(MimeUtility.encodeWord("测试是否乱码"), img);
         mailSender.send(message);
            log.info("send mail thread end....");
        }
        catch(Exception ex) {
         ex.printStackTrace();
         if(eid!=null){
         Map  dt = new HashMap();
dt.put("eid",eid);
dt.put("deptname", deptname);
if(pdto.get("database")!=null){
//DbContextHolder.setDbType((String)pdto.get("database"));
}
//h8Reader.insert("Role.adderrorsend", dt);
         ex.printStackTrace();
         System.out.println("邮箱发送失败!");
         log.error(ex);
         }
        }
}

/**
 * @param to 邮件送信地址
 * @param args 替换Velocity模版内容的数组
 * @return 
 * @return true|false
 */
public synchronized boolean send(String to,String[] args,String  pp,String subject,String  eid,String  deptname,Map  pdto){
log.debug("/////////////////////////////////////" + args[0]);
log.debug("/////////////////////////////////////" + to);
this.to=to; 
this.args=args; 
this.pp=pp;
this.subject=subject;
this.eid=eid;
this.deptname=deptname;
//this.h8Reader=h8Reader;
this.pdto=pdto;
try{
this.sendmail();
}
catch(Exception e){
log.error(e);
e.printStackTrace();
return false;
}
return true;
}
}


报错信息

java.lang.IllegalStateException: Not in multipart mode - create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag if you need to set alternative texts or add inline elements or attachments.
at org.springframework.mail.javamail.MimeMessageHelper.checkMultipart(MimeMessageHelper.java:383)
at org.springframework.mail.javamail.MimeMessageHelper.getRootMimeMultipart(MimeMessageHelper.java:400)
at org.springframework.mail.javamail.MimeMessageHelper.addAttachment(MimeMessageHelper.java:998)
at org.springframework.mail.javamail.MimeMessageHelper.addAttachment(MimeMessageHelper.java:1077)
at org.springframework.mail.javamail.MimeMessageHelper.addAttachment(MimeMessageHelper.java:1047)
at cn.pss.util.service.SendMailService.sendmail(SendMailService.java:136)
at cn.pss.util.service.SendMailService.send(SendMailService.java:175)
at cn.pss.util.MyThreadSendEmail.run(MyThreadSendEmail.java:33)
at java.lang.Thread.run(Thread.java:619)


求高人指点
------解决思路----------------------
 /**
 372:     * Return whether this helper is in multipart mode,
 373:     * i.e. whether it holds a multipart message.
 374:     * @see #MimeMessageHelper(MimeMessage, boolean)
 375:     */
 376:       public final boolean isMultipart() {
 377:        return (this.rootMimeMultipart != null);
 378:    }
 379:
 380:    /**
 381:     * Throw an IllegalStateException if this helper is not in multipart mode.
 382:     */
 383:       private void checkMultipart() throws IllegalStateException {
 384:           if (!isMultipart()) {
 385:            throw new IllegalStateException("Not in multipart mode - " +
 386:                "create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag " +
 387:                "if you need to set alternative texts or add inline elements or attachments.");
 388:        }
 389:    }
 390:

------解决思路----------------------
你这样写只能发送文本邮件
参考用javamail发送带附件的邮件 
------解决思路----------------------
你这样写是不能发送带附件的邮件的
JavaMail发送邮件(带附件)(
  相关解决方案