使用JavaMail收发邮件,解决了中文附件名问题

时间:2021-10-09 18:08:51

 

 使用 JavaMail 收发邮件只需要下载两个开源的 jar 文件,感谢“我心依旧”在“深入浅出JavaMail”中提供的这两个jar文件的下载链接,我在这里引用了:
  mail.jar  : http://java.sun.com/products/javamail/index.html 并添加到classpath即可.

  activation.jar: http://java.sun.com/products/javabeans/glasgow/jaf.html 并添加到
  classpath即可. 
 
 

下面是发送邮件SendMail.java(含附件)代码:

使用JavaMail收发邮件,解决了中文附件名问题//SendMail.java
使用JavaMail收发邮件,解决了中文附件名问题
import javax.mail.*;
使用JavaMail收发邮件,解决了中文附件名问题
import javax.mail.internet.*;
使用JavaMail收发邮件,解决了中文附件名问题
import java.util.*;
使用JavaMail收发邮件,解决了中文附件名问题
import javax.activation.*;
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题
public class SendMail {
使用JavaMail收发邮件,解决了中文附件名问题    
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题    
public static void send(String customMailBoxAddress,String username,String password,String serverMailBoxAddress,String subject,String attachmentPath,String attachmentName) {
使用JavaMail收发邮件,解决了中文附件名问题        
//这里面使用新浪作为发送邮件的邮件服务器,其他的smtp服务器可以到相关网站上查到。
使用JavaMail收发邮件,解决了中文附件名问题
        String host = "smtp.sina.com.cn";
使用JavaMail收发邮件,解决了中文附件名问题        
//发送方邮箱地址(如BlogJava2006@blog.com.cn.)
使用JavaMail收发邮件,解决了中文附件名问题
        String from = customMailBoxAddress;
使用JavaMail收发邮件,解决了中文附件名问题        
//收件人邮箱地址
使用JavaMail收发邮件,解决了中文附件名问题
        String to = serverMailBoxAddress;
使用JavaMail收发邮件,解决了中文附件名问题        
//发送者的邮箱用户名
使用JavaMail收发邮件,解决了中文附件名问题
        String user = username;
使用JavaMail收发邮件,解决了中文附件名问题        
//发送者的邮箱密码
使用JavaMail收发邮件,解决了中文附件名问题
        String ps = password;
使用JavaMail收发邮件,解决了中文附件名问题        
使用JavaMail收发邮件,解决了中文附件名问题        Properties props 
= new Properties();
使用JavaMail收发邮件,解决了中文附件名问题        
使用JavaMail收发邮件,解决了中文附件名问题        
//设置发送邮件的邮件服务器的属性(这里使用新浪的smtp服务器)
使用JavaMail收发邮件,解决了中文附件名问题
        props.put("mail.smtp.host", host);
使用JavaMail收发邮件,解决了中文附件名问题        
//需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有//这一条)
使用JavaMail收发邮件,解决了中文附件名问题
        props.put("mail.smtp.auth""true");
使用JavaMail收发邮件,解决了中文附件名问题        
使用JavaMail收发邮件,解决了中文附件名问题        
//用刚刚设置好的props对象构建一个session
使用JavaMail收发邮件,解决了中文附件名问题
        Session session = Session.getDefaultInstance(props);
使用JavaMail收发邮件,解决了中文附件名问题        
使用JavaMail收发邮件,解决了中文附件名问题        
//有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
使用JavaMail收发邮件,解决了中文附件名问题        
//用(有的时候网络连通性不够好,发送邮件可能会有延迟,在这里面会有所//提示,所以最好是加上这句,避免盲目的等待)
使用JavaMail收发邮件,解决了中文附件名问题
        session.setDebug(true);
使用JavaMail收发邮件,解决了中文附件名问题        
使用JavaMail收发邮件,解决了中文附件名问题        
//定义消息对象
使用JavaMail收发邮件,解决了中文附件名问题
        MimeMessage message = new MimeMessage(session);
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题        
try{
使用JavaMail收发邮件,解决了中文附件名问题            message.setFrom(
new InternetAddress(from));
使用JavaMail收发邮件,解决了中文附件名问题            message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
使用JavaMail收发邮件,解决了中文附件名问题            message.setSubject(subject);
使用JavaMail收发邮件,解决了中文附件名问题            
使用JavaMail收发邮件,解决了中文附件名问题            
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
使用JavaMail收发邮件,解决了中文附件名问题
            Multipart multipart = new MimeMultipart();
使用JavaMail收发邮件,解决了中文附件名问题            
//设置邮件的文本内容
使用JavaMail收发邮件,解决了中文附件名问题
            BodyPart contentPart = new MimeBodyPart();
使用JavaMail收发邮件,解决了中文附件名问题            contentPart.setText(
"邮件的具体内容在此");
使用JavaMail收发邮件,解决了中文附件名问题            multipart. addBodyPart(contentPart);
使用JavaMail收发邮件,解决了中文附件名问题            
//添加附件
使用JavaMail收发邮件,解决了中文附件名问题
            BodyPart attachmentPart= new MimeBodyPart();
使用JavaMail收发邮件,解决了中文附件名问题            DataSource source 
= new FileDataSource(attachmentPath);
使用JavaMail收发邮件,解决了中文附件名问题            attachmentPart.setDataHandler(
new DataHandler(source));
使用JavaMail收发邮件,解决了中文附件名问题            
//注意:下面定义的enc对象用来处理中文附件名,否则名称是中文的附//件在邮箱里面显示的会是乱码,
使用JavaMail收发邮件,解决了中文附件名问题
            sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
使用JavaMail收发邮件,解决了中文附件名问题            messageBodyPart.setFileName(
"=?GBK?B?"+enc.encode(attachmentName.getBytes())+"?=");
使用JavaMail收发邮件,解决了中文附件名问题            multipart.addBodyPart(messageBodyPart);
使用JavaMail收发邮件,解决了中文附件名问题            
使用JavaMail收发邮件,解决了中文附件名问题            
//将multipart对象放到message中
使用JavaMail收发邮件,解决了中文附件名问题
            message.setContent(multipart);
使用JavaMail收发邮件,解决了中文附件名问题            
//发送邮件
使用JavaMail收发邮件,解决了中文附件名问题
            message.saveChanges();
使用JavaMail收发邮件,解决了中文附件名问题            Transport transport 
= session.getTransport("smtp");
使用JavaMail收发邮件,解决了中文附件名问题            transport.connect(host, username, password);
使用JavaMail收发邮件,解决了中文附件名问题            transport.sendMessage(message, message.getAllRecipients());
使用JavaMail收发邮件,解决了中文附件名问题            transport.close();
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题        }
catch(Exception e){
使用JavaMail收发邮件,解决了中文附件名问题            e.printStackTrace();
使用JavaMail收发邮件,解决了中文附件名问题        }

使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题}

 

 

ReceiveMail.java代码如下:

使用JavaMail收发邮件,解决了中文附件名问题import javax.mail.*;
使用JavaMail收发邮件,解决了中文附件名问题
import java.util.*;
使用JavaMail收发邮件,解决了中文附件名问题
import java.io.*;
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题
public class ReceiveMail {
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题    
//处理任何一种邮件都需要的方法
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题
    private void handle(Message msg) throws Exception {
使用JavaMail收发邮件,解决了中文附件名问题        System.out.println(
"邮件主题:" + msg.getSubject());
使用JavaMail收发邮件,解决了中文附件名问题        System.out.println(
"邮件作者:" + msg.getFrom()[0].toString());
使用JavaMail收发邮件,解决了中文附件名问题        System.out.println(
"发送日期:" + msg.getSentDate());
使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题    
//处理文本邮件
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题
    private void handleText(Message msg) throws Exception {
使用JavaMail收发邮件,解决了中文附件名问题        
this.handle(msg);
使用JavaMail收发邮件,解决了中文附件名问题        System.out.println(
"邮件内容:"+msg.getContent());
使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题    
//处理Multipart邮件,包括了保存附件的功能
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题
    private static void handleMultipart(Message msg) throws Exception {
使用JavaMail收发邮件,解决了中文附件名问题        String disposition;
使用JavaMail收发邮件,解决了中文附件名问题        BodyPart part;
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题        Multipart mp 
= (Multipart) msg.getContent();
使用JavaMail收发邮件,解决了中文附件名问题        
//Miltipart的数量,用于除了多个part,比如多个附件
使用JavaMail收发邮件,解决了中文附件名问题
        int mpCount = mp.getCount();
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题        
for (int m = 0; m < mpCount; m++{
使用JavaMail收发邮件,解决了中文附件名问题            
this.handle(msg);
使用JavaMail收发邮件,解决了中文附件名问题            part 
= mp.getBodyPart(m);
使用JavaMail收发邮件,解决了中文附件名问题            disposition 
= part.getDisposition();
使用JavaMail收发邮件,解决了中文附件名问题            
//判断是否有附件
使用JavaMail收发邮件,解决了中文附件名问题
            if (disposition != null && disposition.equals(Part.ATTACHMENT))
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题            
{
使用JavaMail收发邮件,解决了中文附件名问题                
//这个方法负责保存附件
使用JavaMail收发邮件,解决了中文附件名问题
                saveAttach(part);
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题            }
 else {
使用JavaMail收发邮件,解决了中文附件名问题                
//不是附件,就只显示文本内容
使用JavaMail收发邮件,解决了中文附件名问题
                System.out.println(part.getContent());
使用JavaMail收发邮件,解决了中文附件名问题            }

使用JavaMail收发邮件,解决了中文附件名问题        }

使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题    
private static void saveAttach(BodyPart part) throws Exception {
使用JavaMail收发邮件,解决了中文附件名问题        
//得到未经处理的附件名字
使用JavaMail收发邮件,解决了中文附件名问题
        String temp = part.getFileName();
使用JavaMail收发邮件,解决了中文附件名问题        
//除去发送邮件时,对中文附件名编码的头和尾,得到正确的附件名
使用JavaMail收发邮件,解决了中文附件名问题        
//(请参考发送邮件程序SendMail的附件名编码部分)
使用JavaMail收发邮件,解决了中文附件名问题
        String s = temp.substring(8, temp.indexOf("?="));
使用JavaMail收发邮件,解决了中文附件名问题        
//文件名经过了base64编码,下面是解码
使用JavaMail收发邮件,解决了中文附件名问题
        String fileName = base64Decoder(s);
使用JavaMail收发邮件,解决了中文附件名问题        System.out.println(
"有附件:" + fileName);
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题        InputStream in 
= part.getInputStream();
使用JavaMail收发邮件,解决了中文附件名问题        FileOutputStream writer 
= new FileOutputStream(new File(
使用JavaMail收发邮件,解决了中文附件名问题                
"保存附件的本地路径"+ "/"+fileName));
使用JavaMail收发邮件,解决了中文附件名问题        
byte[] content = new byte[255];
使用JavaMail收发邮件,解决了中文附件名问题        
int read = 0;
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题        
while ((read = in.read(content)) != -1{
使用JavaMail收发邮件,解决了中文附件名问题            writer.write(content);
使用JavaMail收发邮件,解决了中文附件名问题        }

使用JavaMail收发邮件,解决了中文附件名问题        writer.close();
使用JavaMail收发邮件,解决了中文附件名问题        in.close();
使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题    
//base64解码
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题
    private static String base64Decoder(String s) throws Exception {
使用JavaMail收发邮件,解决了中文附件名问题        sun.misc.BASE64Decoder decoder 
= new sun.misc.BASE64Decoder();
使用JavaMail收发邮件,解决了中文附件名问题        
byte[] b = decoder.decodeBuffer(s);
使用JavaMail收发邮件,解决了中文附件名问题        
return (new String(b));
使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题    
public static void receive(String receiverMailBoxAddress, String username,String password) {
使用JavaMail收发邮件,解决了中文附件名问题        
//本人用的是yahoo邮箱,故接受邮件使用yahoo的pop3邮件服务器
使用JavaMail收发邮件,解决了中文附件名问题
        String host = "pop.mail.yahoo.com.cn";
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题        
try {
使用JavaMail收发邮件,解决了中文附件名问题            
//连接到邮件服务器并获得邮件
使用JavaMail收发邮件,解决了中文附件名问题
            Properties prop = new Properties();
使用JavaMail收发邮件,解决了中文附件名问题            prop.put(
"mail.pop3.host", host);
使用JavaMail收发邮件,解决了中文附件名问题            Session session 
= Session.getDefaultInstance(prop);
使用JavaMail收发邮件,解决了中文附件名问题            Store store 
= session.getStore("pop3");
使用JavaMail收发邮件,解决了中文附件名问题            store.connect(host, username, password);
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题            Folder inbox 
= store.getDefaultFolder().getFolder("INBOX");
使用JavaMail收发邮件,解决了中文附件名问题            
//设置inbox对象属性为可读写,这样可以控制在读完邮件后直接删除该附件
使用JavaMail收发邮件,解决了中文附件名问题
            inbox.open(Folder.READ_WRITE);
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题            Message[] msg 
= inbox.getMessages();
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题            FetchProfile profile 
= new FetchProfile();
使用JavaMail收发邮件,解决了中文附件名问题            profile.add(FetchProfile.Item.ENVELOPE);
使用JavaMail收发邮件,解决了中文附件名问题            inbox.fetch(msg, profile);
使用JavaMail收发邮件,解决了中文附件名问题
使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题            
for (int i = 0; i < msg.length; i++{
使用JavaMail收发邮件,解决了中文附件名问题                
//标记此邮件的flag标志对象的DELETED位为true,可以在读完邮件后直接删除该附件,具体执行时间是在调用
使用JavaMail收发邮件,解决了中文附件名问题                
//inbox.close()方法的时候
使用JavaMail收发邮件,解决了中文附件名问题
                msg[i].setFlag(Flags.Flag.DELETED, true);
使用JavaMail收发邮件,解决了中文附件名问题                handleMultipart(msg[i]);
使用JavaMail收发邮件,解决了中文附件名问题                System.out.println(
"****************************");
使用JavaMail收发邮件,解决了中文附件名问题            }

使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题            
if (inbox != null{
使用JavaMail收发邮件,解决了中文附件名问题                
//参数为true表明阅读完此邮件后将其删除,更多的属性请参考mail.jar的API
使用JavaMail收发邮件,解决了中文附件名问题
                inbox.close(true);
使用JavaMail收发邮件,解决了中文附件名问题            }

使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题            
if (store != null{
使用JavaMail收发邮件,解决了中文附件名问题                store.close();
使用JavaMail收发邮件,解决了中文附件名问题            }

使用JavaMail收发邮件,解决了中文附件名问题使用JavaMail收发邮件,解决了中文附件名问题        }
 catch (Exception e) {
使用JavaMail收发邮件,解决了中文附件名问题            e.printStackTrace();
使用JavaMail收发邮件,解决了中文附件名问题        }

使用JavaMail收发邮件,解决了中文附件名问题    }

使用JavaMail收发邮件,解决了中文附件名问题}