Java实现发送邮件功能(可带附件)

前言

  本文章实现的发送邮件功能提供三个方法:只发送简单文本信息的邮件、发送HTML格式的邮件、发送可以附带多个附件的邮件。
  以前使用Java实现邮箱功能都是依靠别人的jar包,按照别人的规则来使用,如果你只满足于用Java来发送简单文本信息的邮件,可以参考这位大神的博客:
 http://www.ykmaiz.com/article/Javabiancheng/2012/1127/194.html
 如果想了解JavaMail到底如何实现,或者是想发送能带多个附件的邮件,请往下看。
 准备好mail.jar,这个jar包网上很多,很容易就能下载到。

编码

1.编写MailSenderInfo.java

public class MailSenderInfo {
    // 用来保存发送邮件所有信息的JavaBean
    // 发送邮件的服务器地址和端口号
    private String mailServerHost;
    private String mailServerPort;
    // 邮件发送者的邮箱地址
    private String fromAddress;
    // 邮件接收者的邮箱地址
    private String toAddress;
    // 登录发送邮件服务器的用户名和密码
    private String userName;
    private String password;
    // 是否需要身份验证
    private boolean validate;
    // 邮件的主题
    private String subject;
    // 邮件的文本内容
    private String content;
    // 邮件的附件
    private File[] accessorys;

    // getter()和setter()方法
    // 获取邮件会话属性
    public Properties getProperties() {
        Properties p = new Properties();
        p.put("mail.smtp.host", mailServerHost);
        p.put("mail.smtp.port", mailServerPort);
        p.put("mail.smtp.auth", (validate ? "true" : "false"));
        return p;
    }

    public String getMailServerHost() {
        return mailServerHost;
    }

    public void setMailServerHost(String mailServerHost) {
        this.mailServerHost = mailServerHost;
    }

    public String getMailServerPort() {
        return mailServerPort;
    }

    public void setMailServerPort(String mailServerPort) {
        this.mailServerPort = mailServerPort;
    }

    public String getFromAddress() {
        return fromAddress;
    }

    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }

    public String getToAddress() {
        return toAddress;
    }

    public void setToAddress(String toAddress) {
        this.toAddress = toAddress;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isValidate() {
        return validate;
    }

    public void setValidate(boolean validate) {
        this.validate = validate;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public File[] getAccessorys() {
        return accessorys;
    }

    public void setAccessorys(File[] accessorys) {
        this.accessorys = accessorys;
    }
}

2.编写MailSender类:

public class MailSender {
    // 只发送简单文本形式的邮件
    public boolean sendTextMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份验证
        MyAuthenticator authenticator = null;
        Properties p = mailInfo.getProperties();
        // 如果需要身份验证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(p, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者的地址
            Address fromAddress = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(fromAddress);
            // 创建邮件接收者的地址
            Address toAddress = new InternetAddress(mailInfo.getToAddress());
            // 设置邮件消息的接收者
            mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息的发送时间
            mailMessage.setSentDate(new Date());
            // 设置邮件消息的主要内容
            mailMessage.setText(mailInfo.getContent());
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }

    // 发送HTML形式的邮件
    public boolean sendHtmlMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份验证
        MyAuthenticator authenticator = null;
        Properties p = mailInfo.getProperties();
        // 如果需要身份验证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(p, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者的地址
            Address fromAddress = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(fromAddress);
            // 创建邮件接收者的地址
            Address toAddress = new InternetAddress(mailInfo.getToAddress());
            // 设置邮件消息的接收者
            mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息的发送时间
            mailMessage.setSentDate(new Date());
            // MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML的内容
            html.setContent(mailInfo.getContent(), "text/html;charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MimeMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }

    // 发送带附件的邮件
    public boolean sendAccessoryMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份验证
        MyAuthenticator authenticator = null;
        Properties p = mailInfo.getProperties();
        // 如果需要身份验证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(p, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者的地址
            Address fromAddress = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(fromAddress);
            // 创建邮件接收者的地址
            Address toAddress = new InternetAddress(mailInfo.getToAddress());
            // 设置邮件消息的接收者
            mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息的发送时间
            mailMessage.setSentDate(new Date());
            // MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个MimeBodyPart来包含普通文本
            BodyPart text = new MimeBodyPart();
            // 设置text的内容
            text.setContent(mailInfo.getContent(), "text/html;charset=utf-8");
            mainPart.addBodyPart(text);
            File[] files = mailInfo.getAccessorys();
            if (files.length != 0) {
                for (int i = 0; i < files.length; i++) {
                    // 创建一个MimeBodyPart来包含附件
                    BodyPart accessory = new MimeBodyPart();
                    DataSource source = new FileDataSource(files[i]);
                    accessory.setDataHandler(new DataHandler(source));
                    accessory.setFileName(MimeUtility.encodeWord(files[i].getName()));
                    mainPart.addBodyPart(accessory);
                }
            }
            // 将MimeMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
}

3.编写MyAuthenticator.java

public class MyAuthenticator extends Authenticator {
    // 身份验证
    private String userName;
    private String password;
    public MyAuthenticator() {
    }
    public MyAuthenticator(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
}

4.编写测试类Test.java

public class Test {
    public static void main(String[] args) {
        // sendTextMail();
        // sendHtmlMail();
        sendAccessoryMail();
    }

    public static void sendTextMail() {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");
        mailInfo.setMailServerPort("25");
        // 现在邮箱服务器都是需要身份验证的,所以一直设置为true
        mailInfo.setValidate(true);
        // 使用mailInfo.setUserName("150402");也可以
        mailInfo.setUserName("150402@163.com");
        mailInfo.setPassword("zhan1");
        // 必须是邮件发送者的准确地址
        mailInfo.setFromAddress("150402@163.com");
        mailInfo.setToAddress("1563478@qq.com");
        mailInfo.setSubject("测试邮件");
        mailInfo.setContent("这里是测试邮件的内容!");
        // 发送邮件
        MailSender sender = new MailSender();
        // 发送文本邮件
        sender.sendTextMail(mailInfo);
        System.out.println("邮件发送成功!");
    }

    public static void sendHtmlMail() {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");
        mailInfo.setMailServerPort("25");
        // 现在邮箱服务器都是需要身份验证的,所以一直设置为true
        mailInfo.setValidate(true);
        // 使用mailInfo.setUserName("150402");也可以
        mailInfo.setUserName("150402@163.com");
        mailInfo.setPassword("zhan1");
        // 必须是邮件发送者的准确地址
        mailInfo.setFromAddress("150402@163.com");
        mailInfo.setToAddress("1563478@qq.com");
        mailInfo.setSubject("测试邮件");
        // 添加HTML内容
        mailInfo.setContent("<b>加粗了!</b><hr><b>hello!</b>");
        // 发送邮件
        MailSender sender = new MailSender();
        // 发送文本邮件
        sender.sendHtmlMail(mailInfo);
        System.out.println("邮件发送成功!");
    }

    public static void sendAccessoryMail() {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");
        mailInfo.setMailServerPort("25");
        // 现在邮箱服务器都是需要身份验证的,所以一直设置为true
        mailInfo.setValidate(true);
        // 使用mailInfo.setUserName("150402");也可以
        mailInfo.setUserName("150402@163.com");
        mailInfo.setPassword("zhan1");
        // 必须是邮件发送者的准确地址
        mailInfo.setFromAddress("150402@163.com");
        mailInfo.setToAddress("1563478@qq.com");
        mailInfo.setSubject("测试邮件加上附件");
        // 添加HTML内容
        mailInfo.setContent("<b>加粗了!</b><hr><b>hello!</b>");
        File[] files = { new File("c:\\2.png"), new File("c:\\1.png") };
        // 添加附件
        mailInfo.setAccessorys(files);
        // 发送邮件
        MailSender sender = new MailSender();
        // 发送文本邮件
        sender.sendAccessoryMail(mailInfo);
        System.out.println("邮件发送成功!");
    }
}

运行结果

只发送普通文本信息邮件:
  普通文本
  
发送HTML形式的邮件:
  HTML形式
  
发送带多个附件的邮件:
  多个附件
  
整个工程截图:
  工程截图

结束

  当然了,上面的测试类是无比粗糙的,完全可以采用构造方法将入口封装起来,然后导出为一个jar包,这样我也是可以提供jar包和规则给别人用的人了。
  注意,上述测试类中的邮箱服务器,邮箱账号,密码都必须改成你个人的才能正常使用。

参考

http://www.blogjava.net/wangfun/archive/2009/04/15/265748.html
http://blog.csdn.net/jbxiaozi/article/details/7351768
http://blog.sina.com.cn/s/blog_7cc3b8db010115nf.html
http://www.cnblogs.com/yejg1212/archive/2013/06/01/3112702.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值