首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

讨论JavaEmail,现在遇到了有关问题,请高手帮个忙!多谢

2012-01-08 
讨论JavaEmail,现在遇到了问题,请高手帮个忙!谢谢看了很多网上的贴子,也在Baidu上搜过.现有两个问题.一是

讨论JavaEmail,现在遇到了问题,请高手帮个忙!谢谢
看了很多网上的贴子,也在Baidu上搜过.
现有两个问题.
一是收邮件时.如果原文件带附件.那么正文部份ContentType,并不是以Text/html开头
而是以.multipart/Alternative.    
163及126都是这样,并带有   boundary= "----=_Part_76_1173198205.1187629828559 "
请问是不是除了   自行解释用   boundary进行拆分外,别无解决办法?,附件我是收下来了.但正文部分,一直收到Null


二是发邮件.老是被拒绝..
代码如下.
package   asp.email;

import   java.io.BufferedReader;
import   java.io.File;
import   java.io.FileOutputStream;
import   java.io.InputStream;
import   java.io.InputStreamReader;
import   java.util.Properties;
import   javax.mail.BodyPart;
import   javax.mail.Folder;
import   javax.mail.Message;
import   javax.mail.Multipart;
import   javax.mail.Part;
import   javax.mail.Session;
import   javax.mail.Store;
import   javax.mail.internet.ContentType;
import   javax.mail.internet.InternetAddress;
import   javax.mail.internet.MimeBodyPart;
import   asp.BaseHibernateDAO;
import   asp.cmp.Employee;
import   asp.dao.sys.EmailDAO;
import   asp.dao.sys.EmailServerDAO;

/**
  *   带口令验证的邮件接收类.
  */
public   class   EmailReceive   extends   BaseHibernateDAO   {
public   EmailReceive()   {
}

public   boolean   receive(Employee   emp,String   path)   {
EmailServerDAO   emailServerDao   =   new   EmailServerDAO();
String   emailName   =   emp.getEmpEmail();
String   emailPass   =   emp.getEmpEmailPassword();
String   popServer   =   emailServerDao.getEmailServe(emailName,   false);
System.out.println(popServer);
Store   store   =   null;
Folder   folder   =   null;
try   {
Properties   props   =   System.getProperties();
Session   session   =   Session.getDefaultInstance(props,
new   Email_autherticator(emailName,   emailPass));
store   =   session.getStore( "pop3 ");
store.connect(popServer,   null,   null);
folder   =   store.getDefaultFolder();
if   (folder   ==   null)
throw   new   Exception( "No   default   folder ");
folder   =   folder.getFolder( "INBOX ");
if   (folder   ==   null)
throw   new   Exception( "No   POP3   INBOX ");
folder.open(Folder.READ_WRITE);
Message[]   msgs   =   folder.getMessages();
if   (msgs.length   >   0)   {
for   (int   msgNum   =   0;   msgNum   <   msgs.length;   msgNum++)   {
printMessage(msgs[msgNum],   emp,   popServer,   emailName,   path);//   收邮件
//msgs[msgNum].setFlag(Flags.Flag.DELETED,   true);//   收完后,删除邮件
}
return   true;
}   else   {
return   false;
}
}   catch   (Exception   ex)   {
ex.printStackTrace();
return   false;
}   finally   {
try   {
if   (folder   !=   null)
folder.close(true);
if   (store   !=   null)
store.close();
}   catch   (Exception   ex2)   {
ex2.printStackTrace();
return   false;
}
}
}

/**
  *   "printMessage() "   打印方法.


  */
public   void   printMessage(Message   message,   Employee   emp,   String   popServer,
String   emailName,   String   mainPath)   {
try   {
String   from   =   ((InternetAddress)   message.getFrom()[0])
.getPersonal();
if   (from   ==   null)
from   =   ((InternetAddress)   message.getFrom()[0]).getAddress();//   从邮件服务器获取发件人地址
//   System.out.println( "FROM:   "   +   from);
if   (from.indexOf( "@ ")   <   0)   {
String   emailExtend   =   emailName
.substring(emailName.indexOf( "@ "));
from   =   from   +   (emailExtend);   //   如果返回没有@就把邮件服务器的后缀加上
}
asp.sys.Email   email   =   new   asp.sys.Email();   //   创建邮件对象
email.setType(1);   //   设置类型(1为收件)
email.setEmailForm(from);   //   设置发件人Email
email.setEmailTo(emp.getEmpEmail());   //   设置收件人的地址
email.setToManId( " ");   //   设置收件人的ID(也就是本身登陆用户的ID)
email.setReaded(true);//   设定邮件为未读
email.setEmpId(emp.getId());
String   subject   =   message.getSubject();   //   从邮件服务器获取邮件主题
email.setEmailTitle(subject);   //   设置邮件主题
Part   messagePart   =   message;
Object   content   =   messagePart.getContent();
if   (content   instanceof   Multipart)   //   判断是否为多部分组成文件(有无附件)
{


Multipart   mp   =   (Multipart)   message.getContent();   //   得到
//   Miltipart的数量,用于除了多个part,比如多个附件
int   mpCount   =   mp.getCount();   //   得到附件个数
System.out.println( "mpCount: "+mpCount);
String   path   =   " ";//   附件名称
for   (int   i   =   0;   i   <mpCount;   i++)   {
BodyPart   part   =   mp.getBodyPart(i);  
//   得到邮件附件部份
String   disposition   =   part.getDisposition();
//   保存附件
if   (disposition   !=   null
&&   disposition.equals(Part.ATTACHMENT))   {
//   得到未经处理的附件名字
String   temp   =   part.getFileName();
String   fileName   =   " ";
if   (temp.indexOf( "?= ")   > =   0)//   表示是中文或其它国文字的附件名
{   //   除去前11位文件的头
fileName   =   temp.substring(11,   temp.indexOf( "?= "));
//   转换
fileName   =   base64Decoder(fileName);
}   else   {
//   否则直接生成文件名
fileName   =   temp;
}
System.out.println( "有附件: "   +   fileName);
//   得到文件的扩展名
String   extendName   =   fileName.substring(fileName
.length()   -   4,   fileName.length());
String   name   =   Math.round(Math.random()   *   1000000000)
+   extendName;
path   =   path   +   "myt_youjian/emailLog/ "   +   name   +   "; ";
InputStream   in   =   part.getInputStream();
FileOutputStream   writer   =   new   FileOutputStream(
new   File(mainPath   +   "/email/emailLog/ "


+   name));
byte[]   bye   =   new   byte[255];
int   read   =   0;
while   ((read   =   in.read(bye))   !=   -1)   {
writer.write(bye);
}
writer.close();
in.close();
}   else   {
messagePart   =   mp.getBodyPart(i);
}
}
email.setEmailAddPath(path);
//   下载到服务器目录并保存下载目录到( "目录 ");
}
String   contentType   =   messagePart.getContentType();   //   邮件类型
System.out.println( "CONTENT: "   +   contentType);
System.out.println(messagePart.getContent());

if   (contentType.startsWith( "text/plain ")
||   contentType.startsWith( "text/html "))   {
InputStream   is   =   messagePart.getInputStream();
BufferedReader   reader   =   new   BufferedReader(
new   InputStreamReader(is));
String   str   =   " ";
String   thisLine   =   reader.readLine();
while   (thisLine   !=   null)   {
//   System.out.println(thisLine);
str   =   str   +   thisLine;
thisLine   =   reader.readLine();
}
System.out.println( "2222222222222 "+str);
email.setEmailContent(str);
}
else
{

}
EmailDAO   emailDao=new   EmailDAO();
emailDao.save(email);
//   System.out.println( "----------------------------- ");
}   catch   (Exception   ex)   {
ex.printStackTrace();
}
}

private   static   String   base64Decoder(String   s)   throws   Exception//   base64解码
{
sun.misc.BASE64Decoder   decoder   =   new   sun.misc.BASE64Decoder();
byte[]   b   =   decoder.decodeBuffer(s);
return   (new   String(b));
}



}




[解决办法]
1.收到带附件的都是多部分的,正文是getBodyPart( "0 ").getContent();

2.一般发信通不过是因为没有加这条props.put( "mail.smtp.auth ", "true ");

ps:你的代码我没有看,不好意思.
[解决办法]
偶也来一个..注释写的很清楚!测试没有问题的.
package com.utils;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import sun.misc.BASE64Encoder;

//import com.me.util.*;

public class sendMail {

private MimeMessage mimeMsg; // MIME邮件对象

private Session session; // 邮件会话对象

private Properties props; // 系统属性

private String username = " "; // smtp认证用户名和密码

private String password = " ";

private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象

public sendMail() {

// setSmtpHost(getConfig.mailHost);//如果没有指定邮件服务器,就从getConfig类中获取
createMimeMessage();



}

public sendMail(String smtp) {

setSmtpHost(smtp);
createMimeMessage();

}

/**
* @param hostName
* String
*/
public void setSmtpHost(String hostName) {

System.out.println( "设置系统属性:mail.smtp.host = " + hostName);
if (props == null)
props = System.getProperties(); // 获得系统属性对象

props.put( "mail.smtp.host ", hostName); // 设置SMTP主机

}

/**
* @return boolean
*/
public boolean createMimeMessage() {
try {
System.out.println( "准备获取邮件会话对象! ");
session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
}

catch (Exception e) {
System.err.println( "获取邮件会话对象时发生错误! " + e);
return false;
}

System.out.println( "准备创建MIME邮件对象! ");

try {

mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
mp = new MimeMultipart();

return true;

} catch (Exception e) {

System.err.println( "创建MIME邮件对象失败! " + e);
return false;
}
}

/**
* @param need
* boolean
*/
public void setNeedAuth(boolean need) {

System.out.println( "设置smtp身份认证:mail.smtp.auth = " + need);
if (props == null)
props = System.getProperties();

if (need) {

props.put( "mail.smtp.auth ", "true ");
} else {

props.put( "mail.smtp.auth ", "false ");
}
}

/**
* @param name
* String
* @param pass
* String
*/
public void setNamePass(String name, String pass) {
username = name;
password = pass;
}

/**
* @param mailSubject
* String
* @return boolean
*/
public boolean setSubject(String mailSubject) {
System.out.println( "设置邮件主题! ");
try {
mimeMsg.setSubject(mailSubject);
return true;
} catch (Exception e) {
System.err.println( "设置邮件主题发生错误! ");
return false;
}
}

/**
* @param mailBody
* String
*/
public boolean setBody(String mailBody) {
try {
BodyPart bp = new MimeBodyPart();
bp.setContent(
" <meta http-equiv=Content-Type content=text/html; charset=gb2312> "
+ mailBody, "text/html;charset=GB2312 ");
mp.addBodyPart(bp);

return true;
} catch (Exception e) {
System.err.println( "设置邮件正文时发生错误! " + e);
return false;
}
}

/**
* @param name
* String
* @param pass
* String
*/
public boolean addFileAffix(String filename) {

System.out.println( "增加邮件附件: " + filename);

try {
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(filename);

bp.setDataHandler(new DataHandler(fileds));
BASE64Encoder enc = new BASE64Encoder();
bp.setFileName( "=?GBK?B? "+enc.encode((fileds.getName()).getBytes())+ "?= ");
//bp.setFileName(fileds.getName());

mp.addBodyPart(bp);

return true;
} catch (Exception e) {
System.err.println( "增加邮件附件: " + filename + "发生错误! " + e);
return false;
}
}

/**
* @param name
* String


* @param pass
* String
*/
public boolean setFrom(String from) {
System.out.println( "设置发信人! ");
try {
mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
return true;
} catch (Exception e) {
return false;
}
}

/**
* @param name
* String
* @param pass
* String
*/
public boolean setTo(String to) {
if (to == null)
return false;

try {
mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
.parse(to));
return true;
} catch (Exception e) {
return false;
}

}

/**
* @param name
* String
* @param pass
* String
*/
public boolean setCopyTo(String copyto) {
if (copyto == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.CC,
(Address[]) InternetAddress.parse(copyto));
return true;
} catch (Exception e) {
return false;
}
}

/**
* @param name
* String
* @param pass
* String
*/
public boolean sendout() {
try {
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println( "正在发送邮件.... ");

Session mailSession = Session.getInstance(props, null);
Transport transport = mailSession.getTransport( "smtp ");
transport.connect((String) props.get( "mail.smtp.host "), username,
password);
transport.sendMessage(mimeMsg, mimeMsg
.getRecipients(Message.RecipientType.TO));

System.out.println( "发送邮件成功! ");
transport.close();

return true;
} catch (Exception e) {

System.err.println( "邮件发送失败! " + e);
return false;
}

}

/**
* Just do it as this
*/
public static void main(String[] args) {

// mailbody-> 发送 的邮件 内容
String mailbody = " <meta http-equiv=Content-Type content=text/html; charset=gb2312> "
+ " <div align=center> <table border=1> <tr> <td> 姓名 </td> <td> 性别 </td> </tr> <tr> <td> <font color=blue> 大白菜 </font> </td> <td> 120 </td> </tr> </table> </div> ";

// themail表示要发送到那个smtp上去(转发的地位)
sendMail themail = new sendMail( "smtp.sohu.com ");

// 是否要验证用户身份
themail.setNeedAuth(true);

// 邮件标题
if (themail.setSubject( "大白菜say hello! ") == false)
return;
if (themail.setBody(mailbody) == false)
return;

// 指明发送到那个用户
if (themail.setTo( "asdccn@cmr.com.cn ") == false)
return;

// 显示是谁发来得
if (themail.setFrom( "qinhaijun1@sohu.com ") == false)
return;
// 表明要带的附件
if (themail.addFileAffix( " ") == false)
return;
themail.setNamePass( "rightlinker_test ", "123123 ");

if (themail.sendout() == false)
return;
}
}

热点排行