Java - HtmlEmail 邮件发送
Java 项目中常常回遇到发送邮件
Java 发送邮件有几种,今天先给大家介绍用 HtmlEmail 来发送邮件,我这里是用 Maven 来搭建的
HtmlEmail 可以抄带HTML
首先 需要导入jar 包
1 <dependency> 2 <groupId>org.apache.commons</groupId> 3 <artifactId>commons-email</artifactId> 4 <version>1.4</version> 5 </dependency>
然后我们来建立一个发送邮件的 Mail 类 JavaBean
1 public class Mail implements Serializable{ 2 3 private static final long serialVersionUID = -6390720891150157552L; 4 public static final String ENCODEING = "UTF-8"; 5 6 // 服务器地址 7 private String host; 8 // 发件人的邮箱 9 private String sender; 10 // 发件人昵称 11 private String name; 12 // 账号 13 private String username; 14 // 密码 15 private String password; 16 // 收件人的邮箱 17 private String receiver; 18 // 收件人的名称 19 private String receiverName; 20 // 收件人的邮箱(key)和名称(value) 21 private Map<String, String> to; 22 // 抄送人的邮箱(key)和名称(value) 23 private Map<String, String> cc; 24 // 秘密抄送人的邮箱(key)和名称(value) 25 private Map<String, String> bcc; 26 // 主题 27 private String subject; 28 // 信息(支持HTML) 29 private String message; 30 31 public String getHost() { 32 return host; 33 } 34 public void setHost(String host) { 35 this.host = host; 36 } 37 public String getSender() { 38 return sender; 39 } 40 public void setSender(String sender) { 41 this.sender = sender; 42 } 43 public String getReceiver() { 44 return receiver; 45 } 46 public void setReceiver(String receiver) { 47 this.receiver = receiver; 48 } 49 public String getName() { 50 return name; 51 } 52 public void setName(String name) { 53 this.name = name; 54 } 55 public String getUsername() { 56 return username; 57 } 58 public void setUsername(String username) { 59 this.username = username; 60 } 61 public String getPassword() { 62 return password; 63 } 64 public void setPassword(String password) { 65 this.password = password; 66 } 67 public String getSubject() { 68 return subject; 69 } 70 public void setSubject(String subject) { 71 this.subject = subject; 72 } 73 public String getMessage() { 74 return message; 75 } 76 public void setMessage(String message) { 77 this.message = message; 78 } 79 public String getReceiverName() { 80 return receiverName; 81 } 82 public void setReceiverName(String receiverName) { 83 this.receiverName = receiverName; 84 } 85 public Map<String, String> getTo() { 86 return to; 87 } 88 public void setTo(Map<String, String> to) { 89 this.to = to; 90 } 91 public Map<String, String> getCc() { 92 return cc; 93 } 94 public void setCc(Map<String, String> cc) { 95 this.cc = cc; 96 } 97 public Map<String, String> getBcc() { 98 return bcc; 99 } 100 public void setBcc(Map<String, String> bcc) { 101 this.bcc = bcc; 102 } 103 }
然后再来创建一个发送邮件的工具类 MailUtil
1 public class MailUtil { 2 3 public Boolean send(Mail mail){ 4 HtmlEmail email = new HtmlEmail(); 5 try { 6 // 这里是SMTP发送服务器的名字:163的如下:"smtp.163.com" 7 email.setHostName(mail.getHost()); 8 // 字符编码集的设置 9 email.setCharset(Mail.ENCODEING); 10 // 发送人的邮箱 11 email.setFrom(mail.getSender(), mail.getName()); 12 // 如果需要认证信息的话,设置认证:用户名-密码。分别为发件人在邮件服务器上的注册名称和密码 13 email.setAuthentication(mail.getUsername(), mail.getPassword()); 14 15 // 设置收件人信息 16 setTo(email, mail); 17 // 设置抄送人信息 18 setCc(email, mail); 19 // 设置密送人信息 20 setBcc(email, mail); 21 // 要发送的邮件主题 22 email.setSubject(mail.getSubject()); 23 // 要发送的信息,由于使用了HtmlEmail,可以在邮件内容中使用HTML标签 24 email.setHtmlMsg(mail.getMessage()); 25 // 发送 26 email.send(); 27 if (Log.isDebugEnabled()) { 28 Log.info(mail.getSender() + " 发送邮件到 " + mail.getReceiver()); 29 } 30 return true; 31 } catch (Exception e) { 32 e.printStackTrace(); 33 Log.info(mail.getSender() + " 发送邮件到 " + mail.getReceiver() + " 失败"); 34 return false; 35 } 36 } 37 38 /** 39 * 设置收件人信息 40 * 41 * @param email 42 * @param mail 43 * @throws EmailException 44 */ 45 private void setTo(HtmlEmail email, Mail mail) throws EmailException{ 46 // 收件人不为空 47 if (StringUtils.isNotEmpty(mail.getReceiver())) { 48 // 收件人名称不为空 49 if (StringUtils.isNotEmpty(mail.getReceiverName())) { 50 email.addTo(mail.getReceiver(), mail.getReceiverName()); 51 } else { 52 email.addTo(mail.getReceiver()); 53 } 54 } 55 // 收件人 Map 不为空 56 if (mail.getTo() != null) { 57 for (Map.Entry<String, String> entry : mail.getTo().entrySet()) { 58 // 收件人名称不为空 59 if (StringUtils.isNotEmpty(entry.getValue())) { 60 email.addTo(entry.getKey(), entry.getValue()); 61 } else { 62 email.addTo(entry.getKey()); 63 } 64 } 65 } 66 } 67 68 /** 69 * 设置抄送人信息 70 * 71 * @param email 72 * @param mail 73 * @throws EmailException 74 */ 75 private void setCc(HtmlEmail email, Mail mail) throws EmailException{ 76 // 抄送人 Map 不为空 77 if (mail.getCc() != null) { 78 for (Map.Entry<String, String> entry : mail.getCc().entrySet()) { 79 // 抄送人名称不为空 80 if (StringUtils.isNotEmpty(entry.getValue())) { 81 email.addCc(entry.getKey(), entry.getValue()); 82 } else { 83 email.addCc(entry.getKey()); 84 } 85 } 86 } 87 } 88 89 /** 90 * 设置密送人信息 91 * 92 * @param email 93 * @param mail 94 * @throws EmailException 95 */ 96 private void setBcc(HtmlEmail email, Mail mail) throws EmailException{ 97 // 密送人 Map 不为空 98 if (mail.getBcc() != null) { 99 for (Map.Entry<String, String> entry : mail.getBcc().entrySet()) { 100 // 密送人名称不为空 101 if (StringUtils.isNotEmpty(entry.getValue())) { 102 email.addBcc(entry.getKey(), entry.getValue()); 103 } else { 104 email.addBcc(entry.getKey()); 105 } 106 } 107 } 108 } 109 }
写到这里,大概也就差不多了,万里长征只有最后一步了
测试,测试,测试
这里编写一个 junit 方法来测试
1 @Test 2 public void sendMail(){ 3 Mail mail = new Mail(); 4 // 设置邮件服务器 5 mail.setHost("smtp.exmail.qq.com"); 6 // 发件人邮件地址 7 mail.setSender("[email protected]"); 8 // 发件人名称 9 mail.setName("Java.小学生"); 10 // 登录账号,一般都是和邮箱名一样吧 11 mail.setUsername("[email protected]"); 12 // 发件人邮箱的登录密码 13 mail.setPassword("xxxxxxxx"); 14 // 接收人 15 mail.setReceiver("[email protected]"); 16 mail.setReceiverName("我要女票"); 17 mail.setSubject("万里长征最后一步测试"); 18 String html = "<!DOCTYPE html>"; 19 html += "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"; 20 html += "<title>Insert title here</title>"; 21 html += "</head><body>"; 22 html += "<div style=\"width:600px;height:400px;margin:50px auto;\">"; 23 html += "<h1>我来看看邮件是否发送成功呢</h1><br/><br/>"; 24 html += "<p>下面是通过该协议可以创建一个指向电子邮件地址的超级链接,通过该链接可以在Internet中发送电子邮件</p><br/>"; 25 html += "<a href=\"mailto:[email protected]?subject=test&[email protected]&body=use mailto sample\">send mail</a>"; 26 html += "</div>"; 27 html += "</body></html>"; 28 mail.setMessage(html); 29 30 new MailUtil().send(mail); 31 }
赶紧登录邮箱看看吧
来看看这里 主题 内容,发送人名称和收件人名称是否和代码写的一样呢,如果一样的话,恭喜你成功啦
到这,其实发送邮件就算完了!!!
这里在啰嗦最后一个小知识点 mailto
mailto: 通过该协议可以创建一个指向电子邮件地址的超级链接,通过该链接可以在Internet中发送电子邮件
我们点击 send mail 会打开你邮件客户端一个发送界面,如果你有写抄带信息,也会给你带上