//利用javaMail实现发送邮件
//四大核心类:
1,Message类:是创建和解析邮件的核心AP端I。通常使用他的子类,MineMessage类。客户端发送邮件时,首先使用创建邮件的
javaMail创建出封装了邮件数据的Message对象,然后把这个对象传递给邮件发送API(Transport类)发送,客户端接受邮件时,邮
件接受API把接受到的邮件数据封装到Message类的实例中,客户程序在使用邮件解析API从这个对象中解析收到的邮件数据。
2,Transport类:是发送邮件的核心API类,他的实例对象代表了某个邮件协议的邮件发送对象,例如:SMTP协议,客户端程序创
建好,Message对象后,只需要使用邮件发送API得到Transport对象,然后把Message对象传递给Transport对象,并调用他的发送方
法,就可以把邮件发送给指定的SMTP服务器。
3,Store类:是接受邮件的核心API类,他的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议,客户端接收邮
件时,只需要使用邮件接收API得到Store对象,然后调用Store对象的接收方法。就可以从指定的POP3服务器获得邮件数据,并把这
些邮件数据封装到表示邮件的Message对象中。
4,Session类:用于定义整个应用程序的所需的环境信息,以及收集客户端与邮件服务器建立网络连接会话信息,例如邮件服务器的
主机名,端口号,采用的邮件发送和接收协议等。Session对象根据这些信息构件用于邮件收发的Transport和Store对象,以及客户端
创建Message对象时提供信息支持。
//邮件发送问题
1,发件人的邮箱和密码:有的邮箱设置了独立的密码,还有的必须用授权码登陆(qq邮箱)
2,发件人的SMTP服务器地址:一般是smtp.xxx.com,比如163邮箱,smtp.163.com;qq邮箱是,smtp.qq.com。
3,有可能所有的信息都是正确的,但是还是接收不到邮件,有可能是收件箱拒收你发的邮件,解决方式:去垃圾箱找找,或者重复发送
邮件,或者更换收件箱。
//使用javaMail发送简单的纯文本邮件SendMailText
public class SendMailText{
//发/收件人地址
public static String senderAddress="[email protected]";
public static String recipientAddress="[email protected]";
//发件人账户名和密码
public static String senderAccount="xxx";
public static String senderPassword="xxx";
public static void main(String[] args) throws Exception{
//连接邮件服务器的参数配置
Properties props = new Properties();
//设置用户认证方式
props.setProperty("mail.smtp.auth","true");
//设置传输协议
props.setProperty("mail.transport.protocol","smtp");
//设置发件人的SMTP服务器地址
props.setProperty("mail.stmp.host","smtp.163.com");
//创建定义整个应用程序所需的环境信息的session对象
Session session =Session.getInstance(props);
//设置调试信息在控制台打印
session.setDebug(true);
//创建邮件Message实例对象
Message msg = getMineMessage(session);
//根据Session对象获取邮件传输对象Transport
Transport transport = session.getTransport();
//设置发件人的账户和密码
transport.connect(senderAccount,senderPassword);
//发送邮件,并发送到所有收件人地址 ,Message.getAllRecipients()获取到创建邮件对象时添加的所有收件/抄送/密送人
transport.sendMessage(msg,msg.getAllRecipients());
//如果只想发送给指定的人 //transport.sendMessage(msg,new Addreess[]{new InternetAddress("[email protected]")});
//关闭邮件连接
transport.close();
}
/**//获得创建一封纯文本邮件的实例
*@param session
*@return
*@throws MessagingException
*@throws AddressException
*/
public static MimeMessage getMineMessage(Session session) throws Exception{
//创建一封邮件的实例对象
MimeMessage msg =new MineMessage(session);
//设置发件人地址
msg.setFrom(new InternetAddress(senderAddress));
//设置收件人地址(可以增加多个收件人,抄送,密送)
/**
这一行代码写多行
MineMessage.RecipientType.TO:发送
MimeMessage.RecipiientType.CC:抄送
MimeMessage.RecipiientType.BCC:密送
*/
msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(recipientAddress));
//设置邮件主题
msg.setSubject("邮件主题","UTF-8");
//设置邮件正文
msg.setContext("简单的纯"文本邮件","text/html;charset=UTF-8");
//设置邮件发送时间,默认立即发送。
msg.setSendDate(new Date());
return msg;
}
}
//利用javaMail发送带有图片和附件邮件SendTextPic
public class SendTextPic{
//发/收件人地址
public static String senderAddress="[email protected]";
public static String recipientAddress="[email protected]";
//发件人账户名和密码
public static String senderAccount="xxx";
public static String senderPassword="xxx";
public static void main(String[] args) throws Exception{
//1,连接邮件服务器的参数配置
Properties props = new Properties();
//设置用户认证
props.setProperty("mail.smtp.auth",true);
props.setProperty("mail.rotocoltransport","smtp");
props.setProperty("mail.smtp.host","smtp.163.com");
Session session = Session.getInstance(props);
session.setDebug(true);
Message msg = getMimeMessage(session);
transport.connect(senderAccount,senderPassword);
transport.sendMessage(msg,msg.getAllRecipients());
transport.close();
}
/**//获得创建带有图片和附件邮件实例
*@param session
*@return
*@throws MessagingException
*@throws AddressException
*/
public static MimeMessage getMineMessage(Session session) throws Exception{
//创建一封邮件的实例对象
MimeMessage msg =new MineMessage(session);
//设置发件人地址
msg.setFrom(new InternetAddress(senderAddress));
//设置收件人地址(可以增加多个收件人,抄送,密送)
/**
这一行代码写多行
MineMessage.RecipientType.TO:发送
MimeMessage.RecipiientType.CC:抄送
MimeMessage.RecipiientType.BCC:密送
*/
msg.setRecipient(MimeMessage.RecipientType.TO,newInternetAddress(recipientAddress));
//设置邮件主题
msg.setSubject("邮件主题","UTF-8");
//设置邮件正文,下面是邮件正文
//msg.setContext("简单的纯"文本邮件","text/html;charset=UTF-8");
//创建图片结点
MimeBodyPart image = new MimeBodyPart();
//读取本地文件
DataHandler dh = new DataHandler(newFileDataSource("src\\mailtext.png"));
//将图片数据添加到结点
image.setDataHandler(dh)
//为节点设置一个唯一的编号(在文本节点将引用该ID)
image.setContext(mailTestPic);
//创建文本节节点
MimeBodyPart text= new MimeBodyPart();
//这里添加图片的方式,将整个图片包含到邮件之中内容中,实际上也可以以http连接的形式添加网络图片
//设置邮件发送时间,默认立即发送。
msg.setSendDate(new Date());
text.setContent("这是一张图片<br/><img src='cid:mailTestPic'/","text/html;charset=UTF-8");
//文本加图片,设置文本和图片"结点"的关系,既是将文本节点和图片节点合成一个混节
MimeMutliPart textImage = new MimeMutliPart();
textImage.addBodyPart(text);
textImage.addBodyPart(image);
//关联关系
testImage.setSubType("related");
//将文本图片的混合节点封装成一个普通的结点,最终添加到邮件的Content是由多个BodyPart组成的MutliPart,
//所以我们需要的是BodyPart。
MimeBodyPart textImage1 = new MimeBodyPart();
textImage1.setContent(textImage);
//创建附件节点
MimeBodyPart attachment =new MimeBodyPart();
//读取本地文件
DataHandler dh1 = new DataHandler(newFileDataSource("src\\maildoc.docx"));
//将附件添加到节点中
attachment.setDataHandler(dh1);
//设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dh1,getName()));
//设置(文本+图片)+附件的关系,既是合成一个更大的结点
MimeMutlipart mm = new MineMutlipart();
mm.addBodyPart(textImage1);
mm.addBodyPart(attachment);//如果附件有多个,可以创建多个
mm.setSubType("mixed");//混合关系
//设置整个邮件的关系,将最终的混合结点作为邮件的内容添加到邮件对象中,
msg.setContent(mm);
msg.setSendDate(new Data());
return msg;
}
}
//接收邮件,store类javaMailSSLReceive
public class javaMailSSLReceive{
public static void main(String[] args){
Properties props = new Properties();
Session session =Session.getDefaultInstance(props);
//第一个参数为接收协议,第二个参数为邮件接收服务器地址,第三个参数为pop3协议的端口,最后两个为用户名和密码
URLName url = new URLName("pop3","pop.163.com",110,null,"xxx","xxxxx");
//使用SSL加密传输协议,gmail可以使用SSL协议来保证邮件传输的安全,使用SSL的POP3S的默认端口为995
Store store=null;
Floder inbox=null;
try{
store =session.getStore(url);
//使用URLName指定Session邮件所需要的环境
store.connect();//连接邮件的服务器
//从邮件服务器中返回邮箱内的信息
inbox =store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);//打开folder
FetchProfile fp = new FethcProfile();
fp.add(FetchProfile.item.ENVELOPE);
Message[] msgs = ibox.getMessages();
inbox.fetch(msgs,fp);
//显示邮件信息
for(int i=0;i<msgs.length;i++){
String from =msgs[i].getFrom()[0].toString();
InternetAddress id =new InternetAddress(from);
System.out.println();
System.out.println("标题"+msgs[i].getSubject());
System.out.println("大小"+msgs[i].getSize());
System.out.println("时间"+msgs[i].getDate());
System.out.println("发送者"+msgs[i].getPersonal());
}
}catch(Excption e){}
inbox.close(false);
store.close();
}
}