【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

一、邮件发送

  1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示。

    SMTP协议使用的端口号:25

    rfc821详细记载了该协议的相关信息

    (1)使用telnet发送邮件(使用126邮箱服务器,现在126邮箱服务器要求使用类似于QQ的独立密码进行客户端的验证(网页登陆不需要))

      第一步:连接到邮箱服务器            telnet smtp.126.com 25

      第二步:                    ehlo aaa(任意字符串)

      第三步:请求验证登录              auth login

      第四步:输入使用Base64编码后的用户名      XXXX

      第五步:输入使用Base64编码后的密码       XXXX

      第六步:声明发件人               mail from:<发件人邮箱地址>

      第七步:生命收件人               rcpt to:<收件人邮箱地址>

      第八步:开始正文数据部分            data

      第九步:信头部分                from:<发件人邮箱地址>

                              from:<收件人邮箱地址>

      第十步:主题                  subject:信的主题

      第十一步:回车换行               回车

      第十二步:书写正文部分             例:这是我的邮箱地址:XXXXX等

      第十三步:结束                 回车,.,回车

      第十四步:和服务器断开连接           quit

    (2)Base64编码:BASE64Encoder类来实现

       如果使用MyEclipse自带的Jdk1.6,则不能使用该类;应当将自带的jre移除,使用自己安装的jdk1.6。

       使用Base64编码示例:

package com.kdyzm.demo;
//BASE64Encoder类实际上是sun公司内部使用的类。一般最好不要使用。
//使用该类将用户名和密码进行转码之后才能被服务器识别。
import sun.misc.BASE64Encoder;

public class Base64EncoderDemo {
    public static void main(String[] args) {
        BASE64Encoder encoder=new BASE64Encoder();
        String user=encoder.encode("邮箱地址,如kdyzm".getBytes());
        String pass=encoder.encode("邮箱密码或者独立密码、客户端授权密码".getBytes());
        System.out.println(user);
        System.out.println(pass);
    }
}
使用Base64Encoder类示例

       结果:

08rP5LXY1rejrMjna2R5em0=
08rP5MPcwuu78tXftsDBosPcwuuhor/Nu6e2y8rayKjD3MLr
使用Base64Encoder类编码结果

    (2)解决中文乱码问题

      使用SecureCRT或者putty或者Xshell等都能实现telnet连接,但是这些工具发送的邮件都会有中文乱码问题,即使用邮箱客户端查看的时候是乱码,解决方法就是使用windows自带的telnet工具,使用windows自带的telnet工具在输入的时候可能会出现乱码,但是在邮箱中查看邮件的时候并不会产生乱码

    (3)截图

          

    在邮箱中查看:

      

  在这里顺便一提:data命令之后输入的from:<邮箱名>中邮箱名可以任意写,这样做的好处可以随便整人~但是稍微有点网络基础的人就能够通过命令行查看邮件,这样这种方法就没用了,因为通过命令行可以查看更为隐蔽的信息,其中有一个sender字段可以查看实际的发件人。

    

  2.使用java发送简单邮件

    (1)需要的两个jar包:

            mail.jar包:发送邮件的核心包

        activation.jar包:加密用

    (2)使用的三个核心类:

        Session类:封装了用户名、密码、连接的服务器、是否调试等信息。

        MimeMessage类:邮件的主体类,该类封装了发件人、收件人、抄送人、暗送人、主题、邮件内容等信息

        Transport类:该类封装了如何连接服务器、怎样将邮件发送到服务器等信息。

    (3)简单的邮件发送示例(不带附件)

package com.kdyzm.sendmail.demo;
/*
 * 发送一封普通邮件,没有附件,不是网页代码,最简单的邮件发送
 */
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/*
 * 演示基础的发送邮件的方法,不包含附件
 */
public class SendMailBaseDemo {
    public static void main(String[] args) throws AddressException, MessagingException {
        //声明放置配置信息的配置对象
        Properties p=new Properties();
        //设置连接那一台服务器
        p.setProperty("mail.host", "smtp.126.com");
        //设置是否验证
        p.setProperty("mail.smtp.auth", "true");
        //获取session对象
        Session s=Session.getDefaultInstance(p,new Authenticator() {
            //此方法返回用户名和密码的对象
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("用户名", "密码");
            }
        });
        //设置调试模式
        s.setDebug(true);
        //声明信息,该类是Message的实现类。
        MimeMessage msg=new MimeMessage(s);
        //设置发件人
        msg.setFrom(new InternetAddress("kdyzmx@126.com"));
        //设置收件人
        msg.setRecipient(RecipientType.TO, new InternetAddress("kdyzmx@163.com"));
        //设置抄送
        msg.setRecipient(RecipientType.CC, new InternetAddress("kdyzm@foxmail.com"));
        //设置暗送
        msg.setRecipient(RecipientType.BCC, new InternetAddress("kdyzm@sina.cn"));
        //设置主题
        msg.setSubject("这是用java发送的邮件666");
        msg.setContent("这是用java发送的邮件的内容666","text/plain;charset=utf-8");
        
        Transport.send(msg);
    }
}
使用java发送不带有附件的邮件

    验证结果:

    163邮箱示例:

    

    后台打印输出:

DEBUG: setDebug: JavaMail version 1.5.4
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.126.com", port 25, isSSL false
220 126.com Anti-spam GT for Coremail System (126com[20140526])
DEBUG SMTP: connected to host "smtp.126.com", port: 25

EHLO kdyzm-PC
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFMLeG3UCa0xDrUUUUj
250-STARTTLS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFMLeG3UCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<kdyzmx@126.com>
250 Mail OK
RCPT TO:<kdyzmx@163.com>
250 Mail OK
RCPT TO:<kdyzm@foxmail.com>
250 Mail OK
RCPT TO:<kdyzm@sina.cn>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   kdyzmx@163.com
DEBUG SMTP:   kdyzm@foxmail.com
DEBUG SMTP:   kdyzm@sina.cn
DATA
354 End data with <CR><LF>.<CR><LF>
From: kdyzmx@126.com
To: kdyzmx@163.com
Cc: kdyzm@foxmail.com
Message-ID: <19456522.0.1435139854187@smtp.126.com>
Subject: =?GBK?B?1eLKx9PDamF2Ybeiy821xNPKvP42NjY=?=
MIME-Version: 1.0
Content-Type: text/plain;charset=utf-8
Content-Transfer-Encoding: base64

6L+Z5piv55SoamF2YeWPkemAgeeahOmCruS7tueahOWGheWuuTY2Ng==
.
250 Mail OK queued as smtp5,jtKowACnyJXLfopVz3cMAA--.9857S2 1435139788
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 Bye
后台打印输出的内容

    注意事项:

      【1】MimeMessage类的setContent方法中设置文档类型的时候需要进行编码才不会产生乱码

msg.setContent("这是用java发送的邮件的内容666","text/plain;charset=utf-8");

      【2】在创建PasswordAuthentication类对象的时候,使用的密码是“客户端授权密码(网易邮箱的称呼,QQ邮箱称之为独立密码)”

    【3】本小练习没有用到activation.jar包

  (4)根据后台输出内容分析发送过程

    后台打印输出的内容很明显的显示出了EHLO、MAIL FROM:<kdyzmx@126.com>、RCPT TO:<kdyzmx@163.com>、DATA、From: kdyzmx@126.com、To: kdyzmx@163.com等命令,所以可以推测mail.jar包实际上在是模拟我们命令行发送邮件的过程。

  3.使用java发送带有附件的邮件。

   (1)使用到的核心类(除了上面介绍的三个类)

      MimeMultipart类:用于封装复合的数据类型

      MimeBodyPart类:用于只封装某一种数据类型

      DataSource接口:用于封装某种数据源,并提供了读出和写入的方法。

      Datahandler类:提供了对DataSource对象更多的操作方法

      MimeUtility类:主要提供了几种方法用于对数据进行编码和解码。

   (2)发送带有附件的邮件示例程序:

package com.kdyzm.sendmail.demo;

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/*
 * 发送一封带有附件的邮件。
 */
public class SendMailAttachFile {
    public static void main(String[] args) throws UnsupportedEncodingException, MessagingException {
        Properties p=new Properties();
        p.setProperty("mail.host", "smtp.sina.cn");
        p.setProperty("mail.smtp.auth", "true");
        Session session=Session.getDefaultInstance(p,new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("用户名", "密码");
            }
        });
        session.setDebug(true);
        
        //声明MimeMessage
        MimeMessage msg=new MimeMessage(session);
        msg.setFrom(new InternetAddress("kdyzm@sina.cn"));
        msg.setRecipient(RecipientType.TO, new InternetAddress("kdyzmx@126.com"));
        msg.setSubject("这是用Java发送的带有附件的邮件!");
        //第一步,声明多处理的Part
        MimeMultipart mm=new MimeMultipart();
        
        //文字部分
        //声明body
        MimeBodyPart body=new MimeBodyPart();
       
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值