最近在做一个邮件发送的功能,以前知道Javamail可以实现Java的邮件发送功能,可是只是知道而已,还没有过自己实践过,今天正好要开发这个功能,所以就实现了一下这个功能。

JavaMail简介

JavaMail是由Sun定义的一套收发电子邮件的api,不同的厂商可以提供自己实现类。
厂商提供的JavaMail服务可以由选择的实现某些邮件的协议,而常见的邮件协议则SMTP,POP3,IMAP
1. SMTP 发送邮件的协议,用来发送电子邮件
2. POP3 用于接收邮件的协议。
3. IMAP POPS的一个替代品
而这三种协议都有对应的SSL加密方式,分别是SMTPS,POP3S,IMAPS。
除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。下图描述了JavaMail的体系结构。
mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;
activation.jar:此JAR文件包含JAF API和Sun的实现。

相关API

MimeMessage类表示整封邮件。

MimeBodyPart类表示邮件的一个Mime消息。

Mimemultipart类表示一个由多个Mime消息组合成的组合Mime消息。

java 发送邮件报错 java发邮件要收费吗_java

JavaMail API收发邮件

使用javaMail发送一封简单的邮件:

1.创建包含邮件服务器的网络连接信息的Session对象

2.创建代表邮件内容的Message对象

3.创建Transprot对象,连接服务器,发送message消息,并关闭连接。

java 发送邮件报错 java发邮件要收费吗_java_02

程序

下边的这个方法支持当个发送,也支持群发邮件,但是群发邮件的话,多个地址需要用“,”来连接起来。大家可以参照上边API收发邮件的步骤来看一下我们是如何发送邮件的。

public class MailUtils {
    private static String host;
    private static String username;
    private static String password;
    private static String from;
    private static String nick;

    static {
        try {
            // Test Data
            host = "smtp.163.com";     //如果你用的不是163的话,自己上网找一下吧。
            username = "****@163.com"; //用户名,一般就是咱们的邮箱地址
            password = "****";         //登陆密码
            //nick + from 组成邮箱的发件人信息
            from = "****@163.com";     //邮箱账号
            nick = "ermu测试邮件";          //发件人名称    

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送邮件
     * 
     * @param toSomeone
     *            收件人列表,以","分割
     * @param subject
     *            标题
     * @param body
     *            内容
     * @param filepath
     *            附件列表,无附件传递null
     * @return
     * @throws MessagingException
     * @throws AddressException
     * @throws UnsupportedEncodingException
     */
    public static boolean sendMail(String toSomeone, String subject, String body)
            throws AddressException, MessagingException,
            UnsupportedEncodingException {

        // 创建Properties对象
        Properties props = System.getProperties();
        // 创建信件服务器
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true"); // 通过验证
        // 得到默认的对话对象
        Session session = Session.getDefaultInstance(props, null);
        // 参数修饰
        if (body == null) {
            body = "";
        }
        if (subject == null) {
            subject = "无主题";
        }
        // 创建一个消息,并初始化该消息的各项元素
        MimeMessage msg = new MimeMessage(session);
        nick = MimeUtility.encodeText(nick);
        msg.setFrom(new InternetAddress(nick + "<" + from + ">"));
        msg.setText(body, "UTF-8");   //设置格式,否则会出现乱码现象。
        // 创建收件人列表
        if (toSomeone != null && toSomeone.trim().length() > 0) {
            String[] arr = to.split(",");
            int receiverCount = arr.length;
            if (receiverCount > 0) {
                    //创建收件人的数组,用来群发邮件
                InternetAddress[] address = new InternetAddress[receiverCount];
                for (int i = 0; i < receiverCount; i++) {
                    address[i] = new InternetAddress(arr[i]);
                }
                msg.addRecipients(Message.RecipientType.TO, address);
                //设置主题
                msg.setSubject(subject);
                // 后面的BodyPart将加入到此处创建的Multipart中
                Multipart mp = new MimeMultipart();
                // 设置信件头的发送日期
                msg.setSentDate(new Date());
                msg.saveChanges();
                // 发送信件
                Transport transport = session.getTransport("smtp");
                transport.connect(host, username, password);
                transport.sendMessage(msg,
                        msg.getRecipients(Message.RecipientType.TO));
                transport.close();
                return true;
            } else {
                System.out.println("None receiver!");
                return false;
            }
        } else {
            System.out.println("None receiver!");
            return false;
        }
    }

    public static void main(String[] args) throws AddressException,
            UnsupportedEncodingException, MessagingException {
        List<String> filepath = new ArrayList<String>();
        sendMail("***@qq.com,****@163.com", "实习验收", "实习验收,有附件<br>孟海滨");
    }
}

效果如下:

java 发送邮件报错 java发邮件要收费吗_发邮件_03

小结

这个JavaMail虽然很好用,而且功能也很完善,但是还由一个非常不好的地方,就是邮件的内容不能排版,而这个,就得HtmlMail来解决了,这个我们下片博客来讲一下吧。