java mail 接收_Java使用JavaMail API发送和接收邮件的代码示例

本文详细介绍了如何使用JavaMail API进行邮件的发送和接收。通过示例代码展示了如何设置邮件属性、创建Session、发送邮件以及收取邮件的过程。涉及到的关键类包括Session、Message、Transport、InternetAddress等,并提供了SMTP和POP3协议的使用示例。
摘要由CSDN通过智能技术生成

使用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(

"如果您看到,证明测试成功了!",

"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")+"/""));

msg.setSubject("这是我的第一份复杂邮件");//设置邮件主题

msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText("王翔攀")+","+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("我只是来打酱油的,这是我的形象照!", "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("接收完毕!");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值