Java实现邮件发送

Posted 蘭のテ一マ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现邮件发送相关的知识,希望对你有一定的参考价值。

JavaWeb实现邮件发

1、传输协议:

  • SMTP协议

    处理用户邮件发送的请求。

  • POP3协议

    处理用户邮件接收请的求。

2、所需要的jar包

Pom.xml文件:

<!-- mail-1.4.7.jar -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
<!-- activation-1.1.1.jar -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

3、发送一封纯文本的邮件

package com.xu;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class sendMail01 {
    //简单邮件:纯文本内容
    //复杂邮件:文本+图片+附件

    //要发送邮件需要获取协议,开启POP3和SMTP服务
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();//创建一封邮件
        //以下三项的Key的值都是固定的
        prop.setProperty("mail.host","smtp.qq.com");//设置邮件服务器
        prop.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名和密码

        //如果是QQ邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //==========使用JavaMail发送邮件的6个步骤======

        //1、创建定义整个应用程序所需要的环境信息的Session对象
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication(){
                //发件人邮箱的用户名和授权码(好像只有qq是授权码,其它的是密码)
                return new PasswordAuthentication("1612893803@qq.com","授权码");
            }
        });
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        
        //2、通过Session得到transport对象
        Transport ts = session.getTransport();

        //3、使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("SMTP.qq.com","1612893803@qq.com","授权码");
        //4、创建邮件

        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("1612893803@qq.com"));
        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("212694926@qq.com"));
        //邮件的标题
        message.setSubject("只是一个普通的纯文本邮件");
        //邮件的文本内容
        message.setContent("你好哇,我来了!","text/html;charset=UTF-8");
        //5、发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6、关闭连接
        ts.close();
    }
}

4、发送带图片和附件的邮件

package com.xu;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class sendMail02 {
    //简单邮件:纯文本内容
    //复杂邮件:文本+图片+附件

    /*
    *MimeMessage类表示整封邮件。
    *MimeBodyPart类表示邮件的一个MIME消息。
    *MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
    */

    //要发送邮件需要获取协议,开启POP3和SMTP服务
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();//创建一封邮件
        //以下三项的Key的值都是固定的
        prop.setProperty("mail.host","smtp.qq.com");//设置邮件服务器
        prop.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名和密码

        //如果是QQ邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //==========使用JavaMail发送邮件的6个步骤======
        
        //变量名字定义的有点乱,不想改了。将就下吧

        //1、创建定义整个应用程序所需要的环境信息的Session对象
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication(){
                //发件人邮箱的用户名和授权码
                return new PasswordAuthentication("1612893803@qq.com","授权码");
            }
        });
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);

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

        //3、使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("SMTP.qq.com","1612893803@qq.com","授权码");
        //4、创建邮件

        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("1612893803@qq.com"));
        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("212694926@qq.com"));
        //邮件的标题
        message.setSubject("这是一个有文本、图片、附件的邮件");
        //邮件的内容
       //=================================================
       //准备图片数据 DataHandler:处理除文本外的数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("C:\Users\Think\Documents\image-20200220200136289.png"));
        image.setDataHandler(dh);
        image.setContentID("xx.png");//设置图片ID
        //ContentID用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。
        //注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一个带图片、文本、附件<img src='cid:xx.png'>的邮件","text/html;charset=UTF-8");

        //准备附件数据
        MimeBodyPart accessory = new MimeBodyPart();
        DataHandler dh2 = new DataHandler(new FileDataSource("C:\Users\Think\Pictures\Saved Pictures\illust_70110900_20191209_012234.jpg"));
        accessory.setDataHandler(dh2);
        accessory.setFileName(MimeUtility.encodeText("yan"));//给附件一个名字,发过去显示的就是这个设定的名字||MimeUtility.encodeText("")解决附件发送过去乱码;

        //*****************************!!!!!!!**********************
            /*
                 MimeBodyPart:表示复杂邮件的一个组成部分,它可以表示文本,附件,图片
                 DataHandler:表示可以读取图片或附件
                 MimeMultipart:表示二个邮件组成部分的关系,文本和图片的关系是"related"关系
                 Content-ID:表示图片的编号
                 related:图片|| mixed:附件
             */
        //*****************************!!!!!!!**********************

        //拼接图片和文本
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        //将文本+图片封装成邮件的组成部分,即将关系看作成一个部分
        MimeBodyPart context = new MimeBodyPart();
        context.setContent(mm);

        //把附件也加上
        MimeMultipart file = new MimeMultipart();
        file.addBodyPart(context);
        file.addBodyPart(accessory);
        file.setSubType("mixed");

        //放到消息中
        message.setContent(file);//把编辑好的内容放入消息中
        message.saveChanges();//保存修改!


        //=================================================
        //5、发送邮件
        ts.sendMessage(message,message.getAllRecipients());//message:发送的消息||message.getAllRecipients():获取保存在里面的地址
        //6、关闭连接
        ts.close();
    }
     //对于,复杂类型的邮件,位置关系特别注意和加入的顺利要一致
}

以上是关于Java实现邮件发送的主要内容,如果未能解决你的问题,请参考以下文章

用python实现自动发邮件的功能

Java代码实现发送邮件

java实现邮件发送验证码

纯java实现邮件发送服务(亲测好用)

Java实现发邮件功能---网易邮箱

java代码spring-mvc模式怎样实现从后台直接定时发送邮件