【java】javamail简介以及发送邮件

一、前言

      最近和聚哥一起研究了javamail,因为在开发的系统中需要使用一个发送邮件的功能,所以就想到了javamail。当然在以前做的项目中也用到过发送邮件的功能,但是没有这么深入的研究过。所以就不太清楚了。下面就向大家介绍一下Javamail。

二、什么是javamail

      JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。【From 百科

      所以我们可以用javamail来开发一个邮件服务器。

      在具体操作之前呢,小编先向大家分享一些关于邮件的知识:

  • 邮件服务器

    在国内,我们常用的邮箱有网易、新浪、QQ邮箱等。这些基本都是主流。他们有这不同的邮件服务器。
    

这里写图片描述

这里写图片描述

  • pop3 收信 110

    全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。POP服务器是用来收信的,而且每个Email地址一般只有一个。如果你要同时收取多个邮箱的信件,就必须挨个设置每个邮箱的POP3服务器地址。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件,提供了SSL加密。
    
  • SMTP 发信 25

      SMTP则是负责邮件服务器与邮件服务器之间的寄信的通讯协定。简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
    
  • 授权码

    第三方客户端(如hiibook等,不包括自己的客户端)登录邮箱的话,就会收到一个错误消息:“需要用授权码登录”,或者提示“无法连接到服务器”。
    这是一个新的策略,为了使得邮箱更加的保密。
    

      下面提供网页和QQ的授权码设置:

三、发送邮件

      关于发邮件,小编曾经在《windows下使用cmd(命令行)发送邮件》中向大家介绍过了,我们通过远程网易的邮件服务器。然后在对服务器打招呼,向服务器表明身份,登录认证,编写邮件,邮件发送等步骤。操作还是可以的。其实这个就是javamail的原理。我们输入的操作,都是javamail运行产生输出的。下面就用java语言向大家展示一下过程:

      环境说明:

3.1 建立java web项目

      导入jar包:

这里写图片描述

3.2 建立发送邮件的方法

      建立包com.dmsd.mail,在此包下建立发送邮件的类EmailUtil。其中的一个方法如下:

package com.dmsd.mail;

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

import javax.mail.Authenticator;
import javax.mail.Message;
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.MimeMessage;
import javax.mail.internet.MimeUtility;

import org.omg.CORBA.PRIVATE_MEMBER;

public class EmailUtil {
    /***发件正文***/
    private static String link = "http://www.baihe.com/betatest/betatest_newlandpage.html";

    private static String getContent(String link){
        String content = "<h3>皮皮虾我们走,一起去找女朋友!</h3>"
                + "<a href='"+ link +"'>点此去找</a>";
        return content ;
    }

     /**
     * 给单个人或者多个人发送邮件(不带附件)
     * @param to 收件人邮箱,类似"XXX@163.com,xxx@qq.com"
     * @param content 邮件信息
     * @param host 邮件服务器地址  ,例如smtp.163.com
     * @param port 邮件服务器端口,例如smtp 25  pop3 110
     * @param from 发件人邮箱,类似XXX@163.com、xxx@qq.com
     * @param password 发件人邮箱的授权码,注意第三方登录邮箱使用的是授权码
     * @param sendName 发件人姓名
     * @param subject 主题
     * @throws UnsupportedEncodingException 
     */
    public static void sendEmail(String to, String content,String host,String port,String sendName, String from, String password,String subject) throws UnsupportedEncodingException {

        /*** 1、创建Session ***/
        Properties props = new Properties();
        // 开启调试模式
        props.setProperty("mail.debug", "true");
        // 发送主机需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器名称
        props.setProperty("mail.host", host);
        // 设置邮件服务器端口
        props.setProperty("mail.port", port);
        // 发送协议名称
        props.setProperty("mail.transport.protocol", "smtp");

        final String  fromstr = from;
        final String passwordstr =password;
        // 环境信息
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 在session中设置账户信息,Transport发送邮件时会使用
                return new PasswordAuthentication( fromstr, passwordstr);
            }
        });
        /*** 2、创建邮件对象 ***/
        Message msg = new MimeMessage(session);
        try {
            // 设置发件人
            msg.setFrom(new InternetAddress("\"" + MimeUtility.encodeText(sendName) + "\" <"+from+">"));
            // 设置标题
            msg.setSubject(subject);
            // 设置内容
            msg.setContent(content, "text/html;charset=UTF-8");
            /*** 3、发送邮件 ***/
            Transport.send(msg, InternetAddress.parse(to) );

        } catch (MessagingException e) {
            System.out.println("发送邮件失败!!");
            e.printStackTrace();
        }
        System.out.println("发送邮件成功!!");
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        sendEmail("18333602097@163.com,1102716752@qq.com", getContent(link ),"smtp.163.com","25","ARES","18333602097@163.com","这是授权码","百合网");
    }
}

      当我们运行发送邮件的main方法的时候,就会在控制台中输出如下信息:

EHLO Ares-PC
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFp_6efUCa0xDrUUUUj
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 "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFp_6efUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 dXNlcm5hbWU6
xxxxxxxxx==
334 UGFzc3dvcmQ6
xxxxxxxxxxx==
235 Authentication successful
DEBUG SMTP: use8bit false
MAIL FROM:<18333602097@163.com>
250 Mail OK
RCPT TO:<18333602097@163.com>
250 Mail OK
RCPT TO:<1102716752@qq.com>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   18333602097@163.com
DEBUG SMTP:   1102716752@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>
From: ARES <18333602097@163.com>
Message-ID: <1943435117.0.1495432896861.JavaMail.Ares@smtp.163.com>
Subject: =?GBK?B?sNm6z834?=
MIME-Version: 1.0
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<h3>=E7=9A=AE=E7=9A=AE=E8=99=BE=E6=88=91=E4=BB=AC=E8=B5=B0=EF=BC=8C=E4=B8=
=80=E8=B5=B7=E5=8E=BB=E6=89=BE=E5=A5=B3=E6=9C=8B=E5=8F=8B=EF=BC=81</h3><a h=
ref=3D'http://www.baihe.com/betatest/betatest_newlandpage.html'>=E7=82=B9=
=E6=AD=A4=E5=8E=BB=E6=89=BE</a>
.
250 Mail OK queued as smtp11,D8CowADHDkzCfiJZB+cFGw--.6501S2 1495432900
QUIT
221 Bye
发送邮件成功!!

      在以上的这些信息中,就是我们在dos中输入的命令,对其中的数据进行了操作,我们使用的javamail就相当是对dos的这些命令进行了封装,更加的容易让人立即。

      下面是我收到的邮件,上面的是使用的是”18333602097@163.com,1102716752@qq.com”所以会给这两个账号发送,如果只是“18333602097@163.com”就只会给一个人发送了这样就达到了群发的功能更:

这里写图片描述

这里写图片描述

四、小结

      通过研究发送邮件,对其中的路子更加的熟悉了,基本没有什么难度了,操作也比较简答了,使用也更加的方便。

      这里我需要向大家点击的是使用授权码。才可以授权成功哦!另外就是可以达到给单个人发,也可以给多人发邮件,操作简单,朋友们可以在我的基础上修改,把我传入的参数序列化,可能会更加的方便了。

      下一篇博客将向大家介绍使用JavaMail发送带附件的邮件,敬请期待。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值