您的位置:首页 > 编程语言 > Java开发

JavaMail

2015-11-04 20:15 411 查看

一、邮件协议

1、收发邮件

   发邮件就是从客户端把邮件发送到邮件服务器,收邮件是把邮件服务器的邮件下载到客户端。

     


   我们在163、126、qq、souhu、sina等网站注册的Email账户,其实就是在邮件服务器中注册的,这些网站都有自己的邮件服务器。

2、邮件协议概述

   与 HTTP 协议相同,首发邮件也是需要传输协议的:

SMTP:(Simple  Mail  Transfer  Protocol,简单邮件传输协议)发邮件协议;
POP3:(Post  Office  Protocol  Version  3,邮局协议第三版)收邮件协议;
IMAP:(Internet  Message  Access  Protocol,因特网消息访问协议)首发邮件协议,我们的课程部设计该协议。

3、理解邮件收发过程

   其实你可以把邮件服务器理解为邮局,如果你需要给朋友寄一封信,那么你需要把心放到邮筒中,这样你的信会自动到达邮局,邮局会把心邮寄到另一个省市的邮局中。然后这封信会被送到收件人的邮箱中。最终收信人需要自己去经常查看邮箱是否有新的邮件。

   其实每个邮箱服务器都由SMTP服务器和POP3服务器构成,其中SMTP服务器负责发邮件的请求,而POP3负责收邮件的请求。

     


   当然,有时我们也会使用163的账号,向126的账号发邮件,这时邮件是发送到126的邮件服务器,而对于163的邮件服务器是不会存储这封邮件的。

     


4、邮件服务器名称

   SMTP 服务器的端口号为25,服务器名称为 smtp.xxx.xxx;

   POP3 服务器的端口号为110,服务器的名称为pop3.xxx.xxx;

163:smtp.163.com 和 pop3.163.com
qq:smtp.qq.com 和 pop3.qq.com

二、telnet收发邮件

1、BASE64 加密

   BASE64 是一种加密算法,这是加密方式是可逆的!它的作用是使加密后的文本无法用肉眼识别。Java 提供了 sun.misc.BASE64Encoder 这个类,用来做 Base64 的加密和解密,但我们知道,使用 sun 包下的东西会有警告!甚至在eclipse中根本使用不了这个类(需要设置),所以我们还是听SUN公司的话,不要去使用它内部使用的类,我们去施一公apache commons组件中的codec包下的Base64这个类来完成加密和解密。

import org.apache.commons.binary.Base64;

public class Base64Utils{
public static String encode(String s){
return encode(s,"utf-8");
}
public static decode(String s){
return decode(s,"utf-8");
}
public String encode(String s,String charset){
try{
byte[] bytes = s.getBytes(charset);
bytes = Base64.encodeBase64(bytes);
return new String(bytes,charset);
}catch(Exception e){
throws new RuntimeException(e);
}
}
 public String decode(String s,String charset){
try{
byte[] bytes = s.getBytes(charset);
bytes = Base64.decodeBase64(bytes);
return new String(bytes,charset);
}catch(Exception e){
throws new RuntimeException(e);
}
}
}


2、telnet发邮件

   连接163的smtp服务器:



   链接成功后需要如下步骤才能发送邮件:

与服务器打招呼:ehlo  你的名字

             


发出登陆请求:auth  login

             


输入加密后的邮箱名:(itcast@163.com)aXRjYXN0X2N4ZkAxNjMuY29t

输入加密后的邮箱密码:(itcast)aXRjYXN0
            


输入谁来发送邮件,即from:mail  from:<itcast@163.com>
            


输入把邮件发给谁,即to:rcpt to:<itcast@163.com>

            


发送填写数据请求:data

            


开始输入数据,数据包含:from、to、subject,以及邮件内容,如果输入结束后,以一个 " . " 为一行,表示输入结束:

             from:<itcast@163.com>

             to:<itcast@126.com>

             sublect:好好学习Java

            

             我已经深深爱上你了,Java!!!

             .

             注意,在标题和邮件正文要有一个空行!当要退出时,一定要以一个 " . " 为单行,表示输入结束。

最后一步:quit

            


3、telnet收邮件

   pop3无需使用Base64 加密!!!

   收邮件链接的是pop3.xxx.com,pop3协议默认的端口为110 。请注意,这与发邮件完全不同,如果你在163有邮箱账户,那么你想使用telnet收邮件,需要链接的服务器是pop3.163.com。

连接 pop3 服务器:telnet  pop3.163.com  110;
user 命令:user  用户名;
pass 命令:pass  密码;
stat 命令:stat 命令用来查看邮箱中邮件的个数,所有邮件所占的空间;
list 命令:list命令用来查看所有邮件,或指定邮件的状态,例如:list 1 是查看第一封邮件的大小,list 是查看邮件类表,即列出所有邮件的编号及大小;
retr 命令:查看指定邮件的内容,例如:retr 1# 是查看第一封邮件的内容;
dele 命令:标记某邮件为删除,但不是马上删除,而是退出时才会真正删除;
quit 命令:退出,如果在退出之前使用dele 命令标记了某些邮件,那么会在退出时删除他们。

       


      


      


三、JavaMail

1、JavaMail概述

   JavaMail 是 SUN 公司专门提供的针对邮件的API,主要 jar 包:mail.jar、activation.jar 。

   在使用 MyEclipse 创建 web 项目时,需要小心!如果只是在 web 项目中使用 java mail 是没有什么问题的,发布到 Tomcat 上运行一点问题没有。

   但是如果在 web 项目中写测试,那么就出问题了。

   在 MyEclipse 中,会自动给 web 项目导入 javax.mail 包中的类,但是不全(其实是只有接口,没有接口的实现类),所以只靠 MyEclipse 中的类是不能运行 java mail 的项目的,但是如果这时你再去自动导入 mail.jar 时,就会出现冲突。

   处理方案:到下面路径找到 javaee.jar 文件,把javax.mail删除!

                      \MyEclipse\Common\plugins\com.genuitec.eclipse.
4000
j2eedt.core_10.0.0.me.201110301321\data\libraryset\EE_5

2、JavaMail中的主要类

   java mail 中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax/mail.Transport。

   Session:表示会话,即客户端与邮件服务器端之间的会话!想获得会话需要给出账号及密码,当然还要给出服务器的名称。在邮件服务中的 Session 对象,就相当于连接数据库的Connection 对象。

   MimeMessage:表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。

   Transport:用来发送邮件,它是发送器。

3、JavaMail 之Hello World

   在使用 telnet 发邮件时,还需要自己来处理 Base64 编码的问题,但使用 JavaMail 就不必理会这些问题了,都由JavaMail来处理。

第一步:获得Session

      Session  session  =  Session.getInstance(Properties  prop,Authenticator  auth);

      其中prop 需要指定两个键值,一个是指定服务器主机名,另一个是指定是否需要认证。我们当然需要认证!

         Properties  prop  =  new  Properties();

         prop.setProperty("mail.host","smtp.163.com");

         prop.setProperty("mail.smtp.auth","true");

      其中Authenticator 是一个接口,表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账号及密码。

         Authenticator  auth  =  new  Authenticator (){

               public  PasswordAuthentication  getPasswordAuthentication(){

                     new  PasswordAuthentication("itcast_cxf","itcast");

               }

         };

      通过上面的准备,现在可以获得Session 对象了。

         Session  session  =  Seesion.getInstance(prop,auth);

第二步:创建MimeMessage 对象

      创建MimeMessage 对象需要使用Seesion 对象来创建:

         MimeMessage  msg  =  new  MimeMessage(session);

      然后需要设置收件人地址,发件人地址,主题,及邮件正文。

         msg.setFrom(new  InernetAddress("itcast@163.com"));//设置发件人

         msg.addRecipients(RecipientType.TO,"itcast@qq.com,itcast@sina.com");//设置多个收件人

         msg.addRecipients(RecipientType.CC,"itcast@sohu.com,itcast@126.com");//设置多个抄送

         msg.addRecipients(RecipientType.BCC,"itcast@hotmail.com");//设置暗送

         msg.setSubject("这是一封测试邮件");//设置邮件主题

         msg.setContent("当然是Hello World!","text/plain;charset=utf-8");//设置正文

第三步:发送邮件

      Transport.send(msg);//发送邮件

4、JavaMail 发送带有附件的邮件(了解)

   一封邮件可以包含正文、附件N个,所以正文和附件都是邮件的一部分。

   上面的hello World 案例中,只是发送了带有正文的邮件!所以在调用 sendContent() 方法时直接设置了正文,如果想发送带有附件邮件,那么需要设置邮件的内容为MimeMultipart。

      MimeMultipart  parts  =  new  MimeMultipart();//多部件对象,可以理解为部件的集合

      msg.setContent(parts);//设置邮件的内容为多部件内容

   然后我们需要把正文、N个附件创建为 "主体部件" 对象(MimeBodyPart),添加到MimeMuiltPart 中即可。

      MimeBodyPart  part1  =  new  MuiltBodyPart();//创建一个部件

      part1.setContent("这是正文部分","text/html;charset=utf-8");//给部件设置内容

     parts.addBodyPart(part1);//把部件添加到部件集中

   下面我们创建一个附件:

      MimeBodyPart  part2  =  new  MimeBodyPart();//创建一个部件

      part2.attachFile("f:\\a.jpg");//设置附件

      part2.setFileName("hello.jpg");//设置附件名称

      parts.addBodyPart(part2);//把附件添加到部件集中

   注意,如果在设置文件名称时,文件名称中包含了中文的话,那么需要使用MimeUtility 类来给中文编码:

      part2.setFileName(MimeUtility.encodeText("美女.jpg"));

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: