β

使用Java发送邮件的一个简单示例与一些思考

Yuan 370 阅读

近日,在做一个课程上的作业项目,我们组做的是图书管理系统网站(Low..),为了保证网站的安全性,我们要添加一个用户在用户注册时发送邮件验证的功能,于是我就去学习了一下用Java发邮件的相关知识。

在Google上搜了一下,发现大多数人都是用javax.mail这个库来写的,同时在stackoverflow上看到了一个问题的回答,于是就在他们的基础上,结合QQ邮箱的设置,写了一个小小的EmailSender类,希望能帮助到想要用Java发邮件的同学。

Stackoverflow-How to send an email by Java application using Gmail/ Yahoo/ Hotmail

代码:

//package hello.utils;

import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import java.util.*;
import java.util.concurrent.TransferQueue;
import javax.mail.*;
import javax.mail.internet.*;

/**
 * Class EmailSender : using javax.mail library
 * Sent a email to specific email address
 *
 * @author yuan
 * @version 0.0.2
 * @modify 2015-05-22 19:28:09
 */
public class EmailSender {

        private static final String USER_NAME = "xxx@qq.com";
        private static final String PASSWORD = "password";

    /**
     * Method sendTo : sent a email with specific content to user's email address
     * If there are any problem during sending, it will throw a exception out
     *
     * @param recipient the reciever's email address
     * @param content   the content of email : with HTML format
     * @throws Exception
     */
    public static void sendTo(final String recipient, final String content) throws Exception {

        //Construct the message
        String to = recipient;
        String subject = "Validate your account";

        //Set up the SMTP server
        Properties props = System.getProperties();
        props.put("mail.smtp.host", "smtp.qq.com");
//        props.put("mail.smtp.host", "smtp.exmail.qq.com");
        props.put("mail.smtp.user", USER_NAME);
        props.put("mail.smtp.password", PASSWORD);
//        props.put("mail.smtp.port", "456");
        props.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props);
        MimeMessage message = new MimeMessage(session);

//        try {
        //Set up message
        message.setFrom(new InternetAddress(USER_NAME));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
        message.setSubject(subject);
        message.setSentDate(new Date());
        Multipart multipart = new MimeMultipart();
        BodyPart bodyPart = new MimeBodyPart();
        bodyPart.setContent(content, "text/html; charset=utf-8");
        multipart.addBodyPart(bodyPart);
        message.setContent(multipart);

        //Send the message
        Transport transport = session.getTransport("smtp");
        transport.connect("smtp.qq.com", USER_NAME, PASSWORD);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();

//        }catch (AddressException ae) {
//            ae.printStackTrace();
//            return false;
//        }
//        catch (MessagingException me) {
//            me.printStackTrace();
//            return false;
//        }
    }
}

使用的时候先设置一下帐号密码,然后直接使用

EmailSender.sendTo("xxxx@xx.com", "<html></html>");
就可以发送邮件了。

最后,在能成功发送邮件后,我有几点思考,但是由于项目时间有限,并没有实现:

  • 我们发现,这个邮件发送程序是阻塞的,也就是说虽然遇到无法连接邮件发送服务器等问题会抛出异常,但并不可完全信任,也就是说它完全有可能会将整个线程阻塞掉,或者需要等待很长的时间,这个过程是需要用户去等待的。
  • 为了解决上面的问题,我们可不可以每次创建一个新的线程去发送邮件,解决阻塞的问题。
  • 假如用上面创建新的线程的方法解决问题,假如邮件没有发送成功,如何确定一个重发机制?这里也许就需要一个线程专门维护一个发送邮件的任务队列,他负责监听队列内是否为空值,然后自动发送邮件,查看邮件发送状态是否成功决定重发等等。
  • 貌似可以用Java中的阻塞队列来实现,但是还有个小问题。。可能过于追求完美了,假如发到一半电脑出故障了或者断电了,如何保证未发送邮件的可恢复性?好吧,要上数据库了吗(个人见识有限,看到这篇文章的人如果有好的方法,代价低的方法,还请告知)。
作者:Yuan
原代码
原文地址:使用Java发送邮件的一个简单示例与一些思考, 感谢原作者分享。

发表评论