javamail技术研究

来源:互联网 发布:饥荒 linux 汉化 编辑:程序博客网 时间:2024/06/10 07:44
完成javamail的总结:
1.什么是javamail技术?
javamail通俗易懂就是通过java程序来实现发送邮件的一项技术。
2.邮件是通过什么发出去呢?
邮件都是通过邮件服务器发送出去的,也是通过邮件服务器接受的。邮件服务器按通讯协议可以划分为两种类型:
①smtp服务器(发送邮件服务器)
②pop3服务器(接受邮件服务器)
就比如我们的QQ邮箱的服务器就是分为发送QQ邮件服务器为smtp.qq.com,QQ的接受邮件服务器为pop3.qq.com。那么我们的smtp和pop3协议是分别是什么协议呢?
smtp协议:全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。
pop3协议:全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。

3.接下来就说明一下javamail的使用实例。这里用的是QQ邮箱进行测试的。程序的流程图如下:


根据以上的流程图我们来具体的学习一下javamail的API:
JavaMail API按其功能划分通常可分为如下三大类:
①创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
②发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
③ 接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
其中javamail中还有一个很重要的类就是Session
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。那么通过以上的类我们就可以完成一个简单邮件的发送。那么在具体的进行实现时首先我们需要引入javamail的jar包:
截图如下:


要说明的是如果你的jdk的版本在1.6以上那么就只需要mail.jar包即可。
①首先对Session邮件会话对象的属性进行配置,如下图:


配置内容如下图:


这里需要说明的是
mail.smtp.host配置的是qq发送邮件的服务器主机为smtp.qq.com
mail.smtp.port=587是指发送服务器的端口
mail.debug是设置邮件的调试模式
mail.smtp.auth是设置发送服务器需要对邮件进行身份验证
mail.user这个是设置你在qq发送邮件的账号
mail.password这个设置的是在你开启pop3和smtp服务时分配给你的密码而不是你的qq密码,这个需要注意的,具体设置可以自己查询。
那么接下来就根据具体的代码来进行解析具体的java代码实现如下:

package com.yd.util;import java.io.IOException;import java.io.InputStream;import java.util.Date;import java.util.Properties;import javax.mail.Authenticator;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMessage.RecipientType;import org.eclipse.jdt.internal.compiler.ast.ThisReference;//邮件发送类public class SendMail {public static void main(String[] args) throws MessagingException, IOException {//获得类加载器  并且获得资源的读取流InputStream is=SendMail.class.getClassLoader().getResourceAsStream("mail.properties");//设置发送邮件服务器的属性Properties properties=new Properties();properties.load(is);//创建一个验证授权对象Authenticator authenticator=new Authenticator() {//密码验证的方法@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(properties.getProperty("mail.user"),properties.getProperty("mail.password"));}};//1.首先创建一个发送邮件会话对象  将会话属性和验证对象加入到邮件会话对象当中Session session=Session.getInstance(properties, authenticator);//创建一个邮件对象MimeMessage message=new MimeMessage(session);//对邮件对象设置参数//1.标题message.setSubject("这是我发的邮件");//2.邮件的发送人message.setSentDate(new Date());//设置发送人message.setFrom(new InternetAddress("xxxxxxxxx@qq.com"));//接受人message.setRecipient( RecipientType.TO, new InternetAddress("xxxxxxxxx@qq.com"));//设置正文部分message.setText("这是第一封我给你发的邮件");//最后保存文件message.saveChanges();//Transport.send(message);//创建一个发送对象Transport transport=session.getTransport("smtp");//发送对象发送到发送到发送服务器中    连接需要主机名  用户名和密码//设置smtp协议发送的对象transport.connect(properties.getProperty("mail.smtp.host"),properties.getProperty("mail.user") ,properties.getProperty("mail.password"));//发送对象发送邮件transport.sendMessage(message,message.getAllRecipients());//关闭发送对象transport.close();}}
4.那么我们如何发送一个有图片和一个有附件的邮件呢?那么就首先要了解一下javamail的mime的组织结构,如下图:


如图可以看出复杂邮件内容可以分为三个级别:
①就是很简单的纯文本和超文本格式的邮件
②就是带有内嵌资源的邮件,比如在邮件中添加连接,图片,多媒体等。
③就是带有附件的邮件
javamail是如何实现的呢?javamail将邮件组织定义成如下图:


其实很简单,每一个邮件简单内容如文本,图片,附件都当作一个MimeBodyPart,而MimeMutipart就是由多个MimeBodyPart组成,相当于是一个大容器。而最外层的MimeMultipart则是邮件Message对象的内容。以下实现了一个带有图片和附件的邮件,具体的java代码实现如下:

package com.yd.util;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import javax.mail.Authenticator;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.PasswordAuthentication;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.MimeMessage.RecipientType;import javax.mail.internet.MimeMultipart;public class SendRelated {public static void main(String[] args) throws IOException, MessagingException {//设置邮件的信息InputStream is=SendRelated.class.getClassLoader().getResourceAsStream("mail.properties");//获得邮件的属性Properties properties=new Properties();properties.load(is);//创建一个验证邮件用户的对象Authenticator authenticator=new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(properties.getProperty("mail.user"), properties.getProperty("mail.password"));}};//创建一个邮件会话对象Session session=Session.getInstance(properties, authenticator);//创建一个邮件对象MimeMessage message=new MimeMessage(session);//创建邮件附件的内容块MimeMultipart mixed=new MimeMultipart("mixed");//创建一个内容块放正文部分MimeBodyPart c=new MimeBodyPart();mixed.addBodyPart(c);//MimeBodyPart attch=new MimeBodyPart();//创建附件MimeBodyPart attch1=new MimeBodyPart();//mimeBodyPart.setDataHandler(arg0);//创建附件模块String attch1path=SendRelated.class.getClassLoader().getResource("usermanage.sql").getPath();DataSource ds1=new FileDataSource(new File(attch1path));DataHandler dh1=new DataHandler(ds1);attch1.setDataHandler(dh1);attch1.setFileName("usermanage.sql");//创建附件二MimeBodyPart attch2=new MimeBodyPart();String attch1path2=SendRelated.class.getClassLoader().getResource("usermanage.sql").getPath();DataSource ds2=new FileDataSource(new File(attch1path2));DataHandler dh2=new DataHandler(ds2);attch2.setDataHandler(dh2);attch2.setFileName("b.sql");//将附件加入mixed.addBodyPart(attch1);mixed.addBodyPart(attch2);//创建邮件的复杂内容块 此内容块为正文部分Multipart multipart=new MimeMultipart("related");  //创建一个带有内嵌资源和文本的复杂内容块c.setContent(multipart);//设置复杂块内容  文本内容MimeBodyPart content=new MimeBodyPart();content.setContent("<img src='cid:8.png'/><img src='cid:9.png'/>这是我的爱你的人嗯啊","text/html;charset=utf-8");String path=SendRelated.class.getClassLoader().getResource("8.png").getPath();MimeBodyPart image=new MimeBodyPart();DataSource dataSource=new FileDataSource(path);DataHandler dataHandler=new DataHandler(dataSource);image.setDataHandler(dataHandler);//给内嵌资源设置id号  在正文的超文本中就可以直接通过cid:id来使用image.setContentID("8.png");String path2=SendMail.class.getClassLoader().getResource("9.png").getPath();MimeBodyPart image2=new MimeBodyPart();DataSource dataSource2=new FileDataSource(path2);DataHandler dataHandler2=new DataHandler(dataSource2);image2.setDataHandler(dataHandler2);image2.setContentID("9.png");//multipart.addBodyPart(content);multipart.addBodyPart(content);        multipart.addBodyPart(image);multipart.addBodyPart(image2);//邮件设置标题message.setSubject("本的邮件");message.setFrom(new InternetAddress(properties.getProperty("mail.user")));//设置收件人message.setRecipient(RecipientType.TO, new InternetAddress("xxxxxx@qq.com"));//邮件对象设置内容message.setContent(mixed);//设置smtp协议发送的对象Transport transport=session.getTransport("smtp");transport.connect(properties.getProperty("mail.smtp.host"),properties.getProperty("mail.user") ,properties.getProperty("mail.password"));transport.sendMessage(message,message.getAllRecipients());transport.close();}}


1 0