关于Javamail的配置和简单应用

来源:互联网 发布:日本现代著名作家知乎 编辑:程序博客网 时间:2024/05/21 22:43

 

Javamail 是提供给开发者处理电子邮件相关的编程接口,可以方便的执行些常用的邮件传输,而邮件开发中涉及到一些基本概念 :
邮件服务器:
要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sinasohu163等等他们都有自己的邮件服务器。
这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
电子邮箱:
电子邮箱(E-mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个帐户。用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个帐号分配一定的空间,用户从而可以使用这个帐号以及空间,发送电子邮件和保存别人发送过来的电子邮件。
而在邮件发送和接收中涉及到邮件传输协议邮件服务器类型.
SMTP协议(发送邮件)
用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
用法
telnet smtp.sina.com (连接新浪的服务器)
SMTP协议
                     ehlo 主机名
                     auth login //经过base64编码后的用户名和密码
                     mail from:redarmycsdn@sohu.com 
                     rcpt to:redarmycsdn@sina.com
                     Data   .号代表邮件内容的结束
                      quit
 
POP3协议(接收邮件)
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
    telnet pop.sina.com
    POP3协议
        user<SP>username<CRLF>
        pass<SP>password<CRLF> 
        stat<CRLF> 返回邮箱的统计信息
        list<SP>[msg#]<CRLF>返回某一封邮件的统计信息
        retr<SP>msg#<CRLF> 最重要的一个命令
        quit<CRLF>
        使用POP3协议手工接收邮件
Base64编码
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入用户名");
        String username = br.readLine();
        System.out.println("请输入密码");
        String pass = br.readLine();
        BASE64Encoder bc = new BASE64Encoder();
        System.out.println("加密用户名:"+bc.encode(username.getBytes())+"   /n"+bc.encode(pass.getBytes()));
演示邮件的发送
        准备实验环境
        提前在sohu sina上注册一个免费帐号
        获取smtppop3服务器的名称
        Sina sohu会在其帮助中心里提示管理当前注册帐号的邮件服务器的主机名。
        编写base64编码程序对用户名和密码进行编码。
        手工使用SMTP协议发送电子邮件
        编写Socket程序发送电子邮件
        如何配置outlook收发邮件
        邮件服务器的配置
        http://mail.sohu.com/mapp/help/mail/help2.jsp
        http://mail.sina.com.cn/help2/client01.html
 
应用:
首先进入DOS界面:
1        telnet stmp.sina.com 25
2        ehlo Lenovo
3        quth login
4        base64编码后用户名
5        base64编码后密码
6        mail from:<aa@sina.com>
7        rcpt to: <bb@sina.com>
8        data
9        Hello(内容)
10    .
11    Quit
 
Ok之后就会有一封从aa@sina.com向bb@sina.com发送的一封邮件 内容是Hello
如果想要在邮件上加入主题、发件人,那就要用到RFC822文档。
RFC822文档
用法:在data中加入
      from:aa@sina.com------发信人
      to:bb@sina.com---------收信人
      subject:Hello--------------主题
 
接下来,再附上Socket的一个简单应用
   Socket通常实现网络上客户言方和服务方的连接。是TCP/IP协议的一个十分流行的编辑界面。一个Socket由一个IP地址和一个商品号唯一确定。
 
//创建Socket对象
          Socket sk=new Socket("smtp.qq.com",25);
              //创建输出流
          OutputStream os=sk.getOutputStream();
          //创建输入流
       BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream()));
           System.out.println(br.readLine());
           os.write("ehlo mmm/r/n".getBytes());
           System.out.println(br.readLine());
           System.out.println(br.readLine());
           System.out.println(br.readLine());
           System.out.println(br.readLine());
           System.out.println(br.readLine());
           System.out.println(br.readLine());
           os.write("auth login/r/n".getBytes());
           System.out.println(br.readLine());
           os.write("base64编码后的账号/r/n".getBytes());
           System.out.println (br.readLine ());
           os.write("base64编码后的密码/r/n".getBytes());
           System.out.println (br.readLine ());
           os.write ("mail from :< 123456@qq.com>/r/n".getBytes ()); //mail from
           System.out.println (br.readLine ());
           os.write ("rcpt to:<654321@qq.com>/r/n".getBytes());//rcpt to
           System.out.println (br.readLine ());
           os.write ("data/r/n".getBytes());//data
           System.out.println (br.readLine ());
           os.write ("Help!!!!/r/n".getBytes ());
           os.write ("./r/n".getBytes ());
           System.out.println (br.readLine ());
           os.write ("quit/r/n".getBytes ());
           System.out.println (br.readLine ());
           os.close ();
           br.close ();
           sk.close ();