本文章内容——通过java语言以最简单的方式实现邮件发送功能。
文章目的是能够引导读者成功发送邮件,将在帮助理解邮箱发送的同时,附上最简单的实例代码,并尽可能简洁明了。
首先了解发送邮件之原理(不需要了解的可以跳过):
首先介绍SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组由源地址向目标地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
SMTP服务器即是遵循SMTP协议的邮件发送服务器,用来发送或中转电子邮件。
更加简单的理解方式,可以这样总结 —— SMTP协议:地址获取者,寻找者。 SMTP服务器:邮件转发者。 以上构成对JAVA何以实现邮件发送之最基础解答。
图:发送SMTP邮件的基本原理
了解了SMTP服务器之后,我们要完成邮件发送的功能,只需要完成三个步骤——
1:完成开发准备
2:配置SMTP服务器
3:在JAVA中配置发件人的信息与收件人信息
1:完成开发准备
需要发件与收件邮箱 并开启SMTP服务 下图以网易163邮箱举例:
重点注意:第一次设置SMTP需要设置客户端授权密码(和邮箱登录密码不同),此后代码中的发件人密码以客户端为准。
需要导入一个JAR包(javax.mail.jar) 附上Jar包下载地址:http://www.oracle.com/technetwork/java/javamail/index-138643.html
2:配置SMTP服务器
为方便调用,首先创造一个邮件发送工具类。
邮件发送工具MailUtil包含两个方法,第一个方法用来完成SMTP服务器配置及邮件发送,第二个方法用来生成一封邮件实例。
代码已作了详细的注释,此处不作过多解释。
import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.*; import java.util.Date; import java.util.Properties; /** * @创建人 Levi * @功能描述 邮件发送工具 * @创建时间 2018-07-18 14:08:08 */ public class MailUtil { /** * SMTP服务器配置及邮件发送 * @throws Exception */ public void sendMail(MailConfig mc) throws Exception { try{ // 连接邮件服务器的参数配置 Properties props = new Properties(); // 设置用户的认证方式 props.setProperty("mail.smtp.auth", "true"); // 设置传输协议(JavaMail规范要求) props.setProperty("mail.transport.protocol","smtp"); // 设置发件人的SMTP服务器地址 props.setProperty("mail.smtp.host", "smtp.163.com"); // 设置SMTP服务器端口 一般填写:25 props.setProperty("mail.smtp.port","25"); // 创建定义整个应用程序所需的环境信息的 Session 对象 Session session = Session.getInstance(props); // 设置调试信息在控制台打印出来 session.setDebug(true); // 创建邮件的实例对象 Message msg = getMimeMessage(session,mc); // 根据session对象获取邮件传输对象Transport Transport transport = session.getTransport(); // 设置发件人的账户名和密码 if(mc.getSenderAccount()==null || mc.getSenderAccount().isEmpty()){ throw new Exception("发件人账户为空"); } if(mc.getSenderPassword()==null || mc.getSenderPassword().isEmpty()){ throw new Exception("发件人密码为空"); } transport.connect(mc.getSenderAccount(), mc.getSenderPassword()); // 发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(msg,msg.getAllRecipients()); // 关闭邮件连接 transport.close(); }catch(Exception e){ e.printStackTrace(); } } /** * 获取邮件的实例对象 * @param session * @return MimeMessage * @throws MessagingException * @throws AddressException */ private MimeMessage getMimeMessage(Session session,MailConfig mc) throws Exception{ // 创建一封邮件的实例对象 MimeMessage msg = new MimeMessage(session); // 设置发件人地址 if (mc.getSenderAddress()!=null && !mc.getSenderAddress().isEmpty()){ msg.setFrom(new InternetAddress(mc.getSenderAddress())); }else{ throw new Exception("发件人地址为空"); } /** * 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行 * MimeMessage.RecipientType.TO:发送 * MimeMessage.RecipientType.CC:抄送 * MimeMessage.RecipientType.BCC:密送 */ if (mc.getRecipientAddresses()!=null && !mc.getRecipientAddresses().isEmpty()){ InternetAddress[] recipients = new InternetAddress().parse(mc.getRecipientAddresses()); msg.setRecipients(MimeMessage.RecipientType.TO, recipients); }else{ throw new Exception("收件人地址为空"); } if (mc.getCopyToAddresses()!=null && !mc.getCopyToAddresses().isEmpty()){ InternetAddress[] copyTos = new InternetAddress().parse(mc.getCopyToAddresses()); msg.setRecipients(MimeMessage.RecipientType.CC,copyTos); } // 设置邮件主题 if (mc.getSubject()!=null && !mc.getSubject().isEmpty()){ msg.setSubject(mc.getSubject(),"UTF-8"); }else{ throw new Exception("邮件主题为空"); } //设置邮件正文 // 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart ) MimeMultipart mm = new MimeMultipart(); // 混合关系 mm.setSubType("mixed"); // 创建附件"节点" MimeBodyPart body = new MimeBodyPart(); if (mc.getContent()!=null && !mc.getContent().isEmpty()){ body.setContent(mc.getContent(), "text/html;charset=UTF-8"); }else{ throw new Exception("邮件内容为空"); } mm.addBodyPart(body); // 如果有多个附件,可以创建多个多次添加 if(mc.getAttachmentPaths()!=null && mc.getAttachmentPaths().length>0){ for (String attachmentPath: mc.getAttachmentPaths()) { // 创建附件"节点" MimeBodyPart attachment = new MimeBodyPart(); // 读取本地文件 DataHandler dh = new DataHandler(new FileDataSource(attachmentPath)); // 将附件数据添加到"节点" attachment.setDataHandler(dh); // 设置附件的文件名(需要编码) attachment.setFileName(MimeUtility.encodeText(dh.getName())); mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加 } } // 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象) msg.setContent(mm); // 设置邮件的发送时间,默认立即发送 msg.setSentDate(new Date()); msg.saveChanges(); return msg; } }
3:在JAVA中配置邮件内容
配置完SMTP服务器内容后,我们将配置邮件内容(包括发件人,收件人信息,邮件主题,内容等)
首先构建邮件实体类
public class MailConfig { //发件人地址 private String senderAddress; //发件人账户名 private String senderAccount; //发件人账户密码 private String senderPassword; /** * 收件人地址,多个以","隔开 */ private String recipientAddresses; /** * 抄送人地址,多个以","隔开 */ private String copyToAddresses; //邮件标题 private String subject; //邮件正文 private String content; //附件路径 private String[] attachmentPaths; public String getSenderAddress() { return senderAddress; } public void setSenderAddress(String senderAddress) { this.senderAddress = senderAddress; } public String getSenderAccount() { return senderAccount; } public void setSenderAccount(String senderAccount) { this.senderAccount = senderAccount; } public String getSenderPassword() { return senderPassword; } public void setSenderPassword(String senderPassword) { this.senderPassword = senderPassword; } public String getRecipientAddresses() { return recipientAddresses; } public void setRecipientAddresses(String recipientAddresses) { this.recipientAddresses = recipientAddresses; } public String getCopyToAddresses() { return copyToAddresses; } public void setCopyToAddresses(String copyToAddresses) { this.copyToAddresses = copyToAddresses; } 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 String[] getAttachmentPaths() { return attachmentPaths; } public void setAttachmentPaths(String[] attachmentPaths) { this.attachmentPaths = attachmentPaths; } }
然后,配置邮件的具体内容 并调用邮件发送工具类。
public class MailSend {
//采用单例以提供持久可用的工具类对象 static MailUtil mu = new MailUtil(); public static void main(String arg[]){ try { MailConfig mc = new MailConfig(); //设置发件人地址 mc.setSenderAddress("sender@163.com"); //设置发件人账户名 mc.setSenderAccount("sender@163.com"); //设置发件人密码(备注:密码需要用邮箱SMTP客户端授权密码,而非登录密码,此处需注意) mc.setSenderPassword("mypassword"); //设置邮件主题 mc.setSubject("邮件发送测试"); //设置收件人地址,多个地址可用逗号隔开 mc.setRecipientAddresses("xx@qq.com,xxx@163.com"); //设置抄送人地址,多个地址可用逗号隔开 mc.setCopyToAddresses("xxxx@qq.com"); //设置邮件内容 mc.setContent("邮件发送成功啦!"); //设置附件地址,多个附件地址用逗号隔开 String[] s = {"C:/测试附件1.txt","C:/测试附件2.pdf"}; mc.setAttachmentPaths(s);
//邮件信息配置完毕,调用MailUtil发送邮件。
mu.sendMail(mc); } catch (Exception e) { e.printStackTrace(); } } }
运行以上代码,邮件即可成功发送。
提示:本文展示演示代码,若需要实际测试,代码中的“账号”和“密码”需更换为自己所使用的邮箱。
代码GIT CLONE地址:https://github.com/ooo8866923/MailSend.git
以上仅为邮件发送功能的简单实现,若需进阶拓展,或了解底层,需要更进一步查阅相关书籍和网站。
本人能力有限,若文章存在纰漏,或对该文章有任何疑问,批评,建议,衷心渴望您的指教。
本文结束,感谢浏览。