JavaMail

来源:互联网 发布:农村淘宝政府如何补贴 编辑:程序博客网 时间:2024/06/02 02:05

一、邮件协议

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.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"));

  



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为麦芒屏幕触屏失灵怎么办 华为麦芒5运行慢怎么办 手机屏保密码忘记了怎么办 麦芒5密码锁忘了怎么办 超薄手机壳松了怎么办 华为麦芒5声音小怎么办 笔记本外壳a面裂了怎么办 苹果手机外壳摔坏了怎么办 挂衣服肩膀出包怎么办 摩拜单车手机号注销了怎么办 摩拜单车手机号码换了怎么办 摩拜单车换手机号码打不开怎么办 摩拜单车丢了怎么办 摩拜单车忘锁了怎么办 透明手机壳粘指纹怎么办 tpu手机壳变黄了怎么办 0pp0手机声音小怎么办 橡胶皮套晒坏了怎么办 宝宝晚上吹空调发烧怎么办 玩手机手指尖疼怎么办 手机型号不支持微信运动怎么办 手腕向下压会疼怎么办 手腕韧带拉伤怎么办恢复快 华为手机用车载充电慢怎么办 华为麦芒6充电慢怎么办 oppo手机压弯了怎么办 麦芒5电池不耐用怎么办 华为7x照相模糊怎么办 华为麦芒6照相虚怎么办 荣耀8gps信号弱怎么办 华为麦芒4手机卡顿怎么办 华为麦芒4玩游戏卡怎么办 sim卡换卡通讯录丢了怎么办 换sim卡通讯录怎么办 麦芒4开不了机怎么办 麦芒5开不了机怎么办 麦芒6针丢了怎么办 麦芒6扬声器坏了怎么办 华为手机2s太卡怎么办 华为麦芒6网速慢怎么办 华为麦芒5太卡怎么办