java 发送邮件

5 篇文章 0 订阅
2 篇文章 0 订阅
  1. 首先在pow文件中引入javax.mail.glassfish
	<!-- 邮件 -->
	<dependency>
		<groupId>org.eclipse.jetty.orbit</groupId>
		<artifactId>javax.mail.glassfish</artifactId>
		<version>1.4.1.v201005082020</version>
	</dependency>
  1. 写一个发送邮箱工具类
package com.example.demo;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;


/**
 * @author aq
 * @version V1.0.0
 * @Description: 发送邮件工具类
 * @date 2019/11/27 10:49
 */
public class EmailUtil {

    /**
     * 邮箱配置
     */

    //邮箱的协议;有很多 POP3,SMTP,IMAP,在这里使用 SMTP协议
    private static final String protocol = "smtp";
    //qq邮箱使用smtp协议的地址
    private static final String host = "smtp.qq.com";
    //qq邮箱smtp的端口号有两个 465和587
    private static final String port = "465";
    //邮箱是否需要授权
    private static final String auth = "true";
    //此邮箱只针对经过安全认证的邮箱有效
    private static final String fallback = "false";
    //发送人邮箱账号
    private static final String user = "换成自己的邮箱";
    //发送人授权码
    private static final String password = "换成自己的授权码";
    //设置调试信息在控制台打印出来
    private static final boolean debug=false;

    /**
     * main方法修改配置后直接运行即可
     * @param args
     */
    public static void main(String[] args) {
        //换成自己要发送的邮箱(多人发送用逗号隔开)
        String emails = "953692187@qq.com,1332755269@qq.com,18943142789@163.com";
        //换成自己要发送的主题
        String subject = "您好你的验证码是";
        //换成自己要发送的内容("支持html语言")
        String content = "<img src='http://blog.tbaqkj.com/attachment/20191124/826b2295bd104cbd8175dd268d6e1e75.png' />";
        //换成自己要上传的附件(多个附件用逗号隔开,注意路径一定要对,否则会抛异常)
        String fileNames = "D://test.png,D://test.txt";
        EmailUtil.sendMail(emails, subject, content, fileNames);
    }
    /**
     * 发送邮件带附件
     *
     * @param emails    收件人列表
     * @param subject   主题
     * @param content   内容
     * @param filenames 附件(当附件为null时默认不发送邮件)
     */
    public static void sendMail(String emails, String subject, String content, String filenames) {
        //通过Properties属性将邮箱的地址、协议、端口号写入,然后放到session中
        Properties props = new Properties();
        //邮箱的协议;有很多 POP3,SMTP,IMAP,在这里使用 SMTP协议
        props.setProperty("mail.transport.protocol", protocol);
        //qq邮箱使用smtp协议的地址
        props.setProperty("mail.smtp.host", host);
        //qq邮箱smtp的端口号有两个 465和587
        props.setProperty("mail.smtp.port", port);
        //邮箱是否需要授权
        props.setProperty("mail.smtp.auth", auth);
        //若是163邮箱则已经结束了,若是qq邮箱需要SSL安全认证
        //java针对qq的安全认证是通过 javax.net.ssl.SSLSocketFactory全类名的抽象类来实现的
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        //此邮箱只针对经过安全认证的邮箱有效
        props.setProperty("mail.smtp.socketFactory.fallback", fallback);
        //安全认证的端口号,一边和邮箱的端口号一致
        props.setProperty("mail.smtp.socketFactory.port", port);

        Session session = Session.getInstance(props);
        //设置调试信息在控制台打印出来
        session.setDebug(debug);
        /**
         * 以逗号形式拆分字符串
         */
        String[] receives = emails.split(",");
        try {
            //创建邮件
//            MimeMessage message = getMimeMessage(session , "3608938672@qq.com" ,"953692538@qq.com" , "3608938672@qq.com" ,"3608938672@qq.com");

            MimeMessage message = getMimeMessage(session, user, receives, subject, content, filenames);
            //建立连接对象
            Transport transport = session.getTransport();
            //发送邮件的人的用户名和密码,其中密码为授权码
            transport.connect(user, password);
            System.out.println("开始发送邮件");
            long startTime = System.currentTimeMillis();
            transport.sendMessage(message, message.getAllRecipients());
            long endTime = System.currentTimeMillis();
            System.out.println("发送邮件成功,共消耗" + (endTime - startTime) + "毫秒");
            //关闭连接
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * MimeMessage是Message的子类,Message是所有电子邮件的超类;
     * 标准的Java Mail API中有一个Message的子类:MimeMessage,它可用于电子邮件和Usenet新闻消息。除此之外,其他厂商可以自由扩展Message来满足自身需求
     *
     * @param session  Session:对象
     * @param send     邮件的发送者
     * @param receives 多个邮件的接收者
     * @param subject  主题
     * @param content  内容
     * @return
     * @throws Exception
     */
    public static MimeMessage getMimeMessage(Session session, String send, String[] receives, String subject, String content, String filenames) throws Exception {
        // 混合关系
        // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart )
        MimeMultipart mm = new MimeMultipart();
        //1.创建一封邮件的实例对象
        MimeMessage msg = new MimeMessage(session);
        //2.设置发件人地址
        msg.setFrom(new InternetAddress(send));
        /**
         * 3.设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
         * MimeMessage.RecipientType.TO:发送
         * MimeMessage.RecipientType.CC:抄送
         * MimeMessage.RecipientType.BCC:密送
         */
        InternetAddress[] internetAddresses = new InternetAddress[receives.length];
        for (int i = 0; i < receives.length; i++) {
            System.out.println("邮箱"+(i+1)+":"+receives[i]);
            internetAddresses[i] = new InternetAddress(receives[i]);
        }
        System.out.println("共有"+receives.length+"封邮件");
        msg.setRecipients(MimeMessage.RecipientType.TO, internetAddresses);
//        msg.setRecipient(MimeMessage.RecipientType.CC,new InternetAddress(cReceive));
//        msg.setRecipient(MimeMessage.RecipientType.BCC,new InternetAddress(bcReceive));
        //4.设置邮件主题
        msg.setSubject(subject, "UTF-8");

//        // 5. 创建图片"节点"
//        MimeBodyPart image = new MimeBodyPart();
//        // 读取本地文件
//        DataHandler dataHandler = new DataHandler(new FileDataSource("D://test.png"));
//        // 将图片数据添加到"节点"
//        image.setDataHandler(dataHandler);
//        // 为"节点"设置一个唯一编号(在文本"节点"将引用该ID),若需要增加好多图片则用ID来区分
//        image.setContentID("mailPic");

        // 6. 创建文本"节点",MimeBodyPart表示的是一个单节点
        MimeBodyPart text = new MimeBodyPart();
        // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        text.setContent(content, "text/html;charset=UTF-8");

        // 7. (文本+图片)设置 文本 和 图片"节点"的关系(将 文本 和 图片"节点"合成一个混合"节点"), MimeMultipart表示的是一个符合节点
        MimeMultipart mm_text_image = new MimeMultipart();
        mm_text_image.addBodyPart(text);
//        mm_text_image.addBodyPart(image);
        // 关联关系
        mm_text_image.setSubType("related");

        // 8. 将 文本+图片 的混合"节点"封装成一个普通"节点"
        // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
        // 上面的 mailTestPic 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
        MimeBodyPart text_image = new MimeBodyPart();
        text_image.setContent(mm_text_image);
        mm.addBodyPart(text_image);

        // 如果有多个附件,可以创建多个多次添加
        // 9. 创建附件"节点"
        if (filenames!=null && !"".equals(filenames)) {
            String[] filenameArray = filenames.split(",");
            for (int i = 0; i < filenameArray.length; i++) {
                MimeBodyPart attachment = new MimeBodyPart();
                // 读取本地文件
                DataHandler dataHandler2 = new DataHandler(new FileDataSource(filenameArray[i]));
                // 将附件数据添加到"节点"
                attachment.setDataHandler(dataHandler2);
                // 设置附件的文件名(需要编码)
                attachment.setFileName(MimeUtility.encodeText(dataHandler2.getName()));
                mm.addBodyPart(attachment);
            }
        }
//        mm.setSubType("mixed");

        // 11. 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
        msg.setContent(mm);
        //设置邮件的发送时间,默认立即发送
        msg.setSentDate(new Date());

        return msg;
    }
}

放到项目里直接运行即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值