JavaEmail

一、邮件相关基本概念
  a)邮件服务器:某厂商提供的电子邮件服务器的集群(或群集)
  b)电子邮箱:邮件服务器上提供的个人或企业的邮件空间
  c)邮件传输协议:邮件服务器之间,和个人或企业与邮件服务器之间传递或接收邮件的规则
    发送:SMTP协议 --- 简单邮件传输协议。
    接收:POP3协议
    创建邮件:MIME协议
  d)电子邮件的发送和接收过程  
 
    补充:卸载,安装和配置易邮服务器(包含 SMTP邮件发送服务器(端口号:25), P0P3邮件接收服务器(端口号:110)),并进行手工发送接收邮件

二、加密与解密算法
    一】Base64算法,Sun公司提供.Mail专用。
        核心类:BASE64Encoder类 、BASE64Decoder类
        code:

  //加密
            String username = "jack";
            String password = "123456";
            BASE64Encoder encoder = new BASE64Encoder();
            username = encoder.encode(username.getBytes());
            password = encoder.encode(password.getBytes());
            System.out.println(username + " : " + password);

            //解密
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] userbuf = decoder.decodeBuffer(username);
            byte[] pswbuf = decoder.decodeBuffer(password);
            username = new String(userbuf, "UTF-8");
            password = new String(pswbuf, "UTF-8");
            System.out.println(username + " : " + password);

二】通过Socket类来发送接收邮件

 //客户端发送邮件
            public class Demo2 {
                public static void main(String[] args) throws Exception{

                    //参数一:表示易邮服务器位于的IP地址
                    //参数二:SMTP邮件发送服务器的固定端口
                    Socket s = new Socket("127.0.0.1",25);

                    //构造行字符读入流
                    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                    //构造字节输出流
                    OutputStream os = s.getOutputStream();

                    System.out.println(br.readLine());
                    os.write("ehlo zhaojun\r\n".getBytes());
                    System.out.println(br.readLine());
                    System.out.println(br.readLine());

                    os.write("auth login\r\n".getBytes());
                    System.out.println(br.readLine());

                    os.write("YWFhQHpoYW9qdW4uY29t\r\n".getBytes());//用户名
                    System.out.println(br.readLine());
                    os.write("MTIzNDU2\r\n".getBytes());//密码
                    System.out.println(br.readLine());

                    os.write("mail from:<[email protected]>\r\n".getBytes());
                    System.out.println(br.readLine());

                    os.write("rcpt to:<[email protected]>\r\n".getBytes());
                    System.out.println(br.readLine());

                    os.write("data\r\n".getBytes());
                    System.out.println(br.readLine());

                    os.write("from:[email protected]\r\n".getBytes());
                    os.write("to:[email protected]\r\n".getBytes());
                    os.write("subject:test\r\n".getBytes());
                    os.write("Hello! How are you doing!\r\n".getBytes());
                    os.write(".\r\n".getBytes());
                    System.out.println(br.readLine());

                    os.write("quit\r\n".getBytes());

                    //关闭流
                    os.close();
                    br.close();

                }
            }

三、协议:
    一】SMTP协议:用于发送邮件。
        ehlo: 主机名
        auth login: 经过base64编码后的用户名和密码
        mail from:  <[email protected]>
        rcpt to:    <[email protected]>
        data: 发送的邮件内容。 (.号代表邮件内容的结束。)
    二】P0P3协议:用于接收邮件。
        user: username(明文)
        pass: password (明文)
        stat: 返回邮箱的统计信息(字节数)
        list: 返回某一封邮箱的统计信息。
        retr: 显示某一封邮件的信息
        quit: 退出

三】MIME协议:用于创建邮件。
        MimeBodyPart:表示复杂邮件的一个组成部分,它可以表示文本,附件,图片
        DataHandler:表示可以读取图片或附件
        MimeMultipart:表示二个邮件组成部分的关系,文本和图片的关系是"related"关系,文本和附件的关系是"mixed"关系,即默认
        Content-ID:表示图片的编号.
        Content-Type: 文本内容。
        Content-Dispostion头:有附件。
        **注意:MimeMultipart加入的顺利与邮件显示附件的顺序无关

四、 基于JavaMail创建邮件
    核心类: 
        MimeMessage:表示整封邮件对象。
        MimeBodyPart:表示邮件的一个Mime消息,即:一部分内容。
        MimeMultiPart:表示由一个或多个MimeBodyPart组合成的Mime消息。

a)简单邮件 
    MimeMessage:表示一个符合MIME协议的邮件
    InternetAddress:表示电子邮件地址
    RecipientType.TO:表示发送邮件的类型:例如TO(目标),CC(明抄送),BCC(密送)
    简单邮件只含有文本
    Content-Type:文本类型

code:

   public class SimpleEmailDemo {
            public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException {
                //创建邮件对象
                MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
                //设置From
                message.setFrom(new InternetAddress("jack[email protected]"));
                //设置to
                message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
                //设置subject属性
                message.setSubject("comment text");
                //设置Content属性
                message.setContent("Today is fine day!", "text/html;charset=UTF-8");
                //将该邮件保存到硬盘
                message.writeTo(new FileOutputStream("D:\\simpleEmail.eml"));
            }
        }

b)复杂邮件
    
    文本+图片
    code:

  public class TextImgEmailDemo {
            public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException {
                //创建邮件
                MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
                //设置From属性
                message.setFrom(new InternetAddress("[email protected]"));
                //设置To属性
                message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
                //设置Subject属性
                message.setSubject("Text And Image Email");
                //创建文本Text部分对象
                MimeBodyPart textPart = new MimeBodyPart();
                textPart.setContent("this is a picture<br/> <img src=‘cid:imageID‘/>", "text/html;chartset=UTF-8");
                //创建图片Img部分对象
                MimeBodyPart imgPart = new MimeBodyPart();
                //读取img.jpg图片
                DataHandler handler = new DataHandler(new FileDataSource("src\\com\\ccst\\email\\test.jpg"));
                imgPart.setDataHandler(handler);
                //为图片设置一个唯一ID
                imgPart.setContentID("imageID");

                //设置文本Text和图片Img的关系-->依赖关系: related
                MimeMultipart mm = new MimeMultipart();
                mm.addBodyPart(textPart);
                mm.addBodyPart(imgPart);
                mm.setSubType("related");

                //将内容放入邮件中
                message.setContent(mm);

                message.writeTo(new FileOutputStream("D:\\textImgEmail.eml"));
            }
        }

文本+附件
        MimeMultipart:表示二个邮件组成部分的关系,文本和附件的关系是"mixed"关系,即默认
        MimeMultipart加入的顺利与邮件显示附件的顺序无关
        code:

  public class TextAttachEmailDemo {
                public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException {
                    //创建邮件对象
                    MimeMessage message  = new MimeMessage(Session.getDefaultInstance(new Properties()));
                    //设置From
                    message.setFrom(new InternetAddress("[email protected]"));
                    //设置To
                    message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
                    //设置Subject
                    message.setSubject("text and attach");
                    //设置Content

                    //创建文本Text部分
                    MimeBodyPart textPart = new MimeBodyPart();
                    textPart.setContent("text and attach email", "text/html;charset=UTF-8");
                    //附件1
                    //创建附件Attach部分
                    MimeBodyPart attPart1 = new MimeBodyPart();
                    //创建数据对象
                    DataHandler dh1 = new DataHandler(new FileDataSource("src\\com\\ccst\\email\\FastStoneCapturecn.zip"));
                    attPart1.setDataHandler(dh1);
                    //设置附件1的名称
                    attPart1.setFileName(dh1.getName());

                    //附件2
                    //创建附件Attach部分
                    MimeBodyPart attPart2 = new MimeBodyPart();
                    //创建数据对象
                    DataHandler dh2 = new DataHandler(new FileDataSource("src\\com\\ccst\\email\\Momentum_v0.31.crx"));
                    attPart2.setDataHandler(dh2);
                    //设置附件2的名称
                    attPart2.setFileName(dh2.getName());

                    //合并文字Text和两附件,顺序无影响.可以将MimeMultipart看成一个容器
                    MimeMultipart mm = new MimeMultipart();
                    mm.addBodyPart(textPart);
                    mm.addBodyPart(attPart1);
                    mm.addBodyPart(attPart2);
                    mm.setSubType("mixed");//此句可省略。因为mixed为默认关系。

                    //将Mime协议的内容放入到邮件对象中
                    message.setContent(mm);

                    message.writeTo(new FileOutputStream(new File("D:\\textAttachEmail.eml")));
                }
            }

**注意:位置关系特别注意和加入的顺利要一致
    文本+图片+附件(将Text和Img看成一个部分:MimeBodyPart)
    code:

  public class TextImgAttachEmailDemo {
            public static void main(String[] args) throws MessagingException, FileNotFoundException, IOException {
                //创建邮箱对象
                MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
                //创建文本部分
                MimeBodyPart textPart = new MimeBodyPart();
                textPart.setContent("this is a picture<br/> <img src=‘cid:imgID‘/>", "text/html;charset=UTF-8");
                //创建图片部分
                MimeBodyPart imgPart = new MimeBodyPart();
                DataHandler dh = new DataHandler(new FileDataSource("src\\com\\ccst\\email\\test.jpg"));
                imgPart.setDataHandler(dh);
                imgPart.setContentID("imgID");
                //组合文本、图片部分
                MimeMultipart textImgMM = new MimeMultipart();
                textImgMM.addBodyPart(imgPart);
                textImgMM.addBodyPart(textPart);
                textImgMM.setSubType("related");

                //将文本、图片部分作为消息一部分
                MimeBodyPart commPart = new MimeBodyPart();
                commPart.setContent(textImgMM);

                //创建附件部分
                MimeBodyPart attPart = new MimeBodyPart();
                DataHandler attDh = new DataHandler(new FileDataSource("src\\com\\ccst\\email\\FastStoneCapturecn.zip"));
                attPart.setDataHandler(attDh);
                attPart.setFileName(attDh.getName());

                //将文本、图片组合体 与 附件部分组合成MIME消息内容
                MimeMultipart totalMM = new MimeMultipart();
                totalMM.addBodyPart(commPart);
                totalMM.addBodyPart(attPart);
                totalMM.setSubType("mixed");

                //将内容加入邮件对象
                message.setContent(totalMM);

                //保存邮件
                message.writeTo(new FileOutputStream(new File("D:\\totalEmail.eml")));

            }
        }

文本+附件+图片(将Text和Attach看成一个部分:MimeBodyPart)
        (与上同理。略)

**注意:对于,复杂类型的邮件,位置关系特别注意和加入的顺利要一致    
        数据的关系如下:
            multipart/related图片、 multipart/mixed(附件)、
            multipart/form-data(上传文件)

4 如何解决邮件中的乱码问题
  (1)主题:不存在乱码问题
  (2)正文:
    text.setContent("这是一副<br/><img src=‘cid:imageID‘/><br/>图片<br/>","text/html;charset=UTF-8");
  (3)附件名:(dh.getName()的时候不是乱码,set的时候才产生乱码)
    append.setFileName(MimeUtility.encodeText(dh.getName()));

5 解决平台冲突,使用JavaEE1.4 + activation.jar + mail.jar
  a)在JavaSE,即非Web应用中,JavaEE5/6平台中的mail包有冲突问题
  b)JavaEE1.4 + activation.jar(支持) + mail.jar(核心)
  c)对于Web应用,不存在以上冲突问题

*6 基于JavaMail发送邮件
  Session:客户端和邮件服务器之间的环境信息
  Transport:客户端和邮件服务器之间的传递对象
  Message:表示邮件
      code:

  public class SendDemo1 {
            public static void main(String[] args) throws Exception {
                // 1, 创建Session对象
                Properties props = new Properties();
                props.put("mail.transport.protocol", "smtp");// 指明协议,为smtp发送协议,若接收邮件则为pop3协议
                props.put("mail.host", "127.0.0.1");// 指明接收放ip
                Session session = Session.getDefaultInstance(props);
                // 2, 通过Session获得Transport对象
                Transport transport = session.getTransport();
                // 3, 创建邮件对象Message
                Message message = createMessage(session);
                // 4, 连接邮件发送服务器
                transport.connect();
                // 5, 发送邮件
                transport.send(message);
                // 6, 关闭邮件传输流对象
                transport.close();
            }

            private static Message createMessage(Session session) throws Exception {
                MimeMessage message = new MimeMessage(session);
                // 设置From
                message.setFrom(new InternetAddress("[email protected]"));
                // 设置to
                message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
                message.setSubject("BBS论坛");
                message.setContent("恭喜你注册成功!", "text/html;charset=UTF-8");
                return message;
            }
        }

*7 基于Web应用的邮件发送功能  
  a)对于二个不相干的操作,可以使用线程方式来处理

补充: 手工发送、接收邮件的步骤:
    WindowXP平台下,进入cmd命令状态:

[email protected]向[email protected]手工发送邮件
 
不相同域:
telnet 127.0.0.1 25(SMTP服务器端口)<回车>
ehlo skygao<回车\r\n>
auth login<回车>
YWFhQHpoYW9qdW4uY29t([email protected])<回车>                      
MTIzNDU2(123456)<回车>               
mail from:<[email protected]><回车>     
rcpt to:<[email protected]><回车>      
data<回车>                            
from:[email protected]<回车>           
to:[email protected]<回车>              
subject:test<回车>
Hello! How are you doing!<回车>
.<回车>
quit<回车>

[email protected]手工接收邮件
相同域
telnet 127.0.0.1 110(POP3服务器端口)<回车>
user merry<回车>               
pass 123456<回车>           
stat<回车>可选
list 2<回车>可选
retr 2<回车>
quit<回车>

不同域
telnet 127.0.0.1 110(POP3服务器端口)<回车>
user [email protected]<回车>               
pass 123456<回车>           
stat<回车>可选
list 2<回车>可选
retr 2<回车>
quit<回车>

------------------------------------sina发/收邮件地址
stmp.sina.com(邮件发送服务器)
pop.sina.com(邮件接收服务器)
telnet smtp.sohu.com 25
telnet pop.sina.com 110

时间: 2024-08-17 11:57:58

JavaEmail的相关文章

JavaEmail发送邮件

引言 我已经很久没有写过博客了,以前在博客园有写过一段时间,但后来因为工作的原因,没有更多的时间来写博客.这是我在51cto上的第一篇博文,写写JavaEmail发送邮件吧. 准备工作 下载好:javaMail.jar包和commons-lang-x.x.jar(后面附件中,我会把包一并送上,commons-lang因为在案例当中会用到) 案例介绍 演示了如何使用javaMail发送邮件 实践 首先,我们去新建一个web项目.我的项目名字就叫email.建好项目过后,在WebContent\WE

Selenium之偷懒教程

进来一直停留在基础理论知识的学习中,认为太乏味,就写了一个网页自己主动化的demo:自己主动写日报.省的以后自己打开网页写啦. 直接上代码: 自己主动填写日报DEMO import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.I

Android发送邮件

项目中有些关键日志需要从客户手中拿到,为了方便的收集日志在客户端中加入邮件发送功能(虽然使用分享功能也能发送邮件,前提需要客户登录手机的邮箱才行,比较麻烦,而且还进入页面,用户体验不太好). 主要实现了发送邮件,抄送,发送附件功能 先看一下效果图: 涉及到3个jar以及封装的接口 JEmailHelper.java package jwzhangjie.com.javaemail; import android.os.AsyncTask; import java.util.Date; impor

J2EE实战开发Android项目视频教程

基于J2EE实战竭诚网上商城B2C购物系统开发配Android版购物客户端(JFreeChart3D) 适合人群:初级 课时数量:100课时 用到技术:J2EE.Android.JFreeChart3D 涉及项目:B2C购物系统 咨询qq:1840215592 一.课程适合的对象: 在javaWeb框架体系中发展的开发人员,和Android初级开发人员,并且想要提升web框架开发技能的Java开发和想从事Android开发人员. 二.课程培养目标: 1.掌握JavaWeb SSH框架组织体系.

框架的艺术

框架的意义 框架存在的意义,必须在实际生产中体会.每一门技术和框架存在的意义都是因为现实的需要,需要解决某一个问题,某一个场景.最近读的一本书,<淘宝技术这十年>,淘宝一开始也不是集成了什么分布式系统,一样是LAMP的架构.技术是根据需求场景和业务而发展的,比如一个学校的一个年级,入学人数只有500的时候设置10个班比较合理,一旦人数增长到了1000(业务增长)之后,发现如果10个班(服务器)每个容纳100个学生(并发)是一件比较吃力的事情,那么就必须增加班级了(扩容),那按照之前的数据一个班

android--email发送邮件,文本还有附件形式的邮件

1.首先用的jar包为javaemail 下载地址: https://yunpan.cn/cB3kY8WIvcGtU (提取码:e042) 2.工具包 package com.kllayhello.utils; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Log; import java.util.Properties; imp

Oracle 11g

软件环境的一般要求 RHEL 5.x系统.RHEL 6.x系统 图形桌面环境 + 开发工具 + 中文Java支持 -- 在RHEL 6.x中安装时,ksh需改用5.x的软件包 准备工作: yum install yum* yum groupinstall   "X  窗口系统" "桌面" "桌面平台" "中文支持" "开发工具" [[email protected] ~]# yum -y install j

Github开源项目(企业信息化基础平台)

JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关系管理系统)等企业系统的通用业务功能.Github链接:https://github.com/u014427391/jeeplatform 欢迎下载或者star(收藏) JeePlatform项目是一款以Activiti为工作流引擎,以Spring Framework为核心框架,集ORM框架Myba

Java入门 - 高级教程 - 06.邮件收发

原文地址:http://www.work100.net/training/java-email.html更多教程:光束云 - 免费课程 邮件收发 序号 文内章节 视频 1 概述 - 2 发送一封简单的邮件 - 3 发送一封HTML邮件 - 4 发送带有附件的邮件 - 5 用户认证 - 请参照如上章节导航进行阅读 1.概述 使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) .