Ⅰ javamail接收郵件怎麼解析內容
package com.ghy.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
public class PraseMimeMessage{
private MimeMessage mimeMessage=null;
private String saveAttachPath="";//附件下載後的存放目錄
private StringBuffer bodytext=new StringBuffer();
//存放郵件內容的StringBuffer對象
private String dateformat="yy-MM-ddHH:mm";//默認的日前顯示格式
/**
*構造函數,初始化一個MimeMessage對象
*/
public PraseMimeMessage() {
}
public PraseMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage=mimeMessage;
}
public void setMimeMessage(MimeMessage mimeMessage){
this.mimeMessage=mimeMessage;
}
/**
*獲得發件人的地址和姓名
*/
public String getFrom1()throws Exception{
InternetAddress address[]=(InternetAddress[])mimeMessage.getFrom();
String from=address[0].getAddress();
if(from==null){
from="";
}
String personal=address[0].getPersonal();
if(personal==null){
personal="";
}
String fromaddr=personal+"<"+from+">";
return fromaddr;
}
/**
*獲得郵件的收件人,抄送,和密送的地址和姓名,根據所傳遞的參數的不同
*"to"----收件人"cc"---抄送人地址"bcc"---密送人地址
* @throws Exception */
public String getMailAddress(String type){
String mailaddr="";
try {
String addtype=type.toUpperCase();
InternetAddress []address=null;
if(addtype.equals("TO")||addtype.equals("CC")||addtype.equals("BBC")){
if(addtype.equals("TO")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.TO);
}
else if(addtype.equals("CC")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC);
}
else{
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC);
}
if(address!=null){
for (int i = 0; i < address.length; i++) {
String email=address[i].getAddress();
if(email==null)email="";
else{
email=MimeUtility.decodeText(email);
}
String personal=address[i].getPersonal();
if(personal==null)personal="";
else{
personal=MimeUtility.decodeText(personal);
}
String compositeto=personal+"<"+email+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddr.substring(1);
}
}
else{
}
} catch (Exception e) {
// TODO: handle exception
}
return mailaddr;
}
/**
*獲得郵件主題
*/
public String getSubject()
{
String subject="";
try {
subject=MimeUtility.decodeText(mimeMessage.getSubject());
if(subject==null)subject="";
} catch (Exception e) {
// TODO: handle exception
}
return subject;
}
/**
*獲得郵件發送日期
*/
public String getSendDate()throws Exception{
Date senddate=mimeMessage.getSentDate();
SimpleDateFormat format=new SimpleDateFormat(dateformat);
return format.format(senddate);
}
/**
*解析郵件,把得到的郵件內容保存到一個StringBuffer對象中,解析郵件
*主要是根據MimeType類型的不同執行不同的操作,一步一步的解析
*/
public void getMailContent(Part part)throws Exception{
String contenttype=part.getContentType();
int nameindex=contenttype.indexOf("name");
boolean conname=false;
if(nameindex!=-1)conname=true;
if(part.isMimeType("text/plain")&&!conname){
bodytext.append((String)part.getContent());
}else if(part.isMimeType("text/html")&&!conname){
bodytext.append((String)part.getContent());
}
else if(part.isMimeType("multipart/*")){
Multipart multipart=(Multipart)part.getContent();
int counts=multipart.getCount();
for(int i=0;i<counts;i++){
getMailContent(multipart.getBodyPart(i));
}
}else if(part.isMimeType("message/rfc822")){
getMailContent((Part)part.getContent());
}
else{}
}
/**
*獲得郵件正文內容
*/
public String getBodyText(){
return bodytext.toString();
}
/**
*判斷此郵件是否需要回執,如果需要回執返回"true",否則返回"false"
* @throws MessagingException */
public boolean getReplySign() throws MessagingException{
boolean replysign=false;
String needreply[]=mimeMessage.getHeader("Disposition-Notification-To");
if(needreply!=null){
replysign=true;
}
return replysign;
}
/**
*獲得此郵件的Message-ID
* @throws MessagingException */
public String getMessageId() throws MessagingException{
return mimeMessage.getMessageID();
}
/**
*【判斷此郵件是否已讀,如果未讀返回返回false,反之返回true】
* @throws MessagingException */
public boolean isNew() throws MessagingException{
boolean isnew =false;
Flags flags=((Message)mimeMessage).getFlags();
Flags.Flag[]flag=flags.getSystemFlags();
for (int i = 0; i < flag.length; i++) {
if(flag[i]==Flags.Flag.SEEN){
isnew=true;
break;
}
}
return isnew;
}
/**
*判斷此郵件是否包含附件
* @throws MessagingException */
public boolean isContainAttach(Part part) throws Exception{
boolean attachflag=false;
String contentType=part.getContentType();
if(part.isMimeType("multipart/*")){
Multipart mp=(Multipart)part.getContent();
//獲取附件名稱可能包含多個附件
for(int j=0;j<mp.getCount();j++){
BodyPart mpart=mp.getBodyPart(j);
String disposition=mpart.getDescription();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
attachflag=true;
}else if(mpart.isMimeType("multipart/*")){
attachflag=isContainAttach((Part)mpart);
}else{
String contype=mpart.getContentType();
if(contype.toLowerCase().indexOf("application")!=-1) attachflag=true;
if(contype.toLowerCase().indexOf("name")!=-1) attachflag=true;
}
}
}else if(part.isMimeType("message/rfc822")){
attachflag=isContainAttach((Part)part.getContent());
}
return attachflag;
}
/**
*【保存附件】
* @throws Exception
* @throws IOException
* @throws MessagingException
* @throws Exception */
public void saveAttachMent(Part part) throws Exception {
String fileName="";
if(part.isMimeType("multipart/*")){
Multipart mp=(Multipart)part.getContent();
for(int j=0;j<mp.getCount();j++){
BodyPart mpart=mp.getBodyPart(j);
String disposition=mpart.getDescription();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
fileName=mpart.getFileName();
if(fileName.toLowerCase().indexOf("GBK")!=-1){
fileName=MimeUtility.decodeText(fileName);
}
saveFile(fileName,mpart.getInputStream());
}
else if(mpart.isMimeType("multipart/*")){
fileName=mpart.getFileName();
}
else{
fileName=mpart.getFileName();
if((fileName!=null)){
fileName=MimeUtility.decodeText(fileName);
saveFile(fileName,mpart.getInputStream());
}
}
}
}
else if(part.isMimeType("message/rfc822")){
saveAttachMent((Part)part.getContent());
}
}
/**
*【設置附件存放路徑】
*/
public void setAttachPath(String attachpath){
this.saveAttachPath=attachpath;
}
/**
*【設置日期顯示格式】
*/
public void setDateFormat(String format){
this.dateformat=format;
}
/**
*【獲得附件存放路徑】
*/
public String getAttachPath()
{
return saveAttachPath;
}
/**
*【真正的保存附件到指定目錄里】
*/
private void saveFile(String fileName,InputStream in)throws Exception{
String osName=System.getProperty("os.name");
String storedir=getAttachPath();
String separator="";
if(osName==null)osName="";
if(osName.toLowerCase().indexOf("win")!=-1){
//如果是window 操作系統
separator="/";
if(storedir==null||storedir.equals(""))storedir="c:\tmp";
}
else{
//如果是其他的系統
separator="/";
storedir="/tmp";
}
File strorefile=new File(storedir+separator+fileName);
BufferedOutputStream bos=null;
BufferedInputStream bis=null;
try {
bos=new BufferedOutputStream(new FileOutputStream(strorefile));
bis=new BufferedInputStream(in);
int c;
while((c=bis.read())!=-1){
bos.write(c);
bos.flush();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
bos.close();
bis.close();
}
}
/**
*PraseMimeMessage類測試
* @throws Exception */
public static void main(String[] args) throws Exception {
String host="pop3.sina.com.cn";
String username="guohuaiyong70345";
String password="071120";
Properties props=new Properties();
Session session=Session.getDefaultInstance(props,null);
Store store=session.getStore("pop3");
store.connect(host,username,password);
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
PraseMimeMessage pmm=null;
for (int i = 0; i < message.length; i++) {
System.out.println("****************************************第"+(i+1)+"封郵件**********************************");
pmm=new PraseMimeMessage((MimeMessage)message[i]);
System.out.println("主題 :"+pmm.getSubject());
pmm.setDateFormat("yy年MM月dd日 HH:mm");
System.out.println("發送時間 :"+pmm.getSendDate());
System.out.println("是否回執 :"+pmm.getReplySign());
System.out.println("是否包含附件 :"+pmm.isContainAttach((Part)message[i]));
System.out.println("發件人 :"+pmm.getFrom1());
System.out.println("收件人 :"+pmm.getMailAddress("TO"));
System.out.println("抄送地址 :"+pmm.getMailAddress("CC"));
System.out.println("密送地址 :"+pmm.getMailAddress("BCC"));
System.out.println("郵件ID :"+i+":"+pmm.getMessageId());
pmm.getMailContent((Part)message[i]); //根據內容的不同解析郵件
pmm.setAttachPath("c:/tmp/mail"); //設置郵件附件的保存路徑
pmm.saveAttachMent((Part)message[i]); //保存附件
System.out.println("郵件正文 :"+pmm.getBodyText());
System.out.println("*********************************第"+(i+1)+"封郵件結束*************************************");
}
}
}
Ⅱ java email怎麼獲取收件箱已發送已刪除中的郵件 csdn
其實刪除郵件很簡單,在接收郵件的基礎上對需要刪除的郵件做一個標記(Flags類),然後程序就會對有做了標記的郵件進行刪除。
在Flags類的內部類Flag中預定義了一些標志:
Flags.Flag.ANSWERED
Flags.Flag.DELETED (刪除的標記,這一講我們就要用到這個標記)
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER
刪除郵件:message[i].setFlag(Flags.Flag.DELETED, true);
講到這里我想大家都已經想到刪除一封郵件的程序到底怎樣寫了。
不過有一點要注意的,上一講我們打開Folder的時候是用READ_ONLY,當然讀文件用READ_ONLY是做夠的,但是我要這一講要做的操作時刪除文件,READ_ONLY是沒有刪除郵件的許可權,所以我們要改為READ_WRITE。
如果要檢查某個郵件是否標記了Flags.Flag.DELETED,可以使用message[i].isSet(Flags.Flag DELETED)
注意:這個刪除操作是將郵件徹底刪除的,大家要謹慎使用,務必讀懂代碼再進行操作。不小心刪除了重要的郵件,小弟不負責人哦,(*^__^*) 嘻嘻……
這個只是一個很簡單的刪除郵件,在現實中我們會考慮到刪除郵件後會將郵件移動另外一個目錄下(如已刪除、垃圾箱),這些功能我會在後面會講!
給個例子大家參考:
import Java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
public class DelMail {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
//取得pop3協議的郵件伺服器
Store store = session.getStore("pop3");
//連接pop.qq.com郵件伺服器
store.connect("pop.qq.com", "[email protected]", "******");
//返回文件夾對象
Folder folder = store.getFolder("INBOX");
//設置讀寫
folder.open(Folder.READ_WRITE);
//獲取信息
Message message[] = folder.getMessages();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i<message.length; i++) {
System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject());
System.out.println("Do you want to delete message? [YES to delete]");
String line = br.readLine();
if(line.equals("YES")) {
//設置刪除標記
message[i].setFlag(Flags.Flag.DELETED, true);
}
}
folder.close(true);
store.close();
}
}
程序最後folder.close(true)執行了才會生效!
Ⅲ java 接收郵件附件亂碼
imeUtility.encodeWord是進行編碼,MimeUtility.encodeWord是進行解碼
無論附件中文件是什麼樣的字元,都可以進行正確的解碼,但是當文件都是英文
文字的時候卻會包錯,為null,英文這個時候不支持全英文,所以這個時候應該:
if(!part_FileName.endsWith("?=")) //是全英文
{
直接賦值
}
else
{
MimeUtility.decodeWord(文件名字);
}
messageBodyPart.setFileName(MimeUtility.encodeWord(fileName));
同樣收中文附件時,以MimeUtility.decodeWord()將編碼後的字元串解碼。
字元編碼及字元集轉換問題
前面提到MIME要解決的另外一個問題就是將SMTP協議不支持的位元組流轉換成
為SMTP 協議支持的位元組流。比如我們要通過郵件傳輸一個附件文檔,該附件文檔就
是一個8bit 位元組流,如果簡單的直接通過SMTP 發送,其最高位信息將被丟失。MIME
規定可以用兩種編碼方式將8bit 的位元組流編碼成為低於8bit 的位元組流,它們分別是
BASE64 編碼(BASE64 將8bit 位元組流編碼成6bit 位元組流)和QP 編碼。這兩種編碼
方式同樣應用在對中文的編碼上。例如如果郵件中文題目叫做「CVS 介紹」,那麼其
編碼後的形式可能為:
Subject: =?gb2312?B?Q1ZTLS3QpMX0LnBwdA==?=
標題字元串以」=?」開始,以」?=」結束。」gb2312」表示字元串的字元集,而以」?」分
隔的」B」就表示此字元串的編碼方式為BASE64。我們處理此標題時就要先將BASE64
編碼的6bit 位元組流轉換為原來的8bit 位元組流,再根據字元集」gb2312」轉換為Java 中的
String 類型。這里可以簡單的使用JavaMail 提供的MimeUtility.decodeWord()靜態方法
將編碼後的字元串解碼。
文章出處:http://www.diybl.com/course/3_program/java/javashl/20071118/86782.html
Ⅳ Java收發郵件過程中具體的功能是怎麼實現的
1.SMTP協議
用戶連上郵件伺服器後,要想給它發送一封電子郵件,需要遵循一定的通迅規則,SMTP協議就是用於定義這種通訊規則的。
因而,通常我們也把處理用戶smtp請求(郵件發送請求)的郵件伺服器稱之為SMTP伺服器。(25)
2.POP3協議
同樣,用戶若想從郵件伺服器管理的電子郵箱中接收一封電子郵件的話,他連上郵件伺服器後,也需要遵循一定的通迅格式,POP3協議用於定義這種通訊格式。
因而,通常我們也把處理用戶pop3請求(郵件接收請求)的郵件伺服器稱之為POP3伺服器。(110)
下圖用於演示兩帳戶相互發送郵件的過程
packagecn.e.dlmu.send;
importjava.util.Properties;
importjavax.activation.DataHandler;
importjavax.activation.FileDataSource;
importjavax.mail.Message;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
importjavax.mail.internet.MimeUtility;
publicclassSendMail{
publicstaticvoidmain(String[]args)throwsException{
Propertiesprop=newProperties();
//連接的郵件伺服器的主機名
prop.setProperty("mail.smtp.host","smtp.sina.com.cn");
//發送郵件的協議
prop.setProperty("mail.transport.protocol","smtp");
//是否向郵件伺服器提交認證
prop.setProperty("mail.smtp.auth","true");
//創建session
Sessionsession=Session.getInstance(prop);
session.setDebug(true);
//得到transport
Transportts=session.getTransport();
//連接郵件伺服器
ts.connect("smtp.sina.com.cn","[email protected]","xxxxx");
//發送郵件
MimeMessagemessage=createMessage(session);
ts.sendMessage(message,message.getAllRecipients());
ts.close();
}
(Sessionsession)throwsException{
MimeMessagemessage=newMimeMessage(session);
//設置郵件的基本信息
message.setFrom(newInternetAddress("[email protected]"));
message.setRecipient(Message.RecipientType.TO,newInternetAddress("[email protected]"));
message.setSubject("test");
//正文
MimeBodyParttext=newMimeBodyPart();
//設置charaset可以解決中文正文的亂碼問題,內嵌可下載的圖片
text.setContent("你好xxx,<imgsrc='c:/dog.jpg'/>測試成功!<br/><imgsrc='cid:aaa.jpg'/>","text/html;charset=gbk");
//圖片1
MimeBodyPartimage=newMimeBodyPart();
image.setDataHandler(newDataHandler(newFileDataSource("src/88.jpg")));
image.setContentID("aaa.jpg");
//附件
MimeBodyPartattach=newMimeBodyPart();
DataHandlerdh=newDataHandler(newFileDataSource("src/javamail架包.jar"));
attach.setDataHandler(dh);
//解決文件中文亂碼問題
attach.setFileName(MimeUtility.encodeText(dh.getName()));
//描述正文和圖片的關系
MimeMultipartmp=newMimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(image);
mp.setSubType("related");
//描述正文和附件
MimeMultipartmp2=newMimeMultipart();
mp2.addBodyPart(attach);
//將正文封裝為一個body
MimeBodyPartcontent=newMimeBodyPart();
content.setContent(mp);
mp2.addBodyPart(content);
mp2.setSubType("mixed");
message.setContent(mp2);
message.saveChanges();
returnmessage;
}
}
Ⅳ java實現接收郵件,mail.jar
這個異常表示有類型轉換錯誤,有個地方需要使用 javax.mail.Multipart 類型的對象,你用了 com.sun.mail.imap.IMAPInputStream 類型,所以出現了這個異常。
根據你給的有限的資料,暫時只能分析道這么多了。
Ⅵ 最近做畢業設計,想求一個java開發的郵件收發系統
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
Object o_cid=request.getParameter("cid");
Object o_sn=request.getParameter("sn");
if(null==o_cid||null==o_sn)return mapping.findForward("404");
Long cid=Long.valueOf(o_cid.toString());
String sn=String.valueOf(o_sn);
CompanyPswManage cpm=companyPswManageService.findById(cid);
if(null==cpm||!sn.equals(cpm.getSn()))return mapping.findForward("404");
request.getSession().setAttribute("cpm",cpm);
// ���ȡ���ͼƬ
String URL=null;
List<CompanyAd> listAD = new ArrayList<CompanyAd>();
// A��
listAD = companyAdService.findCompanyAdByType("A", 1);
if(listAD!=null&&listAD.size()>0){
URL=listAD.get(0).getUrl();
request.getSession().setAttribute("A_url", URL);
request.getSession().setAttribute("A_cid", listAD.get(0).getCid());
}else{
request.getSession().setAttribute("A_url", "");
request.getSession().setAttribute("A_cid", 0);
}
// B��
listAD = companyAdService.findCompanyAdByType("B", 1);
if(listAD!=null&&listAD.size()>0){
URL=listAD.get(0).getUrl();
request.getSession().setAttribute("B_url", URL);
request.getSession().setAttribute("B_cid", listAD.get(0).getCid());
}else{
request.getSession().setAttribute("B_url", "");
request.getSession().setAttribute("B_cid", 0);
}
// C��(���ȡ6��)
listAD = companyAdService.findCompanyAdByType("C", 6);
request.getSession().setAttribute("C_list",listAD);
// D��(ȡ8��)
listAD = companyAdService.findCompanyAdByType("D", 8);
request.getSession().setAttribute("D_list", listAD);
List<CompanyProfile> cplist = new ArrayList<CompanyProfile>();
if(listAD!=null&&listAD.size()>0){
//ȡ��˾
for(int i=0;i<listAD.size();i++){
Long ccid = listAD.get(i).getCid();
CompanyProfile cp = companyProfileService.findById(ccid);
cplist.add(cp);
}
request.getSession().setAttribute("cplist",cplist);
}
// E��
listAD = companyAdService.findCompanyAdByType("E", 1);
request.getSession().setAttribute("E_list", listAD);
return mapping.findForward("pswRetakeConfirm");
}
public void setCompanyPswManageService(
ICompanyPswManageService companyPswManageService) {
this.companyPswManageService = companyPswManageService;
}
}
public class CompanyPswManageService implements ICompanyPswManageService {
private ICompanyPswManageDAO companyPswManageDao;
public void setCompanyPswManageDao(ICompanyPswManageDAO companyPswManageDao) {
this.companyPswManageDao = companyPswManageDao;
}
public boolean save(CompanyPswManage transientInstance){
return companyPswManageDao.save(transientInstance);
}
public boolean delete(CompanyPswManage persistentInstance){
return companyPswManageDao.delete(persistentInstance);
}
public CompanyPswManage findById(java.lang.Long id){
return companyPswManageDao.findById(id);
}
}
Ⅶ JAVA怎麼獲取郵件內容
給你一個參考,很詳細,你只需要對照看下獲取郵件內容的那部分就可以了。
http://blog.csdn.net/xyang81/article/details/7675160
Ⅷ javamail接收郵件報錯
使用pop3j協議嘗試以下,看可能好使不
這個報錯是認證失敗了,可能用戶名密碼出錯。
認證失敗,還可能是連續的訪問,被郵件伺服器拒絕了,過一會在嘗試。
QQ郵箱 POP3 和 SMTP 伺服器地址設置如下:
POP3伺服器(埠110)pop.qq.com
SMTP伺服器(埠25) smtp.qq.com
SMTP伺服器需要身份驗證。
如果是設置POP3和SMTP的SSL加密方式,則埠如下:
imap伺服器(埠993)
POP3伺服器(埠995)
SMTP伺服器(埠465或587)。
Ⅸ 因為需求,我需要用java mail實現接收郵件
1步中,pop,是整個郵件下載的
2步中,可以存儲於後台
3步中,用戶點擊,查看完整的郵件
一、根據用戶的點擊、選擇
二、java mail有類,去解釋整個郵件
Ⅹ java怎麼連接exchange收發郵件
找 exchange 的 JAVA介面
~
~
~