JavaMail收取文本邮件

import  javax.mail.Store;
import  javax.mail. * ;
import  java.io.BufferedReader;
import  java.io.InputStreamReader;
import  java.io. * ;
/**
 * 
 * <p>Title: JavaMail</p> 
 * <p>Description:收取邮件 </p> 
 * <p>Copyright: Copyright (c) 2005</p> 
 * 
@author  Derek.G
 * 
@version  1.0
 * 收取邮件:
    1.获取一个会话;
    2.获取并连接邮箱所在的存储器(Store对象),打开该用户的邮箱;
    3.获取所希望阅读的消息;
    4.关闭目录和连接。
 
*/
public   class  ReadMail  extends  MailProcessBase{
 
// 初始化主机
  String host = " pop3.usish.com " ;
  String username
= " derek_g " ;
  String password
= " 12140827 " ;
  
public  ReadMail()  throws  Exception {
    
super ();
  }

  
public   void  readMail(){
  
try  {
    
// 获取Store对象,使用POP3协议,也可能使用IMAP
    System.out.println( " 获取Store对象 " );
    Store store 
=  mailSession.getStore( " pop3 " );
    
// 连接到邮件服务器
    System.out.println( " 连接到邮件服务器 " );
    store.connect(host, username, password);
    
// 获取该用户Folder对象,并以只读方式打开
    System.out.println( " 获取该用户Folder对象 " );
    Folder folder 
=  store.getFolder( " INBOX " );
    folder.open(Folder.READ_ONLY);
    
// 检索所有邮件,按需填充
    System.out.println( " 检索所有邮件 " );
    Message message[] 
=  folder.getMessages();
    
// 遍历每一个邮件
    System.out.println( " 遍历每一个邮件 " );
    BufferedReader reader 
=   new  BufferedReader( new  InputStreamReader(System.in));
    
for  ( int  i  =   0 , n  =  message.length; i  <  n; i ++ ) {
      
// 打印每个邮件的发件人和主题
      System.out.println(i  +   " "   +  message[i].getFrom()[ 0 +   " \t "   +
                         message[i].getSubject());
      
// 是否读取该消息
      System.out.println( " 是否读取消息内容? "   +   " [YES读取 / QUIT结束] " );
      String line 
=  reader.readLine();
      FileOutputStream fos 
=   new  FileOutputStream( " c:\\mail.txt " );
      
if (line.equals( " YES " )) {
        message[i].writeTo(fos);
// 这种方式只能显示文本消息
        System.out.println(message[i].getContent());
      }
        
else   break ;
    }
    System.out.println(
" 收取邮件完毕! " );
    folder.close(
false );
    store.close();
  }
  
catch  (NoSuchProviderException ex) {ex.printStackTrace();}
  
catch  (MessagingException ex) {ex.printStackTrace();}
  
catch  (IOException ex) { ex.printStackTrace(); }

  }
  
public   static   void  main(String[] args) {
  
try  {
    
new  ReadMail().readMail();
  }
  
catch  (Exception ex) {ex.printStackTrace(); }
  }
}
### 解决 JavaMail POP3 接收邮件中文乱码问题 当使用JavaMail API通过POP3协议接收电子邮件时,可能会遇到字符编码不匹配导致的中文乱码问题。为了确保接收到的邮件能够正确显示中文内容,需要采取一些措施来处理字符集转换。 #### 设置正确的字符编码 在读取邮件内容之前,应该先尝试检测并设置合适的字符编码方式。通常情况下,默认采用UTF-8作为通用字符集可以有效减少乱码现象的发生。对于特定情况下的GBK或GB2312编码,则需特别指定: ```java // 获取消息体内容 Object content = message.getContent(); if (content instanceof String) { // 如果是字符串形式的消息体,则重新按照utf-8解码 byte[] bytes = ((String) content).getBytes("ISO-8859-1"); String decodedContent = new String(bytes, "UTF-8"); // 或者试用 "GBK", "GB2312" } else if (content instanceof Multipart){ // 对于多部分邮件,遍历各个子部件进行相同操作... } ``` #### 处理MimeMessage中的文本内容 针对包含HTML或者富文本格式的邮件,在解析这些类型的邮件内容时也需要考虑其内部可能存在的不同编码声明。可以通过`setText()`方法为每个BodyPart设定恰当的内容类型和编码参数[^4]: ```java MimeMultipart multipart = (MimeMultipart)message.getContent(); for(int i=0;i<multipart.getCount();i++){ BodyPart bodyPart=multipart.getBodyPart(i); if(bodyPart.isMimeType("text/plain")){ Object o = bodyPart.getContent(); if(o instanceof String){ String s=(String)o; System.out.println(s); } // 设定文本内容及其编码 bodyPart.setText(decodedText,"UTF-8"); } else if(bodyPart.isMimeType("text/html")) { // 同样地调整html内容的编码 bodyPart.setContent(decodedHtml,"text/html;charset=UTF-8"); } } ``` #### 调整Session属性配置 另外一种常见的做法是在创建会话实例时就定义好默认使用的字符集,这样可以在一定程度上简化后续的操作流程。例如,在初始化`Properties`对象时加入如下设置[^2]: ```properties props.put("mail.mime.charset","UTF-8"); ``` 以上就是解决JavaMail POP3收取邮件过程中可能出现的中文乱码的一些常见策略和技术细节说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值