使用javaMail发送带附件的邮件,附件添加代码如下:
BodyPart messagebodyPart = new MimeBodyPart();
messagebodyPart.setContent( this.getContent(), "text/html;charset=gb2312" );
FileDataSource fileDataSource = new FileDataSource( new File( ‘这里是附件的路径’ ) );
messagebodyPart.setDataHandler( new DataHandler( fileDataSource ) );
//解决附件的中文名称显示问题
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
messagebodyPart.setFileName( "=?GBK?B?" + enc.encode( ‘附件名称’.getBytes() ) + "?=" );
multipart.addBodyPart( messagebodyPart );

这段代码网上到处都是,如果不做任何修改运行这段代码,添加的附件如果文件名称超出一定的长度,收到的邮件附件名称后半部分将被截取,导致文件没有格式后缀而打不开。

       比如:我的附件名称为  ”测试邮件附件名称长度问题处理名称必须足够长否则看不到效果.doc“

               上面那段代码接收到的附件就会是被截取的  ”测试邮件附件名称长度问题处理名称

               收到的附件是没有格式后缀的,文件肯定是有问题的

原因是 sun.misc.BASE64Encoder这个编码工具在对文件名称进行编码时,超出长度会添加换行标记 '\n'和'\r',而javaMail加载附件时是不支持换行标记的,所以只要对编码后的文件名称字符串进行字符替换操作就可以解决问题

我的代码如下:

//加入附件
               BodyPart messagebodyPart = new MimeBodyPart();
               messagebodyPart.setContent( this.getContent(), "text/html;charset=gb2312" );
               FileDataSource fileDataSource = new FileDataSource( new File( this.p_w_uploadPath ) );
               messagebodyPart.setDataHandler( new DataHandler( fileDataSource ) );
               //解决附件的中文名称显示问题,英文名可直接用messageBodyAttach.setFileName( p_w_uploadTitle );
               sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
               //解决附件名字超长度问题
               //messagebodyPart.setFileName( "=?GBK?B?" + enc.encode( this.getFilename().getBytes() ) + "?=" );
               String fileName ="=?GBK?B?"+ enc.encode( this.getFilename().getBytes() )+"?=";
               fileName=fileName.replaceAll("\r","").replaceAll("\n","");
               messagebodyPart.setFileName(fileName);