我用java mail写了一个收发邮件的,在发邮件时邮件符件名用的是GBK编码,能发出去,可是收着都是乱码,试过用OuoLook,Foxmail收都是乱码,高手门出来帮帮我.
代码如下:
发邮件:
(在调用startSend时对附件名进行了GBK编码)
public boolean startSend() { //创建Properties对象
Properties props = System.getProperties();
//创建信件服务器
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", this.host);
props.put("mail.smtp.auth", "true"); //通过验证
//得到默认的对话对象
Session session = Session.getInstance(props);
try {
//创建一个消息,并初始化该消息的各项元素
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(this.from));
//收件人
if (this.to.trim().length() > 0) {
String[] arr = this.to.split(",");
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.TO,address);
}
}
//抄送
if (this.cc.trim().length() > 0) {
String[] arr = this.cc.split(",");
//int ReceiverCount=1;
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.CC,address);
}
}
/**密送
if (this.bcc.trim().length() > 0) {
String[] arr = this.bcc.split(",");
//int ReceiverCount=1;
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.BCC,address);
}
}*/
msg.setSubject(subject);
//后面的BodyPart将加入到此处创建的Multipart中
Multipart mp = new MimeMultipart();
//获取附件
int FileCount = this.arrFileName.getItemCount();
if (FileCount > 0) {
for (int i = 0; i < FileCount; i++) {
MimeBodyPart mbp = new MimeBodyPart();
//选择出附件名
fileName = arrFileName.getItem(i).toString();
try{
fileName = MimeUtility.encodeText(arrFileName.getItem(i).toString());
if (fileName.startsWith("=?")) {
fileName = MimeUtility.decodeText(fileName);
}
}catch(Exception e){
System.out.println("getpart(int i)重新生成文件:"+e.toString());
}
//得到数据源
FileDataSource fds = new FileDataSource(fileName);
//得到附件本身并至入BodyPart
mbp.setDataHandler(new DataHandler(fds));
//得到文件名同样至入BodyPart
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
}
MimeBodyPart mbp = new MimeBodyPart();
mbp.setText(this.body);
mp.addBodyPart(mbp);
//移走集合中的所有元素
arrFileName.removeAll();
//Multipart加入到信件
msg.setContent(mp);
} else {
//设置邮件正文
msg.setText(this.body);
}
//设置信件头的发送日期
msg.setSentDate(new Date());
msg.saveChanges();
//发送信件
Transport transport = session.getTransport("smtp");
transport.connect(this.host, this.userName, this.password);
if(this.to!=null && !this.to.trim().equals("")){
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
}
if(this.cc!=null && !this.cc.trim().equals("")){
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.CC));
}
/** if(this.bcc!=null && !this.bcc.trim().equals("")){
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.BCC));
}*/
transport.close();
} catch (MessagingException mex) {
mex.printStackTrace();
Exception ex = null;
if ((ex = mex.getNextException()) != null) {
ex.printStackTrace();
}
return false;
}
return true;
}收邮件:
代码如下:
发邮件:
(在调用startSend时对附件名进行了GBK编码)
public boolean startSend() { //创建Properties对象
Properties props = System.getProperties();
//创建信件服务器
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", this.host);
props.put("mail.smtp.auth", "true"); //通过验证
//得到默认的对话对象
Session session = Session.getInstance(props);
try {
//创建一个消息,并初始化该消息的各项元素
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(this.from));
//收件人
if (this.to.trim().length() > 0) {
String[] arr = this.to.split(",");
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.TO,address);
}
}
//抄送
if (this.cc.trim().length() > 0) {
String[] arr = this.cc.split(",");
//int ReceiverCount=1;
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.CC,address);
}
}
/**密送
if (this.bcc.trim().length() > 0) {
String[] arr = this.bcc.split(",");
//int ReceiverCount=1;
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.BCC,address);
}
}*/
msg.setSubject(subject);
//后面的BodyPart将加入到此处创建的Multipart中
Multipart mp = new MimeMultipart();
//获取附件
int FileCount = this.arrFileName.getItemCount();
if (FileCount > 0) {
for (int i = 0; i < FileCount; i++) {
MimeBodyPart mbp = new MimeBodyPart();
//选择出附件名
fileName = arrFileName.getItem(i).toString();
try{
fileName = MimeUtility.encodeText(arrFileName.getItem(i).toString());
if (fileName.startsWith("=?")) {
fileName = MimeUtility.decodeText(fileName);
}
}catch(Exception e){
System.out.println("getpart(int i)重新生成文件:"+e.toString());
}
//得到数据源
FileDataSource fds = new FileDataSource(fileName);
//得到附件本身并至入BodyPart
mbp.setDataHandler(new DataHandler(fds));
//得到文件名同样至入BodyPart
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
}
MimeBodyPart mbp = new MimeBodyPart();
mbp.setText(this.body);
mp.addBodyPart(mbp);
//移走集合中的所有元素
arrFileName.removeAll();
//Multipart加入到信件
msg.setContent(mp);
} else {
//设置邮件正文
msg.setText(this.body);
}
//设置信件头的发送日期
msg.setSentDate(new Date());
msg.saveChanges();
//发送信件
Transport transport = session.getTransport("smtp");
transport.connect(this.host, this.userName, this.password);
if(this.to!=null && !this.to.trim().equals("")){
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
}
if(this.cc!=null && !this.cc.trim().equals("")){
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.CC));
}
/** if(this.bcc!=null && !this.bcc.trim().equals("")){
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.BCC));
}*/
transport.close();
} catch (MessagingException mex) {
mex.printStackTrace();
Exception ex = null;
if ((ex = mex.getNextException()) != null) {
ex.printStackTrace();
}
return false;
}
return true;
}收邮件:
Map parameters=(Map)dataSet.getParameters();
Map outParams = new HashMap();
int mesId = Integer.valueOf((String)parameters.get("messageId"));
System.out.println(mesId);
String mesUid = "";
MailConfiguration xmlInfo = new MailConfiguration();
try{
this.getStoreFromServer(host, username,password);
folder.open(Folder.READ_ONLY);
message = folder.getMessage(mesId);
ReciveOneMail pmm = null;
pmm = new ReciveOneMail((MimeMessage) message);
MyMessage newMessage=new MyMessage();
String writer = message.getFrom()[0].toString();
if(writer.startsWith("=?")){
writer = MimeUtility.decodeText(writer);
}
newMessage.setWriter(writer);
newMessage.setSubject(message.getSubject());
newMessage.setSendDate(message.getSentDate());
MimeMessage mimeMessage=(MimeMessage)folder.getMessage(message.getMessageNumber());
mesUid = mimeMessage.getMessageID();
String toName = pmm.getMailAddress("to");
if(toName!=null && !toName.trim().equals("")){
if (toName.startsWith("=?")) {
toName = MimeUtility.decodeText(toName);
}
newMessage.setToName(toName.substring(1));
}
String ccName = pmm.getMailAddress("cc");
if (ccName!=null && !ccName.trim().equals("")){
if (ccName.startsWith("=?")) {
ccName = MimeUtility.decodeText(ccName);
}
newMessage.setCcName(ccName.substring(1));
}
/** String bccName = pmm.getMailAddress("BCC");
if (bccName!=null && !bccName.trim().equals("")){
newMessage.setCcName(bccName.substring(1));
}*/
newMessage.setMessageId(message.getMessageNumber());
newMessage.setMessageUid(mesUid);
//邮件内容
Part messagePart = message;
Object content = messagePart.getContent();
// 附件
if (message.isMimeType("multipart/*")) { //判断消息中是否有multipart/*头,如果有就进入Multipart处理
Multipart mp = (Multipart)message.getContent();
filename = "";
for(int i=0,n=mp.getCount(); i<n; i++){
messagePart = mp.getBodyPart(i);
String disposition = messagePart.getDisposition();
if((disposition != null) &&((disposition.equals(Part.ATTACHMENT)) ||(disposition.equals(Part.INLINE)))){
//String filename1 = new String(messagePart.getFileName().getBytes("GBK"));
String qq = this.getISOFileName(messagePart);
String filename1=new String(messagePart.getFileName());
//filename1 = MimeUtility.encodeText(filename1);
System.out.println(qq);
System.out.println(filename1);//1
System.out.println(filename1.getBytes());//2
System.out.println(filename1.getBytes("GB2312"));//3
System.out.println(filename1.getBytes("ISO8859_1"));//4
System.out.println(new String(filename1.getBytes()));//5
System.out.println(new String(filename1.getBytes(),"GB2312"));//6
System.out.println(new String(filename1.getBytes(),"ISO8859_1"));//7
System.out.println(new String(filename1.getBytes("GB2312")));//8
System.out.println(new String(filename1.getBytes("GB2312"),"GB2312"));//9
System.out.println(new String(filename1.getBytes("GB2312"),"ISO8859_1"));//10
System.out.println(new String(filename1.getBytes("ISO8859_1")));//11
System.out.println(new String(filename1.getBytes("ISO8859_1"),"GB2312"));//12
System.out.println(new String(filename1.getBytes("ISO8859_1"),"ISO8859_1"));//13
System.out.println(MimeUtility.decodeText(filename));
//
filename = filename + filename1 +',';
if (filename.startsWith("=?")) {
filename = MimeUtility.decodeText(filename);
// newMessage.setAdnexaName(filename);
}
System.out.println("附件 : ");
System.out.print("<a href=HandleAttach?msgnum=" + mesId
+ "&&bodynum=" + i + "&&filename=" + filename
+ ">" + filename + "</a><br/>");
//String bodynum = String.valueOf(i);
//System.out.println(bodynum);
}
if(disposition == null){
//检查部件数据是否为文件MIME类型
MimeBodyPart mdp =(MimeBodyPart)messagePart;
if(mdp.isMimeType("text/plain")||mdp.isMimeType("text/html")){
//若是处理文本
// System.out.println("2");
InputStream is = messagePart.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String thisLine = reader.readLine();
strcontent = "";
while (thisLine != null) {
strcontent += thisLine + '\n';
thisLine = reader.readLine();
}
}else{
}
}
}
} else {
InputStream is = messagePart.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String thisLine = reader.readLine();
strcontent = "";
while (thisLine != null) {
strcontent += thisLine + '\n';
thisLine = reader.readLine();
}
}
// System.out.println((Multipart)message.getContent());
newMessage.setAdnexaName(filename);
newMessage.setContent(strcontent);
dataSet.addRecord(newMessage);
int pos = xmlInfo.FindXml(path, mesUid);
boolean isAchieve = xmlInfo.modifyContent(path, pos, "flagIsNew", "F");
folder.close(true);
store.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
MimeUtility.encodeText("")
FileDataSource fds = new FileDataSource(fileName);
//得到附件本身并至入BodyPart
mbp.setDataHandler(new DataHandler(fds));
//得到文件名同样至入BodyPart
mbp.setFileName(fds.getName());
就是上面这个地方,不要用fds.getName,而改为直接用前面编码过fileName
mp.addBodyPart(mbp);
mbp.setFileName(fds.getName());
也就这句的问题,fds.getName()是默认的编码方试,如果我使用fileName,因为前面进行过decodeText,得到的是汉字发邮件时还是以没字的方试出去,邮件服务又进行了一次编码,所以在收件时就老是得到了乱码。
我吧 mbp.setFileName(fds.getName()); 改成了mbp.setFileName(MimeUtility.encodeText(fds.getName().toString()));
对fds.getName()进行了encodeText,在收件时使用decodeText就不会再出去乱码。其实我觉得fds.getName()只要指定了编码非汉字的我想在收邮件时也使用同样的编码的话也不会出现乱码了。