使用JavaMail API发送邮件

发送邮件是很常用的功能,注册验证,找回密码,到货通知,欠费提醒等,都可以通过邮件来提醒。

Java中发送邮件需要使用javax.mail.jar包,读者可以上网搜索或去官方下载,下载地址为:

下面贴上发送邮件的核心代码。

 1 // Get system properties
 2         Properties properties = System.getProperties();
 3
 4         // Setup mail server
 5         properties.setProperty("mail.smtp.host", host);
 6         properties.setProperty("mail.smtp.port", port);
 7         properties.put("mail.smtp.auth", "true");
 8
 9         // create email authenticator.
10         Authenticator authenticator = new Authenticator() {
11             protected PasswordAuthentication getPasswordAuthentication() {
12                 return new PasswordAuthentication(username, password);
13             }
14         };
15
16         // Get the default Session object.
17         Session session = Session.getDefaultInstance(properties, authenticator);
18
19         try {
20             // Create a default MimeMessage object.
21             MimeMessage message = new MimeMessage(session);
22
23             // Set From: header field of the header.
24             message.setFrom(new InternetAddress(from));
25
26             // Set To: header field of the header.
27             for (String to : toList) {
28                 message.addRecipient(Message.RecipientType.TO,
29                         new InternetAddress(to));
30             }
31
32             // Set Subject: header field
33             message.setSubject("这是邮件标题", "utf-8");58
59             // Send the complete message parts
60             message.setContent("这里是邮件内容", "text/html;charset=utf-8");
61
62             // Send message
63             Transport.send(message);
64             System.out.println("Sent message successfully....");
65         } catch (MessagingException mex) {
66             mex.printStackTrace();67         }

我自己定义了一个类EmailSender,这个类提供了邮件群发功能,以及在邮件中发送附件。用户继承这个类,重载getSubject,getContent和getAttachments这三个方法便可以发送邮件。

类定义如下:

package com.iot.common.email;

import java.io.File;

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Multipart;

import javax.mail.internet.MimeMultipart;

import javax.mail.internet.MimeBodyPart;

import javax.mail.BodyPart;

import javax.mail.PasswordAuthentication;

import javax.mail.Authenticator;

import java.util.ArrayList;

import javax.mail.MessagingException;

import javax.mail.Transport;

import javax.mail.Message;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.mail.Session;

import java.util.Properties;

import java.util.List;

/**
 * 邮件发送类,用来发送邮件给用户.<br />
 *
 * @author Sam
 *
 */
public abstract class EmailSender extends Authenticator {

    private String host;
    private String port;
    private String username;
    private String password;
    private String from;

    public EmailSender() {
        this.host = PropertiesUtil.getProperty(Constant.EMAIL_HOST);
        this.port = PropertiesUtil.getProperty(Constant.EMAIL_HOST_PORT);
        this.username = PropertiesUtil.getProperty(Constant.EMAIL_USER_NAME);
        this.password = PropertiesUtil.getProperty(Constant.EMAIL_PASSWORD);
        this.from = PropertiesUtil.getProperty(Constant.EMAIL_SENDER);
    }

    /**
     * EmailSender构造函数,需要用户提供host,port,username,password,from等信息。<br />
     *
     * @param host
     *            ,smtp服务器地址
     * @param port
     *            ,smtp服务器端口
     * @param username
     *            ,邮箱用户名
     * @param password
     *            ,邮箱密码
     * @param from
     *            ,邮箱发送人
     */
    public EmailSender(String host, String port, String username,
            String password, String from) {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
        this.from = from;
    }

    /**
     * 发送邮件到指定用户
     *
     * @param to
     *            , 邮件发送对象
     * @return ture 发送成功, false发送失败
     */
    public Boolean send(String to) {

        List<String> toList = new ArrayList<>();
        toList.add(to);

        return send(toList);
    }

    /**
     * 群发邮件
     *
     * @param toList
     *            ,需要接受邮件的用户
     * @return ture 发送成功, false发送失败
     */
    public Boolean send(List<String> toList) {

        // Get system properties
        Properties properties = System.getProperties();

        // Setup mail server
        properties.setProperty("mail.smtp.host", host);
        properties.setProperty("mail.smtp.port", port);
        properties.put("mail.smtp.auth", "true");

        // create email authenticator.
        Authenticator authenticator = new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        };

        // Get the default Session object.
        Session session = Session.getDefaultInstance(properties, authenticator);

        try {
            // Create a default MimeMessage object.
            MimeMessage message = new MimeMessage(session);

            // Set From: header field of the header.
            message.setFrom(new InternetAddress(from));

            // Set To: header field of the header.
            for (String to : toList) {
                message.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(to));
            }

            // Set Subject: header field
            message.setSubject(getSubject(), "utf-8");

            // Create the message part
            BodyPart messageBodyPart = new MimeBodyPart();

            // Fill the message
            messageBodyPart.setContent(getContent(), "text/html;charset=utf-8");

            // Create a multipar message
            Multipart multipart = new MimeMultipart();

            // Set text message part
            multipart.addBodyPart(messageBodyPart);

            // add attachment
            List<File> attchments = getAttachments();
            if (attchments != null && attchments.size() > 0) {
                for (File attachment : attchments) {
                    messageBodyPart = new MimeBodyPart();
                    DataSource source = new FileDataSource(attachment);
                    messageBodyPart.setDataHandler(new DataHandler(source));
                    messageBodyPart.setFileName(attachment.getName());
                    multipart.addBodyPart(messageBodyPart);
                }
            }

            // Send the complete message parts
            message.setContent(multipart);

            // Send message
            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (MessagingException mex) {
            mex.printStackTrace();

            return false;
        }

        return true;
    }

    /**
     * 获取邮件主题,支持html格式。
     *
     * @return
     */
    protected abstract String getSubject();

    /**
     * 获取邮件内容,支持html格式。
     *
     * @return
     */
    protected abstract String getContent();

    /**
     * 获取附件列表,若不需要发送附件,请返回null或长度为0的List<File>列表.<br />
     *
     * @return
     */
    protected abstract List<File> getAttachments();

}

与邮件发送服务器相关信息存储在properties.xml文件中,文件结构如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>邮件系统配置文件</comment>

    <entry key="EMAIL_HOST">smtp.126.com</entry>

    <entry key="EMAIL_HOST_PORT">25</entry>

    <entry key="EMAIL_USER_NAME"><username>@126.com</entry>

    <entry key="EMAIL_PASSWORD"><password></entry>

    <entry key="EMAIL_SENDER"><username>@126.com</entry>
</properties>

PropertiesUtil类用于读取properties.xml文件中的属性,代码如下:

/**
 *
 */
package com.iot.common.email;

import java.io.IOException;
import java.io.InputStream;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

/**
 * @author Sam <br />
 * 读取properties信息 <br />
 *
 */
public class PropertiesUtil {

    /**
     * Get property by name
     *
     * @param name
     * @return
     */
    public static String getProperty(String name) {
        return properties.getProperty(name);
    }

    private static Properties properties;

    /****
     * Initialize properties
     */
    static {
        String filePath = "properties.xml";
        InputStream stream = PropertiesUtil.class.getClassLoader()
                .getResourceAsStream(filePath);

        properties = new Properties();

        try {
            properties.loadFromXML(stream);
        } catch (InvalidPropertiesFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

静态常量类Contanst代码如下:

package com.iot.common.email;

/**
 *
 * @author Lynn
 *
 *         Store all constant field
 *
 */
public class Constant {

    /* email sending information */
    public static final String EMAIL_HOST = "EMAIL_HOST";
    public static final String EMAIL_HOST_PORT = "EMAIL_HOST_PORT";
    public static final String EMAIL_USER_NAME = "EMAIL_USER_NAME";
    public static final String EMAIL_PASSWORD = "EMAIL_PASSWORD";
    public static final String EMAIL_SENDER = "EMAIL_SENDER";

}

测试代码如下:

 1 package com.iot.common.email;
 2
 3 import java.io.File;
 4
 5 import java.util.ArrayList;
 6
 7 import java.util.List;
 8
 9 public class EmailTest {
10
11     /**
12      * @param args
13      */
14     public static void main(String[] args) {
15         // TODO Auto-generated method stub
16
17         EmailSender sender = new EmailSender() {
18
19             @Override
20             protected String getSubject() {
21                 // TODO Auto-generated method stub
22                 return "测试邮件,请不要回复";
23             }
24
25             @Override
26             protected String getContent() {
27                 // TODO Auto-generated method stub
28                 return "<h1>尊敬的用户:</h1><br /><p>这是一封测试邮件,请不要恢复改邮件!</p>";
29             }
30
31             @Override
32             protected List<File> getAttachments() {
33                 // TODO Auto-generated method stub
34
35                 List<File> files=new ArrayList<>();
36                 files.add(new File("d:/district.txt"));
37                 files.add(new File("d:/test2.jar"));
38
39                 return files;
40             }
41         };
42
43         List<String> to = new ArrayList<>();
44         to.add("[email protected]");
45         to.add("[email protected]");
46         to.add("[email protected]");
47
48         sender.send(to);
49
50     }
51
52 }
时间: 2024-11-06 19:36:39

使用JavaMail API发送邮件的相关文章

JavaMail应用--通过javamail API实现在代码中发送邮件功能

JavaMail应用 在日常开发中,可能会引用到发邮件功能,例如在持续集成中,自动化测试运行完毕,自动将测试结果以报表的形式发送邮件给相关人.那么在Java中如何实现发邮件呢? 在java EE   中有个JavaMail插件 是专门解决java收发邮件功能的,下载地址:http://www.oracle.com/technetwork/java/index-138643.html 下载后我们解压压缩包,提取里面的mail.jar,引入到工程中,便可以使用JavaMail API 进行发送邮件了

Android Java使用JavaMail API发送和接收邮件的代码示例

JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html):mailapi.jar.定义了收发邮件所使用到的接口API:smtp.jar.包含了发送邮件使用到的类:pop3.

JavaMail API的应用

JavaMail API 是一个用于阅读.编写和发送电子消息的可选包(标准扩展),用来创建邮件用户代理(Mail User Agent,MUA)类型程序. JavaMail API 需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理. 下载后解压.zip 文件,将 mail.jar 文件和 activation.jar 文件复制到 JRE(Java 运行时环境,Java Runtime Environment)目录下的 lib/ext 目录中去.

JavaMail API 1.4.7邮件发送

下载oracle javaMail API: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.5-oth-JPR 下载:JavaMail API 1.4.7 解压缩将lib文件夹中的jar文件全部拷贝到 [email protected]:~/Documents/eclipsedoc/workspace/ja

javamail模拟邮箱功能收取电子邮件-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)

引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  -->javamail模拟邮箱功能发送电子邮件-中级实战篇[新增附件发送方法](javamail API电子邮件实例) 在上一篇中,讲解了邮件发送的两个基本方法(HTML和附件),并且引入了两个新类 Multipart 和 BodyPart 两类,整体结构比较紧凑,邮件的服务

JavaMail API 详细分解

在使用Spring框架的过程中,它的优势之一就是在于跟其他一些技术的整合,如JavaMail .任务调度.缓存策略等技术.今天就Java Mail详细阐述.JavaMail API是被设计为与协议无关的,但是目前我们并不能克服这些协议的束缚.了解JavaMail之前,需要详细了解几个邮件协议,SMTP POP IMAP MIME,现就这些协议详细分析如下: 1.SMTP协议:简单邮件传输协议定义了递送邮件的机制.这个SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者

javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  -->javamail模拟邮箱功能获取邮件内容-中级实战篇[内容|附件下载方法](javamail API电子邮件实例) 在上一篇中,讲解了邮件获取内容的两个方法(HTML和附件),简单介绍了邮件发送和内容获取的相同和不同之处,并且引入了新类-->javax.mail.St

JavaMail API详解

版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html关键字:java,mail,pop,smtp 一.JavaMail API简介JavaMail API是读取.撰写.发送电子信息的可选包.我们可用它来建立

javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一篇了,上次更新完查看方法后,本打算周末更新的,没想今天周五挺闲,就地正法算了...就赶紧再下班前写完了.阅读本章节前建议阅读之前章节,因为这章是在之前的基础上增加的业务方法,不看之前的可能有点云里雾里.  点我前往 邮件标志:是指给邮件message对象设置一个Flag内部类里的属性字段,标志类型会