0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

JavaMail介绍和常用的API 一个较完整的发送电子邮件函数

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

在项目中添加JavaMail相关JAR文件

要使用JavaMail可以从Java官网下载JavaMail相关的文件,目前最新的是Download JavaMail 1.4.4。

如果使用Spring框架,也可以从Spring的lib目录中找到需要的JAR文件,具体在:spring目录下的\lib\j2ee文件夹下,需要用到的两个JAR文件是:mail.jar和activation.jar,把他们拷贝到项目中即可。

JavaMail常用的一些方法

JavaMail基本属性设置:

//创建JavaMail需要用到的属性类:
Properties props = new Properties();
//设置smtp服务器
props.put("mail.smtp.host", "smtp.qq.com");
//设置验证为true
props.put("mail.smtp.auth", "true");

创建验证器

Authenticator authenticator = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("xxx@qq.com","password"); }
};

使用上面的Properties和验证器创建邮件消息需要用到的Session:

Session session = Session.getDefaultInstance(props, authenticator);

创建和设置邮件:

MimeMessage mimeMessage = new MimeMessage(session);
//设置发送者
mimeMessage.setFrom(new InternetAddress("xxx@qq.com"));
//设置收件人邮箱:
mimeMessage.setRecipient(Message.RecipientType.TO, "xxx@qq.com");
//设置标题:
mimeMessage.setSubject("来自IT宅的邮件", "GBK");
//设置发送日期:
mimeMessage.setSentDate(new Date());

设置内容有两种方法: 纯文本邮件

//创建附件
Multipart multipart = new MimeMultipart();
//创建邮件内容
MimeBodyPart body = new MimeBodyPart();
body.setText("正文:www.itzhai.com", "GBK");

复杂邮件

body.setContent("正文:www.itzhai.com","text/plain;charset=GBK");
multipart.addBodyPart(body);//发件内容

设置和添加附件

//创建附件
MimeBodyPart attache = new MimeBodyPart();
//读取附件attachement(File类型)
attache.setDataHandler(new DataHandler(new FileDataSource(attachement)));
//获取附件名称
String fileName = attachement.getName();
attache.setFileName(MimeUtility.encodeText(fileName, "GBK", null));
//添加附件
multipart.addBodyPart(attache);

发送邮件

Transport.send(mimeMessage);

如果要使用QQ邮箱,记得关闭独立密码保护功能和在邮箱中设置POP3/IMAP/SMTP服务。

以下是一个比较完整的发送电子邮件的函数

/**

  • 发送邮件
  • @param sender 发送邮箱
  • @param password 发送邮箱密码
  • @param receivers 接受者邮箱
  • @param title 邮件标题
  • @param mailContent 邮件内容
  • @param attachements 附件
  • @param mimetype 对象的MIME类型
  • @param charset 字符集
    */
    public static void sendEmail(final String sender,final String password,String[] receivers, String title, String mailContent, File[] attachements, String mimetype, String charset) {
    Properties props = new Properties();
    //设置smtp服务器地址
    //这里使用QQ邮箱,记得关闭独立密码保护功能和在邮箱中设置POP3/IMAP/SMTP服务
    props.put("mail.smtp.host", "smtp.qq.com");
    //需要验证
    props.put("mail.smtp.auth", "true");
    //创建验证器
    Authenticator authenticator = new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(sender, password);
    }
    };
    //使用Properties创建Session
    Session session = Session.getDefaultInstance(props, authenticator);
    //Set the debug setting for this Session
    session.setDebug(true);
    try {
    //使用session创建MIME类型的消息
    MimeMessage mimeMessage = new MimeMessage(session);
    //设置发件人邮件
    mimeMessage.setFrom(new InternetAddress(sender));
    //获取所有收件人邮箱地址
    InternetAddress[] receiver = new InternetAddress[receivers.length];
    for (int i=0; i<receivers.length; i++) {
    receiver[i] = new InternetAddress(receivers[i]);
    }
    //设置收件人邮件
    mimeMessage.setRecipients(Message.RecipientType.TO, receiver);
    //设置标题
    mimeMessage.setSubject(title, charset);
    //设置邮件发送时间
    //SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    //mimeMessage.setSentDate(format.parse("2011-12-1"));
    mimeMessage.setSentDate(new Date());
    //创建附件
    Multipart multipart = new MimeMultipart();
    //创建邮件内容
    MimeBodyPart body = new MimeBodyPart();
    //设置邮件内容
    body.setContent(mailContent, (mimetype!=null && !"".equals(mimetype) ? mimetype : "text/plain")+ ";charset="+ charset);
    multipart.addBodyPart(body);//发件内容
    //设置附件
    if(attachements!=null){
    for (File attachement : attachements) {
    MimeBodyPart attache = new MimeBodyPart();
    attache.setDataHandler(new DataHandler(new FileDataSource(attachement)));
    String fileName = getLastName(attachement.getName());
    attache.setFileName(MimeUtility.encodeText(fileName, charset, null));
    multipart.addBodyPart(attache);
    }
    }
    //设置邮件内容(使用Multipart方式)
    mimeMessage.setContent(multipart);
    //发送邮件
    Transport.send(mimeMessage);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

private static String getLastName(String fileName) {
int pos = fileName.lastIndexOf("\");
if (pos > -1) {
fileName = fileName.substring(pos + 1);
}
pos = fileName.lastIndexOf("/");
if (pos > -1) {
fileName = fileName.substring(pos + 1);
}
return fileName;
}

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法