前言 在使用Java开发项目过程中我们通常会遇到发送邮件的需求,那么系统中是如何使用Java发送邮件的呢?今天我们来了解下使用Java发送邮件的两种方式。
它们分别是使用 apache-commons-email 包来发送邮件、使用javax.mail 包来发送邮件。
我们分别对它们进行了解。
正文 JavaMail 我们来看下使用JavaMail发送一封邮件的Java代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 public class SendMail { private static final String MAIL_HOST_NAME = "smtp.qq.com" ; private static final String MAIL_SYSTEM_USER = "test@qq.com" ; private static final String MAIL_SYSTEM_PASSWORD = "SMTP授权码" ; public static boolean sendMail (String subject, List<String> receivers, List<String> copys, String msg, String attachName) { if (CollectionUtils.isEmpty(receivers) || (subject == null ) || (msg == null )) { throw new SendMailException("Email receivers or subject or content must be not null" ); } boolean isSuccess = false ; try { Properties properties = System.getProperties(); properties.setProperty("mail.smtp.host" , MAIL_HOST_NAME); properties.setProperty("mail.transport.protocol" , "smtp" ); properties.setProperty("mail.smtp.auth" , "true" ); properties.setProperty("mail.smtp.port" ,"465" ); properties.setProperty("mail.smtp.ssl.enable" ,"true" ); properties.setProperty("mail.user" ,MAIL_SYSTEM_USER ); properties.setProperty("mail.password" , MAIL_SYSTEM_PASSWORD); Session session = Session.getDefaultInstance(properties); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(MAIL_SYSTEM_USER)); for (String receiver:receivers){ message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiver)); } if (!CollectionUtils.isEmpty(copys)){ for (String copy:copys){ message.addRecipient(Message.RecipientType.CC, new InternetAddress(copy)); } } message.setSubject(subject); if (!StringUtils.isEmpty(attachName)){ BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(msg); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachName); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName("附件" ); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); }else { message.setText(msg); } Transport.send(message); isSuccess = true ; }catch (MessagingException e){ e.printStackTrace(); throw new SendMailException(e.getMessage()); } return isSuccess; } public static void main (String[] args) { List<String> list = new ArrayList<>(); list.add("test1@qq.com" ); sendMail("test" ,list,null ,"测试一下" ,null ); } }
可以看到,要发送一封邮件,Java的处理主要有以下几步:
①系统参数及属性设置,包括使用的协议(Pop3、SMTP等),是否开启ssl加密、发送邮件邮箱的用户名和密码等
②设置邮件属性,比如主题、内容、附件、接收人、抄送人等等
③发送邮件
我这儿使用的是QQ邮箱,要注意使用SMTP传输协议时,要开启SMTP,使用SSL,邮箱的认证密码不是邮箱密码,而是授权码,需要在QQ邮箱进行设置,如下:
PS:在发送邮件时,如果想插入图片,可以设置成Html的内联图片,然后通过message.setContent添加这个Html文档。还有一些其它的功能(比如给某个人发送回执等)都可以通过设置实现,有兴趣的可以看下。
整个发送邮件的代码基本如上,还是比较易于理解的,我们不再对此做过多介绍。
apache-commons-email 再来看看Apache提供的apache-commons-email这个包。
这个包就是对JavaMail进行了一层封装,我们可以看到这个工具包本质还是使用了JavaMail去发送邮件。
我们来看一个使用apache-commons-email包去发送邮件的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 public class SendMail { private static final String MAIL_HOST_NAME = "smtp.qq.com" ; private static final String MAIL_SYSTEM_USER = "test@qq.com" ; private static final String MAIL_SYSTEM_PASSWORD = "SMTP授权码" ; public static boolean sendMail (String subject, List<String> receivers,List<String> copys, String msg, String attachName) { if (CollectionUtils.isEmpty(receivers) || (subject == null ) || (msg == null )) { throw new SendMailException("Email receivers or subject or content must be not null" ); } boolean isSuccess = false ; try { MultiPartEmail email = new MultiPartEmail(); email.setHostName(MAIL_HOST_NAME); email.setSmtpPort(465 ); email.setSSL(true ); email.setAuthentication(MAIL_SYSTEM_USER,MAIL_SYSTEM_PASSWORD); for (String receiver:receivers){ email.addTo(receiver, receiver); } if (!CollectionUtils.isEmpty(copys)){ for (String copy:copys){ email.addCc(copy,copy); } } email.setFrom(MAIL_SYSTEM_USER, MAIL_SYSTEM_USER); email.setSubject(MimeUtility.encodeText(subject)); email.setMsg(msg); if ((attachName != null ) && (attachName.trim().length() > 0 )) { EmailAttachment attachment = new EmailAttachment(); attachment.setPath(attachName); attachment.setDisposition("attachment" ); email.attach(attachment); } email.send(); isSuccess = true ; } catch (EmailException e) { throw new SendMailException(e.getMessage()); } catch (UnsupportedEncodingException e) { throw new SendMailException(e.getMessage()); } return isSuccess; } public static void main (String[] args) { List<String> list = new ArrayList<>(); list.add("test1@qq.com" ); sendMail("test" ,list,null ,"测试一下" ,null ); } }
对比两个程序,可以了解apache-commons-email这个包把JavaMail的Session给我们隐藏了,使得我们更专注于API调用,同时它分出了三种邮件类型,供我们使用。
使用apache-commons-email,要发送不同类型的邮件,可以创建不同的mail class,如下:
//SimpleEmail email = new SimpleEmail();//创建简单邮件,不可添加附件、HTML文本等
//MultiPartEmail email = new MultiPartEmail();//创建能加附件的邮件,可多个、网络附件亦可
//HtmlEmail email = new HtmlEmail();//创建能加附件内容为HTML文本的邮件、HTML直接内联图片
上面基本上是使用Java发送邮件的两种方式。
我测试了一下发邮件的代码,可以成功收到邮件。如下图:
总结 在后台应用系统中邮件系统还是比较常用的,可以用来提供系统邮件预警、发送客户邮件进行活动推广等等一系列的事情。 SpringBoot里整合了JavaMail,创建SpringBoot项目时可以直接引入,是十分方便的。
在application.properties里的配置均以spring.mail开头。
1 2 3 4 5 6 7 8 9 10 11 spring.mail.host =smtp.qq.com spring.mail.username =qq邮箱 spring.mail.password =授权码 spring.mail.properties.mail.smtp.auth =true spring.mail.properties.mail.smtp.starttls.enable =true spring.mail.properties.mail.smtp.starttls.required =true spring.mail.default-encoding =UTF-8 spring.mail.protocol =smtp spring.mail.port =465