写这篇文章是基于目前我在做的一个项目中的一个需求,邮件催交功能。
首先需要下载一个javaMail.jar ,或者是maven依赖,或者是gradle的依赖。我用的是gradle的依赖方式加载jar。
不过还是要下载一下jar包。
dependencies{
//邮件催交需要的jar compile files('E:\\ideaWorkspace\\jxls_template\\javaMail\\javax.mail-1.6.0.jar')
}
以下是实现代码:
package test.service; import com.sun.mail.util.MailSSLSocketFactory; import lombok.extern.slf4j.Slf4j; import sun.rmi.runtime.Log; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; /** * Created by czb on 2018/4/12. */ @Slf4j public class Main { //发件人的邮箱和密码 //一、发件人的邮箱需要开始SMTP服务 public static String myEmailAccount = "xxxxxxxxx@qq.com"; public static String myEmailPassword = "xxxxxxxxxxxxx";//二、授权码,并不是qq密码 //发件人邮箱的SMTP服务器地址,如果是网易邮箱,这地方就是:smtp.163.com public static String myEmailSMTPHost = "smtp.qq.com"; //收件人邮箱 public static String receiveMailAccount = "xxxxxxxxxx@qq.com"; public static void main(String[] args) { System.out.println("发送邮件开始~"); // 1. 创建参数配置, 用于连接邮件服务器的参数配置 Properties props = new Properties();// 参数配置 props.setProperty("mail.transport.protocol", "smtp");// 使用的协议(JavaMail规范要求) props.setProperty("mail.smtp.host", myEmailSMTPHost);// 发件人的邮箱的 SMTP 服务器地址 props.setProperty("mail.smtp.auth", "true");// 需要请求认证 try { //三、开启SSL加密,如果没有SSL加密,会报530错误 MailSSLSocketFactory mailSSLSocketFactory = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); props.put("mail.smtp.ssl.enable","true"); props.put("mail.smtp.ssl.socketFactory",mailSSLSocketFactory); }catch (java.security.GeneralSecurityException e){ log.error(e.getMessage()); } // 2. 根据配置创建会话对象, 用于和邮件服务器交互 Session session = Session.getInstance(props); session.setDebug(true); // 3. 创建一封邮件 MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount); try { // 4. 根据 Session 获取邮件传输对象 Transport transport = session.getTransport(); // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 transport.connect(myEmailAccount, myEmailPassword); // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 关闭连接 transport.close(); }catch (javax.mail.NoSuchProviderException e){ log.error(e.getMessage()); }catch (javax.mail.MessagingException e){ log.error(e.getMessage()); } System.out.println("发送邮件结束~"); } /** * @param session 和服务器交互的会话 * @param sendMail 发件人邮箱 * @param receiveMail 收件人邮箱 * @return message */ public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) { // 1. 创建一封邮件 MimeMessage message = new MimeMessage(session); try { // 2. From: 发件人 message.setFrom(new InternetAddress(sendMail, "大头", "UTF-8")); // 3. To: 收件人(可以增加多个收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "收件人名字", "UTF-8")); //To:增加收件人,如果要发送多个 //message.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress("xxxxxx@qq.com","最爱的明明","UTF-8")); // 4. Subject: 邮件主题 message.setSubject("邮件主题", "UTF-8"); // 5. Content: 邮件正文(可以使用html标签) Object o = "后来,终于在眼泪中明白,有些人,一旦错过就不在。妈妈说,人生不能错过的两种东西,最后一班回家的车,和一段真诚的感情,幸运的是,我只错过后者"; message.setContent(o, "text/html;charset=UTF-8"); // 6. 设置发件时间 message.setSentDate(new Date()); // 7. 保存设置 message.saveChanges(); }catch (UnsupportedEncodingException e){ log.error(e.getMessage()); }catch (MessagingException e){ log.error(e.getMessage()); } return message; } }
以上代码有三个地方我标记为红色的,是需要注意的地方。
第一个地方:
这样做完之后,第一步就没啥问题了。
第二个地方,生成授权码:
好了,第二个注意的地方就解决了。
第三个地方是因为我之前没有加上那一段代码,所以报了530错误。说是ssl的权限被拒绝了,所以连不上。加上这段代码就OK了。
到此测试代码就完成了,然后测试一下:
OK,邮件发出去了。