如何使用javamail 接收含有图片和附件的唷考
参考代码如下:
import javax.mail.*;
import java.util.*;
import java.io.*;
public class ReceiveMail {
//处理任何一种邮件都需要的方法
private void handle(Message msg) throws Exception {
System.out.println(“邮件主题:” + msg.getSubject());
System.out.println(“邮件作者:” + msg.getFrom()[0].toString());
System.out.println(“发送日期:” + msg.getSentDate());
}
//处理文本邮件
private void handleText(Message msg) throws Exception {
this.handle(msg);
System.out.println(“邮件内容:”+msg.getContent());
}
//处理Multipart邮件,包括了保存附件的功能
private static void handleMultipart(Message msg) throws Exception {
String disposition;
BodyPart part;
Multipart mp = (Multipart) msg.getContent();
//Miltipart的数量,用于除了多个part,比如多个附件
int mpCount = mp.getCount();
for (int m = 0; m mpCount; m++) {
this.handle(msg);
part = mp.getBodyPart(m);
disposition = part.getDisposition();
//判断是否有附件
if (disposition != null disposition.equals(Part.ATTACHMENT))
{
//这个方法负责保存附件
saveAttach(part);
} else {
//不是附件,就只显示文本内容
System.out.println(part.getContent());
}
}
}
private static void saveAttach(BodyPart part) throws Exception {
//得到未经处理的附件名字
String temp = part.getFileName();
//除去发送邮件时,对中文附件名编码的头和尾,得到正确的附件名
//(请参考发送邮件程序SendMail的附件名编码部分)
String s = temp.substring(8, temp.indexOf(“?=”));
//文件名经过了base64编码,下面是解码
String fileName = base64Decoder(s);
System.out.println(“有附件:” + fileName);
InputStream in = part.getInputStream();
FileOutputStream writer = new FileOutputStream(new File(
“保存附件的本地路径”+ “\\”+fileName));
byte[] content = new byte[255];
int read = 0;
while ((read = in.read(content)) != -1) {
writer.write(content);
}
writer.close();
in.close();
}
//base64解码
private static String base64Decoder(String s) throws Exception {
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] b = decoder.decodeBuffer(s);
return (new String(b));
}
public static void receive(String receiverMailBoxAddress, String username,String password) {
//本人用的是yahoo邮箱,故接受邮件使用yahoo的pop3邮件服务器
String host = “pop.mail.yahoo.com.cn”;
try {
//连接到邮件服务器并获得邮件
Properties prop = new Properties();
prop.put(“mail.pop3.host”, host);
Session session = Session.getDefaultInstance(prop);
Store store = session.getStore(“pop3”);
store.connect(host, username, password);
Folder inbox = store.getDefaultFolder().getFolder(“INBOX”);
//设置inbox对象属性为可读写,这样可以控制在读完邮件后直接删除该附件
inbox.open(Folder.READ_WRITE);
Message[] msg = inbox.getMessages();
FetchProfile profile = new FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg, profile);
for (int i = 0; i msg.length; i++) {
//标记此邮件的flag标志对象的DELETED位为true,可以在读完邮件后直接删除该附件,具体执行时间是在调用
//inbox.close()方法的时候
msg[i].setFlag(Flags.Flag.DELETED, true);
handleMultipart(msg[i]);
System.out.println(“****************************”);
}
if (inbox != null) {
//参数为true表明阅读完此邮件后将其删除,更多的属性请参考mail.jar的API
inbox.close(true);
}
if (store != null) {
store.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
JavaMail问题,怎样获得发件箱,草稿箱,回收站里面的邮件
获取发件箱、草稿箱、回收站的代码很简单:
我们在获取收件箱的代码是:
Folder folder = store.getFolder(“INBOX”);
但是我们在获取发件箱、与草稿箱时出现异常,这时就与邮件服务器的文件夹有关;
可以这样获取所有的文件夹:
Folder defaultFolder = store.getDefaultFolder();
Folder[] allFolder = defaultFolder.list();
通过调试或者迭代出来文件夹名称再通过找出来的文件夹名称获取发件箱与草稿箱集合:Folder folder = store.getFolder(“这里是迭代找出来的文件夹名称”);
根据获取的文件夹去得到里面的文件,
JavaMail 发送邮件附件的时候,如何把程序中读出来的IO流直接发出去,而不是保存成临时文件
有很多现成的代码啊,你自己实现的吗?
package com.yuyun.test;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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 javax.mail.internet.MimeUtility;
public class OAEmail {
/**
* @param args
*/
public static void main(String[] args)
{
InternetAddress[] popAddressList = null;
String smtpServer = “smtp.163.com”;
String popServer = “pop.163.com”;
String SmtpAddress = “bluewens@163.com”;
String PopAddresslist = “bluewens@126.com”;
String Subject = “这是一封测试邮件”;
String Type = “text/html”;
String messageText = “邮件的内容:hello,world”;
String[] arrArchievList = new String[4];
arrArchievList[0] = “c:\\供应商网址.doc”;
arrArchievList[1] = “c:\\FLEX3.jpg”;
arrArchievList[2] = “c:\\FLEX4.jpg”;
arrArchievList[3] = “c:\\FLEX6.jpg”;
boolean sessionDebug = false;
try
{
java.util.Properties props = System.getProperties();
props.put(“mail.smtp.host”,smtpServer);//存储发送邮件服务器的信息
props.put(“mail.smtp.auth”,”true”);//同时通过验证
props.put(“mail.transport.protocol”,”smtp”);
Session mailSession = Session.getInstance(props);//根据属性新建一个邮件会话
mailSession.setDebug(sessionDebug);
Message msg = new MimeMessage(mailSession);
// 设定发件人的地址
msg.setFrom(new InternetAddress(SmtpAddress));
// 设定收信人的地址
popAddressList = InternetAddress.parse(PopAddresslist,false);
msg.setRecipients(Message.RecipientType.TO, popAddressList);
// 设定信中的主题
msg.setSubject(Subject);
// 设定送信的时间
msg.setSentDate(new Date());
// 是否以附件方式发送邮件
boolean bolSendByArchieve = false;
// 如果有附件,先将由件内容部分存起来
if (arrArchievList != null arrArchievList.length 0)
{
// 1.保存内容
MimeMultipart mp = new MimeMultipart();
MimeBodyPart mailContentPart = new MimeBodyPart();
mailContentPart.setContent(messageText,Type + “;charset=GBK”);
msg.setContent(messageText,Type + “;charset=GBK”);
// 这句很重要,千万不要忘了
mp.setSubType(“related”);
mp.addBodyPart(mailContentPart);
// 2.保存多个附件
for (int index = 0;index arrArchievList.length;index++)
{
File file = new File(arrArchievList[index]);
MimeBodyPart mailArchieve = new MimeBodyPart();
FileDataSource fds = new FileDataSource(arrArchievList[index]);
mailArchieve.setDataHandler(new DataHandler(fds));
mailArchieve.setFileName(MimeUtility.encodeText(fds.getName(),”GBK”,”B”));
mp.addBodyPart(mailArchieve);
}
// 3.最后集成内容和附件,一起发送
msg.setContent(mp);
}
else
{
msg.setContent(messageText,Type + “;charset=GBK”);
}
//发送邮件
Transport transport;
msg.saveChanges();//存储邮件信息
transport = mailSession.getTransport(“smtp”);
//以smtp方式登录邮箱 username填写你的发送邮件的用户名如bluewens,userpwd填写你的密码,如获88888888,即transport.connect(“smtp.163.com”,”bluewens”,”88888888″);
transport.connect(“smtp.163.com”,”username”,”userpwd”);
transport.sendMessage(msg,msg.getAllRecipients());//发送邮件,其中第二个参数是所有
//已设好的收件人地址
props.put(“pop.163.com”, “false”);
transport.close();
System.out.println(“邮件已发送成功!”);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
postfix可以设置通过smtp发送的邮件都保存在服务器吗?
postfix 是会记录你发送的邮件,但记录形式可能和你的明文不一样,配置文件里应该有记录发送邮件的参数,看配置文件好好找找