Java使用JavaMail API发送和接收邮件的代码示例
程序员文章站
2024-03-12 20:44:38
使用javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/ja...
使用javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html):
mailapi.jar。定义了收发邮件所使用到的接口api;
smtp.jar。包含了发送邮件使用到的类;
pop3.jar。包含了收邮件使用到的类;
我们通常发送邮件使用的协议是smtp协议,接受邮件使用的协议是pop3协议。或者,我们直接将mail.jar加入到工程,这个jar包里边包含了java收发邮件所有的接口和类。
常用的类:
- javax.mail.session; -------->保存连接服务器所需要的信息;
- javax.mail.message; -------->邮件体,保存邮件的内容;
- javax.mail.transport; -------->发送邮件的载体
- javax.mail.internet.internetaddress; -------->邮件的地址信息
发送邮件
下边,我先列出使用java发送邮件的最简单的一个小测试示例:
import java.util.properties; import javax.mail.address; import javax.mail.message; import javax.mail.messagingexception; import javax.mail.session; import javax.mail.transport; import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; /** * * qq(mail.qq.com):pop3服务器(端口995)smtp服务器(端口465或587)。 * */ public class demo1 { /** * @param args * @throws messagingexception */ public static void main(string[] args) throws messagingexception { string sendusername = "wangxiangpan@126.com"; string sendpassword = "pwd"; properties properties = new properties(); properties.setproperty("mail.smtp.auth", "true");//服务器需要认证 properties.setproperty("mail.transport.protocol", "smtp");//声明发送邮件使用的端口 session session = session.getinstance(properties); session.setdebug(true);//同意在当前线程的控制台打印与服务器对话信息 message message = new mimemessage(session);//构建发送的信息 message.settext("你好,我是champion.wong!");//信息内容 message.setfrom(new internetaddress("wangxiangpan@126.com"));//发件人 transport transport = session.gettransport(); transport.connect("smtp.126.com", 25, sendusername, sendpassword);//连接发件人使用发件的服务器 transport.sendmessage(message, new address[]{new internetaddress("492134880@qq.com")});//接受邮件 transport.close(); } }
一般的,我们使用authenticator把用户名和密码封装起来,不透明!所以:
import javax.mail.authenticator; import javax.mail.message; import javax.mail.messagingexception; import javax.mail.passwordauthentication; import javax.mail.session; import javax.mail.transport; import javax.mail.internet.addressexception; import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; import junit.framework.testcase; /** * javamail 发送邮件 * @author champion wong * message.addrecipient(message.recipient recipient, address address); 发邮件的时候指定收件人和收件人的角色 * message.recipienttype.to 收件人 * message.recipienttype.cc 抄送,即发邮件的时候顺便给另一个人抄一份,不用回复!但是,上边的收件人可以看到你都抄送给了谁 * message.recipienttype.bcc 暗送,也是发邮件的时候顺便给另一个人暗发一份,但是,不同于上边的是,收件人不能看到你都暗送给了谁 * */ public class demo2 extends testcase { private static final string sendusername = "wangxiangpan@126.com";// 发送邮件需要连接的服务器的用户名 private static final string sendpassword = "pwd";// 发送邮件需要连接的服务器的密码 private static final string sendprotocol = "smtp";// 发送邮件使用的端口 private static final string sendhostaddress = "smtp.126.com";// 发送邮件使用的服务器的地址 public void test() throws addressexception, messagingexception { properties properties = new properties(); properties.setproperty("mail.smtp.auth", "true");// 服务器需要认证 properties.setproperty("mail.transport.protocol", sendprotocol);// 声明发送邮件使用的端口 properties.setproperty("mail.host", sendhostaddress);// 发送邮件的服务器地址 session session = session.getinstance(properties, new authenticator() { protected passwordauthentication getpasswordauthentication() { return new passwordauthentication(sendusername, sendpassword); } }); session.setdebug(true);//在后台打印发送邮件的实时信息 message message = new mimemessage(session); message.setfrom(new internetaddress("wangxiangpan@126.com")); message.setsubject("demo2javacode发送邮件测试,采用authenticator");// 设置主题 message.setrecipients(message.recipienttype.to, internetaddress .parse("492134880@qq.com,wangxiangpan@126.com"));// 发送 message.setrecipients(message.recipienttype.cc, internetaddress .parse("msn_wangxiangpan@hotmail.com"));// 抄送 message .setcontent( "<span style="font-size:20px; color:#ffccff" mce_style="font-size:20px; color:#ffccff">如果您看到,证明测试成功了!</span>", "text/html;charset=gbk"); transport.send(message);//发送邮件 } }
我们发送一个比较复杂的邮件,包括附件,图文:
import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.outputstream; import java.util.properties; import javax.activation.datahandler; import javax.activation.datasource; import javax.activation.filedatasource; import javax.mail.authenticator; import javax.mail.messagingexception; import javax.mail.passwordauthentication; import javax.mail.session; import javax.mail.transport; import javax.mail.message.recipienttype; 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; /** * * @author administrator mr xp.wang * mimemultipart 一般电子邮件的容器是multipart,定义了增加及删除电子邮件各部分内容的方法, * 但是其是抽象类,需要其子类mimemultipart来时用mimemessage对象 * mimebodypart 是bodypart具体用于mimemessage的一个子类,mimebodypart对象代表一个 * mimemultipart对象的每一个部分 * mimeutility.encodetext(string cn)用于解决邮件中的头部信息中中文的乱码问题 * */ public class demo3_test { public static void main(string[] args) throws exception { properties properties = new properties(); properties.setproperty("mail.smtp.auth", "true");// 服务器需要认证 properties.setproperty("mail.transport.protocol", "smtp");// 声明发送邮件使用的端口 properties.setproperty("mail.host", "smtp.126.com");// 发送邮件的服务器地址 session session = session.getinstance(properties, new authenticator() { string sendusername = "wangxiangpan@126.com"; string sendpassword = "pwd"; protected passwordauthentication getpasswordauthentication() { return new passwordauthentication(sendusername, sendpassword); } }); session.setdebug(true); mimemessage msg = new mimemessage(session);// 声明一个邮件体 msg.setfrom(new internetaddress("/""+mimeutility.encodetext("mr xp.wang")+"/"<wangxiangpan@126.com>")); msg.setsubject("这是我的第一份复杂邮件");//设置邮件主题 msg.setrecipients(mimemessage.recipienttype.to, internetaddress.parse(mimeutility.encodetext("王翔攀")+"<wangxiangpan@126.com>,"+mimeutility.encodetext("三毛")+"<492134880@qq.com>")); mimemultipart msgmultipart = new mimemultipart("mixed");// 标明邮件的组合关系,混合的关系 msg.setcontent(msgmultipart);// 设置邮件体 mimebodypart attch1 = new mimebodypart();// 附件1 mimebodypart attch2 = new mimebodypart();// 附件2 mimebodypart content = new mimebodypart();// 邮件的正文,混合体(图片+文字) // 将附件和正文设置到这个邮件体中 msgmultipart.addbodypart(attch1); msgmultipart.addbodypart(attch2); msgmultipart.addbodypart(content); // 设置第一个附件 datasource ds1 = new filedatasource("f:/accp5.0/文件/ssh配置.txt");// 指定附件的数据源 datahandler dh1 = new datahandler(ds1);// 附件的信息 attch1.setdatahandler(dh1);// 指定附件 attch1.setfilename("ssh.txt"); // 设置第二个附件 datasource ds2 = new filedatasource("resource/48.jpg");// 指定附件的数据源 datahandler dh2 = new datahandler(ds2);// 附件的信息 attch2.setdatahandler(dh2);// 指定附件 attch2.setfilename("48.jpg"); //设置邮件的正文 mimemultipart bodymultipart = new mimemultipart("related");//依赖关系 content.setcontent(bodymultipart);//指定正文 mimebodypart htmlpart = new mimebodypart(); mimebodypart gifpart = new mimebodypart(); bodymultipart.addbodypart(htmlpart); bodymultipart.addbodypart(gifpart); datasource gifds = new filedatasource("resource/48.jpg");//正文的图片 datahandler gifdh = new datahandler(gifds); gifpart.setheader("content-location", "http://mimg.126.net/logo/126logo.gif"); gifpart.setdatahandler(gifdh);//设置正文的图片 htmlpart.setcontent("我只是来打酱油的,这是我的形象照!<img src="/" mce_src="/""http://mimg.126.net/logo/126logo.gif/">", "text/html;charset=gbk");//设置正文文字 msg.savechanges();//保存邮件 //将邮件保存成文件 outputstream ops = new fileoutputstream("c:/users/administrator/desktop/test.eml"); msg.writeto(ops); ops.close(); transport.send(msg); } }
收取邮件
示例:rose 收取最近一封邮件。
import java.util.date; import java.util.properties; import javax.mail.folder; import javax.mail.message; import javax.mail.messagingexception; import javax.mail.nosuchproviderexception; import javax.mail.session; import javax.mail.store; public class fetchmail { public static void main(string[] args) { string protocol = "pop3"; boolean isssl = true; string host = "pop.163.com"; int port = 995; string username = "rose@163.com"; string password = "rose"; properties props = new properties(); props.put("mail.pop3.ssl.enable", isssl); props.put("mail.pop3.host", host); props.put("mail.pop3.port", port); session session = session.getdefaultinstance(props); store store = null; folder folder = null; try { store = session.getstore(protocol); store.connect(username, password); folder = store.getfolder("inbox"); folder.open(folder.read_only); int size = folder.getmessagecount(); message message = folder.getmessage(size); string from = message.getfrom()[0].tostring(); string subject = message.getsubject(); date date = message.getsentdate(); system.out.println("from: " + from); system.out.println("subject: " + subject); system.out.println("date: " + date); } catch (nosuchproviderexception e) { e.printstacktrace(); } catch (messagingexception e) { e.printstacktrace(); } finally { try { if (folder != null) { folder.close(false); } if (store != null) { store.close(); } } catch (messagingexception e) { e.printstacktrace(); } } system.out.println("接收完毕!"); } }