Java Mail---SMTP协议-Java发邮件(带附件)演示过程

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 转载请注明出处: http://blog.csdn.net/qq_26525215本文源自【大学之旅_谙忆的博客】JavaMail-API简介:邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。

转载请注明出处: http://blog.csdn.net/qq_26525215

本文源自大学之旅_谙忆的博客

JavaMail-API简介:

邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。
Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。

需要的jar包

mail.jar和activation-1.1.0.jar链接:
https://github.com/chenhaoxiang/Java/tree/master/JavaMail

Javax.mail.Session:

Session -用于设置服务器,协议类型和密码等
表示会话,是JavaMailApi的最高层入口类。Session对像从Properties中获取信息,如IP、协议、用户名密码等。

Javax.mail.Message类,它的一个重要子类为MimeMessage.

Message类表示电子邮件的正文部分。
一封电子邮件包含以下内容:
地址信息、标题、日期、正文。

Java.mail.Address:收件人地址
表示邮件的地址。常用的子类为:javax.mail.internet.InternetAddress.

Javax.mail.Transport:负责发送邮件
指定邮件发送的协议。通常为SMTP.
它的静态方法send(Message)负责发送邮件。

MailSSLSocketFactory-负责SSL加密(如果有邮箱是用ssl加密传输的,就需要用到这个类,否则不需要-以前的老版本jar包中没有此类)

演示用QQ邮箱给网易126邮箱发邮件:

为什么要用QQ邮箱,那是因为QQ邮箱的发送用到了ssl加密,而且这里原本需要的密码,也需要用授权码才可以。

JavaMail发送邮件:前提是QQ邮箱里帐号设置要开启POP3/SMTP协议

发送没有附件的邮件

第一种方式:

@Test//发送没有附件的邮件
   public void send1() throws Exception{
        //跟smtp服务器建立一个连接
        Properties p = new Properties();
        // 设置邮件服务器主机名
        p.setProperty("mail.host", "smtp.qq.com");//指定邮件服务器,默认端口 25
        // 发送服务器需要身份验证
        p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
        // 发送邮件协议名称
        p.setProperty("mail.transport.protocol", "smtp");

        // 开启SSL加密,否则会失败
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        p.put("mail.smtp.ssl.enable", "true");
        p.put("mail.smtp.ssl.socketFactory", sf);

        // 开启debug调试,以便在控制台查看
        //session.setDebug(true);也可以这样设置
        //p.setProperty("mail.debug", "true");

        // 创建session
        Session session = Session.getDefaultInstance(p, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名可以用QQ账号也可以用邮箱的别名
                PasswordAuthentication pa = new PasswordAuthentication("chenhaoxiang0117", "jnj*********dab");
                // 后面的字符是授权码,用qq密码不行!!
                return pa;
            }
        });

        session.setDebug(true);//设置打开调试状态

        for (int i = 0; i <1; i++) {//发送几封邮件
            //声明一个Message对象(代表一封邮件),从session中创建
            MimeMessage msg = new MimeMessage(session);
            //邮件信息封装
            //1发件人
            msg.setFrom(new InternetAddress("*****@qq.com"));
            //2收件人
            msg.setRecipient(RecipientType.TO, new InternetAddress(
                    "******@126.com"));
            //3邮件内容:主题、内容
            msg.setSubject("这是我用Java发来的邮件QQ....");
            //msg.setContent("Hello, 今天没下雨!!!", "text/plain;charset=utf-8");//纯文本
            msg.setContent(
                    "Hello <a href='http://www.baidu.com?id=ddd'>你好,快乐吗?<a/>",
                    "text/html;charset=utf-8");//发html格式的文本
            //发送动作
            Transport.send(msg);
        }
   }

第二种方式:

public class sendqqMail {

    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        // 开启debug调试,以便在控制台查看
        prop.setProperty("mail.debug", "true");
        // 设置邮件服务器主机名
        prop.setProperty("mail.host", "smtp.qq.com");
        // 发送服务器需要身份验证
        prop.setProperty("mail.smtp.auth", "true");
        // 发送邮件协议名称
        prop.setProperty("mail.transport.protocol", "smtp");

        // 开启SSL加密,否则会失败
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        // 创建session
        Session session = Session.getInstance(prop);

        // 通过session得到transport对象
        Transport ts = session.getTransport();
        // 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全)
        ts.connect("smtp.qq.com", "619***629", "jnjt***bdab");
        // 后面的字符是授权码,用qq密码失败了

        // 创建邮件
        Message message = createSimpleMail(session);
        // 发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @Method: createSimpleMail
     * @Description: 创建一封只包含文本的邮件
     */
    public static MimeMessage createSimpleMail(Session session)
            throws Exception {
        // 创建邮件对象
        MimeMessage message = new MimeMessage(session);
        // 指明邮件的发件人
        message.setFrom(new InternetAddress("61*****29@qq.com"));
        // 指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(
                "*****@126.com"));
        // 邮件的标题
        message.setSubject("QQ邮件测试");
        // 邮件的文本内容
        message.setContent("发送邮件成功!", "text/html;charset=UTF-8");
        // 返回创建好的邮件对象
        return message;
    }
}

QQ邮箱生成授权码的位置:

126邮箱接收结果:

发送有附件的邮件

相对于没带附件的:用MimeBodyPart来构建体,向体中添加内容,附件。最后利用MimeMultipart —addBodyPart(body); 把体加入。

这里需要一个activation包。

@Test//发送含附件的邮件
    public void send2() throws Exception{
        //跟smtp服务器建立一个连接
        Properties p = new Properties();
        // 开启debug调试,以便在控制台查看
        p.setProperty("mail.debug", "true");
        p.setProperty("mail.host", "smtp.sina.com");//指定邮件服务器,默认端口 25
        p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
        // 发送邮件协议名称
        p.setProperty("mail.transport.protocol", "smtp");

        // 开启SSL加密,否则会失败
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        p.put("mail.smtp.ssl.enable", "true");
        p.put("mail.smtp.ssl.socketFactory", sf);

        // 创建session
        Session session = Session.getInstance(p);

        // 通过session得到transport对象
        Transport ts = session.getTransport();

        // 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全)
        ts.connect("smtp.qq.com", "61*****29", "jnjt*******bdab");
        // 后面的字符是授权码,不能用qq密码

        //声明一个Message对象(代表一封邮件),从session中创建
        MimeMessage msg = new MimeMessage(session);
        //邮件信息封装
        //1发件人
        msg.setFrom( new InternetAddress("61******29@qq.com") );
        //2收件人
        msg.setRecipient(RecipientType.TO, new InternetAddress("ch*****ox@126.com") );
        //3邮件内容:主题、内容
        msg.setSubject("这是我用Java发来的邮件--带附件的....");

        //添加附件部分
        //邮件内容部分1---文本内容
        MimeBodyPart body0 = new MimeBodyPart(); //邮件中的文字部分
        body0.setContent("这是两张<font color='red'>图片</font>....","text/html;charset=utf-8");

        //邮件内容部分2---附件1
        MimeBodyPart body1 = new MimeBodyPart(); //附件1
        body1.setDataHandler( new DataHandler( new FileDataSource("./imgs/1.jpg")) );//./代表项目根目录下

        body1.setFileName( MimeUtility.encodeText("中文1.jpg") );//中文附件名,解决乱码

        //邮件内容部分3---附件2
        MimeBodyPart body2 = new MimeBodyPart(); //附件2
        body2.setDataHandler( new DataHandler( new FileDataSource("./imgs/2.jpg")) );
        body2.setFileName("2.jpg");

        //把上面的3部分组装在一起,设置到msg中
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(body0);
        mm.addBodyPart(body1);
        mm.addBodyPart(body2);
        msg.setContent(mm);

        // 发送邮件
        ts.sendMessage(msg,msg.getAllRecipients());
        ts.close();
    }

接收结果:

小知识点:

1.必须先启用QQ邮箱里POP3/STMP服务;然后生成授权码

2.导入mail.jar包和activation包
mail.jar和activation-1.1.0.jar链接:
https://github.com/chenhaoxiang/Java/tree/master/JavaMail

3.要在代码里加上开启SSL加密的代码(老版本的mail中没有MailSSLSocketFactory类)

4.密码不是QQ密码,而是授权码!

转载请注明出处: http://blog.csdn.net/qq_26525215

本文源自大学之旅_谙忆的博客

目录
相关文章
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
48 1
|
1月前
|
JavaScript 安全 Java
谈谈UDP、HTTP、SSL、TLS协议在java中的实际应用
下面我将详细介绍UDP、HTTP、SSL、TLS协议及其工作原理,并提供Java代码示例(由于Deno是一个基于Node.js的运行时,Java代码无法直接在Deno中运行,但可以通过理解Java示例来类比Deno中的实现)。
61 1
|
3月前
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
|
4月前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
91 10
|
4月前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
5月前
|
网络协议 Java
在Java中使用TCP协议搭建一个简单的客户端
如何在Java中使用TCP协议搭建一个简单的客户端
118 2
|
5月前
|
Java API 开发者
深入理解APDU协议与Java开发
深入理解APDU协议与Java开发
211 0
|
11天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
1天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
1天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
7 3
下一篇
无影云桌面