经过三天时间,这个收发邮件的程序终于做出来了,编译成功,执行也成功。只是尚不具备收附件(但可以成功发送)及显示超链接的功能,容以后慢慢琢磨。
这两个类主要要引入这么几个包:javax.mail.,javax.mail.internet.,java.util.,javax.activation.;
其中javax.mail,javax.mail.internet两个包在J2SE中是没有的,需要去sun公司的官方网站下载(如果不能成功下载,请给我留言)。下下来后粘贴到你的j2se安装目录中,我粘贴在d:jdk1.4.6jrelibext(就是通常粘贴数据库驱动程序包的地方)下,否则将不能成功编译。
一、邮件发送。
当我们要发送邮件时,最基本的参数要求有这么四个:收信人地址、主题、内通、发信人地址。因此我们应该把这四个参数作为主要参数在程序中使用。
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import java.io.File;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;
public class SimpleSender{
public static void main(String[] args){
String serverhost=args[0];
String touser=args[1];
String fromuser=args[2];
String subject=args[3];
String content=args[4];
String filename=args[5];
send(serverhost,touser,fromuser,subject,content,filename);
System.exit(0);
}
public static void send(String serverhost,String touser,String fromuser,String subject, String content,String filename){
try{
Properties props=System.getProperties();
props.put("mail.smtp.host",serverhost);
Session session=Session.getDefaultInstance(props,null);
Message ms=new MimeMessage(session);
ms.setFrom(new InternetAddress(fromuser));
ms.setRecipients(Message.RecipientType.TO,InternetAddress.parse(touser,false));
//if(cc!=null)
//ms.setRecipients(Message.RecipientType.CC,InternetAddress.parse(cc,false));
ms.setSubject(subject);
MimeMultipart mp=new MimeMultipart();
DataSource ds=new FileDataSource(new File(filename));//将文件变为datasoucer
BodyPart bpt=new MimeBodyPart();
bpt.setContent(content,"text/plain;charset=UTF-8");//将正文存入bodypart1中
mp.addBodyPart(bpt);//将bodypart1存入multipart中
BodyPart bp=new MimeBodyPart();
bp.setDataHandler(new DataHandler(ds));//将附件内容存入bodypart2中
bp.setFileName(filename);//将附件名称存入bodypart2中
mp.addBodyPart(bp);
ms.setContent(mp);
ms.setHeader("X-Mailer","LOTONtechEmail");
ms.setSentDate(new Date());
Transport.send(ms);
System.out.println("message is delivered!");
}
catch(Exception ex){ex.printStackTrace();}
}
}
ok,看起来似乎很简单。
这是通过servlet的方式编写而且使用了javax.mail包的结果,也许是掌握不熟练的原因吧。那我们用stmp包的话,情况又如何呢?且看:
<%@page import="sun.net.smtp.SmtpClient,java.io.*"%>
<%
String from=String.valueOf(request.getParameter("from")).toString();
String to=String.valueOf(request.getParameter("to")).toString();
String sub=String.valueOf(request.getParameter("sub")).toString();
String mess=String.valueOf(request.getParameter("mess")).toString();
try{
SmtpClient client=new SmtpClient("linuxaid.com.cn");
//括号中的参数可以是服务器的IP地址
client.from(from);
client.to(to);
PrintStream message=client.startMessage();
message.println("To:"+to);
message.println("Subject:"+sub);
message.println(mess);
client.closeServer();
out.println("邮件发送成功");
}catch(Exception e){}
%>
二、接收邮件
package com.lotontech.mail;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import java.io.*;
public class SimpleAccept{
public static void main(String[] args){
String host=args[0];
String user=args[1];
String password=args[2];
accept(host,user,password);
}
private static void accept(String host,String user,String password){
try{
Properties props=new Properties();
Session session=Session.getDefaultInstance(props,null);
Store store=session.getStore("pop3");
store.connect(host,user,password);
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
Message message[]=folder.getMessages();
for(int i=0;i<=message.length;i++){
System.out.println(i+":"+message[i].getFrom()+"\t"+
"subject:"+message[i].getSubject());
System.out.println("Do you want to read the message?[yes/no]");
String want=reader.readLine();
if(want.equals("yes"))
System.out.println("message content:"+"\t"+message[i].getContent());
else continue;
}
folder.close(false);
store.close();
}catch(Exception e){e.getStackTrace();}
}
}
至此收发的示例代码结束,以上经过测试并通过。