一、邮件相关基本概念
  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:<aaa@zhaojun.com>\r\n".getBytes());
System.out.println(br.readLine()); os.write("rcpt to:<bbb@qq.com>\r\n".getBytes());
System.out.println(br.readLine()); os.write("data\r\n".getBytes());
System.out.println(br.readLine()); os.write("from:aaa@zhaojun.com\r\n".getBytes());
os.write("to:bbb@qq.com\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:  <from@skygao.com>
        rcpt to:    <to@skygao.com>
        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@skygao.com"));
//设置to
message.setRecipient(RecipientType.TO, new InternetAddress("merry@skygao.com"));
//设置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("jack@skygao.com"));
//设置To属性
message.setRecipient(RecipientType.TO, new InternetAddress("merry@skygao.com"));
//设置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("jack@skygao.com"));
//设置To
message.setRecipient(RecipientType.TO, new InternetAddress("merry@skygao.com"));
//设置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("jack@skygao.com"));
// 设置to
message.setRecipient(RecipientType.TO, new InternetAddress("merry@skygao.com"));
message.setSubject("BBS论坛");
message.setContent("恭喜你注册成功!", "text/html;charset=UTF-8");
return message;
}
}

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

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

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

------------------------------------merry@skygao.com手工接收邮件
相同域
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 merry@qq.com<回车>               
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

JavaEmail的更多相关文章

  1. javaEmail发邮件是问号乱码,已解决

    寒假学习了ssm,就把之前看过的一个商城项目用ssm重构了. 然后在本地一切都正常,放到个人服务器上就凉了. 因为这个项目注册需要邮箱激活,然后就在发邮件的时候出了问题. 一.发送端口 因为源程序是用 ...

  2. JAVAEmail工具错误java.lang.ClassNotFoundException: javax.activation.DataSource

    JDK9以上或JDK6以下使用mail.jar包不加JAF的activation.jar包会抛出该错误!JDK6以上不需要加该jar包: 参考原文 https://stackoverflow.com/ ...

  3. javax.email 发送邮件 javaEmail ,java 邮件

    首先导入mail的jar包 然后代码如下 package aaa; import java.util.Date;import java.util.Properties; import javax.ma ...

  4. 基于 JavaEmail 简单的发送邮件点到点,一对多(图片和附件)之多收件人,多少送人

    if(!StringUtil.isEmpty(message_type_to)){ if (message_type_to.contains(",")) { String[] sp ...

  5. javamail技术

    package com.zh.javaEmail; import java.util.*; import javax.mail.*; import javax.mail.internet.*; imp ...

  6. Selenium之偷懒教程

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

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

    1.首先用的jar包为javaemail 下载地址: https://yunpan.cn/cB3kY8WIvcGtU (提取码:e042) 2.工具包 package com.kllayhello.u ...

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

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  9. SpringBoot开源项目Jeeplatform

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

随机推荐

  1. 高效的DDoS攻击探测与分析工具——FastNetMon

    一.简介 FastNetMon这是一个基于多种抓包引擎(NetFlow, IPFIX, sFLOW, netmap, PF_RING, PCAP)的DoS/DDoS攻击高效分析工具,可以探测和分析网络 ...

  2. javascript、js操作json方法总结(json字符创转换json对象)

    相信前端的同学们对json并不陌生,接触过很多.但是很少人知道json的全称是什么,哈哈,我也是查资 料知道的.(JSON JavaScript Object Notation是一种轻量级的数据交换格 ...

  3. hdu 1180 诡异的楼梯 (bfs)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Sub ...

  4. Bellman_ford POJ 3259 Wormholes

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41728   Accepted: 15325 Descr ...

  5. python手机号码运营商归属测试

    #手机号码测试: def number_test(): while True: number = input('Please enter your phone number:') CN_mobile ...

  6. WIN10FTP服务器搭建

    在WIN10上搭建FTP服务器 先建立两个文件夹,区分上传和下载,做测试 用 然后在管理--服务界面新建一个用户 用户目录下创建一个用户 因为服务应用程序里面没有IIS,所以我们打开控制面板里面的程序 ...

  7. display:inline、block、inline-block的区别(转)

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

  8. phpmyadmin安装出错,缺少 mysqli 扩展。请检查 PHP 配置

    下载了个phpmyadmin最新版本的,始终显示这样的内容,求助.如何解决哈?>缺少 mysqli 扩展.请检查 PHP 配置. <a href="Documentation.h ...

  9. Session深入理解

    Session是在什么情况下产生的 客户端访问服务器端,服务器端为每个用户生成一个唯一的sessionId,是这样吗?sessionId的作用是什么? http://www.cnblogs.com/s ...

  10. iOS 不同类之间的传值

    iOS是面向对象开发的,有很多不同的类,很多时候会遇到类与类之间的"交流"需求,比如通知.传递数值等等,(通知可以用nsnotificationcenter来做, 以后总结)下面主 ...