一、E-Mail协议简介

1、邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器 和 接收邮件的服务器。
2、发送邮件的服务器使用发送协议,现在常用的是SMTP协议。所以,通常发邮件的服务器也称为SMTP服务器。
3、接收邮件的服务器使用接收协议,现在常用的是POP3协议或IMAP协议,所以通常也被称为POP3或IMAP服务器。
4、目前经常见到的服务器为SMTP和POP3服务器。如大家在注册了126的邮箱之后,它的发邮件服务器为:25,而收邮件服务器则为:110.(冒号后面的为端口号)。
5、当然,发邮件服务器和收邮件服务器也可能是同一台主机,但端口号一定不相同。默认发邮件服务器的端口为25,收邮件的端口为110.

邮件发送的工作图:

Java 开启邮件服务 java 邮件服务器_java

二、邮件收/发协议

1、SMTP协议-发邮件协议:

全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。端口一般为25.

2、POP3协议-收邮件协议

全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。端口一般为110.

3、IMAP协议-对POP3的扩展

全称为Internet Message Access Protocal(Internet消息访问协议),它是对POP3协议的一种扩展,定义了邮件客户端软件与IMAP服务器的通讯规则。

三、SMTP发邮件协议的命令

Java 开启邮件服务 java 邮件服务器_Java 开启邮件服务_02

四、POP3协议的命令

Java 开启邮件服务 java 邮件服务器_服务器_03

五、通过命令行发送邮件的步骤如下

※发邮件

telnet  25 
 ehlo hncu 
 auth login 
 aG5jdWphdmE= 
 aG5jdTEyMzQ1Njc= 
 mail from:hncujava@sina.com 
 rcpt to:hncujava@126.com 
 data 
 from:hncujava@sina.com 
 to:hncujava@126.com 
 subject:hncu mail test 
 [空行] 
 hello hncu, are you OK?! 
 . //邮件结束符

六、通过命令行接收邮件的步骤如下

※收邮件(sina成功) 
 telnet  110 
 user hncujava 
 pass hncu*****7 
 stat //显示总体信息 
 list //列出所有信件 
 retr n //收取序号为n的邮件 
 quit

七、通过Java发邮件

1、利用sun.misc.BASE64Encoder类编码用户名和密码:

package cn.hncu.base64;

import sun.misc.BASE64Encoder;

public class Base64EncoderDemo {
    public static void main(String[] args) {
        String name= "hncujava";
        String pwd = "hncu1234567";
        BASE64Encoder en = new  BASE64Encoder();
        name = en.encode(name.getBytes());
        pwd = en.encode(pwd.getBytes());
        System.out.println("name : "+name+"\npwd : "+pwd);
    }
}
/*结果:
    name : aG5jdWphdmE=
    pwd : aG5jdTEyMzQ1Njc=
*/

2、如果sun.misc.BASE64Encoder找不到,请这样做:

Java 开启邮件服务 java 邮件服务器_发邮件_04

3、用Java代码发送邮件:

@Test //发送: 纯文本内容的邮件
public void send1() throws Exception{
    Properties p = new Properties();
    p.setProperty("mail.host", "");
    p.setProperty("mail.smtp.auth", "true");//认证登录
    Session session = Session.getDefaultInstance(p, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("hncujava","hncu1*****7");
        }
    });

    session.setDebug(true);//以debug方式(应答方式)进行通讯

    //准备邮件
    MimeMessage msg = new MimeMessage(session); //从session中创建邮件
    msg.setFrom( new InternetAddress("hncujava@sina.com") );
    msg.setRecipient(, new InternetAddress("hncujava@126.com"));
    msg.setSubject("邮件的主题OKOK!");
    msg.setContent("这是第一次用Java发邮件,请多多关照....", "text/plain;charset=utf-8"); //纯文本格式的内容
    //msg.setContent("这是第一次用<a href='http://www.baidu.com?age=20'>Java发邮件</a>,请多多关照....", "text/html;charset=utf-8"); //html格式的内容

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

4、用Java发送带有附件的邮件:

@Test //发送:文本内容+附件
public void send2() throws Exception{
    Properties p = new Properties();
    p.setProperty("mail.host", "");
    p.setProperty("mail.smtp.auth", "true");//认证登录
    Session session = Session.getDefaultInstance(p, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("hncujava","hncu*****7");
        }
    });

    session.setDebug(true);//以debug方式(应答方式)进行通讯

    //准备邮件
    MimeMessage msg = new MimeMessage(session); //从session中创建邮件
    msg.setFrom( new InternetAddress("hncujava@sina.com") );
    msg.setRecipient(, new InternetAddress("hncujava@126.com"));
    msg.setSubject("邮件的主题OKOK!");

    //body1:邮件正文文本内容
    MimeBodyPart body1 = new MimeBodyPart();
    body1.setContent("这是第一次用<a href='http://www.baidu.com?age=20'>Java发邮件</a>,请多多关照....", "text/html;charset=utf-8"); //html格式的内容

    //body2:附件1
    MimeBodyPart body2 = new MimeBodyPart();
    body2.setDataHandler( new DataHandler( new FileDataSource("./img/a.jpg")));
    body2.setFileName( MimeUtility.encodeText("美女1.jpg")); //能够支持中文的附件文件名设置

    //body3:附件2
    MimeBodyPart body3 = new MimeBodyPart();
    body3.setDataHandler( new DataHandler( new FileDataSource("./img/b.jpg")));
    body3.setFileName( MimeUtility.encodeText("美女2.jpg")); //不采用编码方式则文件名会中文乱码

    MimeMultipart multipart = new MimeMultipart();
    multipart.addBodyPart(body1);
    multipart.addBodyPart(body2);
    multipart.addBodyPart(body3);

    msg.setContent(multipart);

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