基于JavaMail实现邮件发送

 更新时间:2018年03月23日 09:13:37   作者:玩命丶DAN  
这篇文章主要为大家详细介绍了基于JavaMail实现邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

通过javamail 实现发送邮件,供大家参考,具体内容如下

注意:服务器有些端口是没有开放的 需要去开放端口。 有些邮箱是需要开启对应授权服务的。

1.maven依赖:

<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api --> 
<dependency >  
  <groupId >javax.mail </groupId >  
  <artifactId >mail </artifactId >  
  <version >1.4.5 </version >  
</dependency >  
<dependency >  
  <groupId >com.sun.mail </groupId >  
  <artifactId >javax.mail </artifactId >  
  </dependency >  

2.新建个实体类 用来保存信息

import java.util.Properties; 
public class MailSenderInfo { 
   // 发送邮件的服务器的IP(或主机地址) 
   private String mailServerHost; 
   // 发送邮件的服务器的端口 
   private String mailServerPort; 
   // 发件人邮箱地址 
   private String fromAddress; 
   // 收件人邮箱地址 
   private String toAddress; 
   // 登陆邮件发送服务器的用户名 
   private String userName; 
   // 登陆邮件发送服务器的密码 
   private String password; 
   // 是否需要身份验证 
   private boolean validate = true; 
   // 邮件主题 
   private String subject; 
   // 邮件的文本内容 
   private String content; 
   // 邮件附件的文件名 
   private String[] attachFileNames; 
    
   public Properties getProperties() { 
   Properties p = new Properties(); 
   p.put("mail.smtp.host", this.mailServerHost); 
   p.put("mail.smtp.port", this.mailServerPort); 
   //设置是否安全验证,默认为false,一般情况都设置为true 
   p.put("mail.smtp.auth", "true");  
   p.put("mail.smtp.starttls.enable","true");  
   p.put("mail.smtp.EnableSSL.enable","true"); 
   return p; 
   } 
   public String getMailServerHost() { 
   return mailServerHost; 
   } 
   public void setMailServerHost(String mailServerHost) { 
   this.mailServerHost = mailServerHost; 
   } 
   public String getMailServerPort() { 
   return mailServerPort; 
   } 
   public void setMailServerPort(String mailServerPort) { 
   this.mailServerPort = mailServerPort; 
   } 
   public boolean isValidate() { 
   return validate; 
   } 
   public void setValidate(boolean validate) { 
   this.validate = validate; 
   } 
   public String[] getAttachFileNames() { 
   return attachFileNames; 
   } 
   public void setAttachFileNames(String[] fileNames) { 
   this.attachFileNames = fileNames; 
   } 
   public String getFromAddress() { 
   return fromAddress; 
   } 
   public void setFromAddress(String fromAddress) { 
   this.fromAddress = fromAddress; 
   } 
   public String getPassword() { 
   return password; 
   } 
   public void setPassword(String password) { 
   this.password = password; 
   } 
   public String getToAddress() { 
   return toAddress; 
   } 
   public void setToAddress(String toAddress) { 
   this.toAddress = toAddress; 
   } 
   public String getUserName() { 
   return userName; 
   } 
   public void setUserName(String userName) { 
   this.userName = userName; 
   } 
   public String getSubject() { 
   return subject; 
   } 
   public void setSubject(String subject) { 
   this.subject = subject; 
   } 
   public String getContent() { 
   return content; 
   } 
   public void setContent(String textContent) { 
   this.content = textContent; 
   } 
} 

3.创建一个验证器

import javax.mail.Authenticator; 
import javax.mail.PasswordAuthentication; 
 
/** 
 * 邮件用户名和密码认证器 
 */ 
public class MyAuthenticator extends Authenticator{ 
   String userName = null; 
   String password = null; 
   public MyAuthenticator() { 
   } 
   public MyAuthenticator(String username, String password) { 
   this.userName = username; 
   this.password = password; 
   } 
   protected PasswordAuthentication getPasswordAuthentication() { 
   return new PasswordAuthentication(userName, password); 
   } 
} 

4.在调用的地方给实体类赋值

private void email(HttpSession session, String email) { 
    // 设置邮件服务器信息 
    MailSenderInfo mailInfo = new MailSenderInfo(); 
    mailInfo.setMailServerHost("smtp-mail.outlook.com");// 发送邮件的服务器的IP(或主机地址) 
    mailInfo.setMailServerPort("587");//有些端口在服务器上是没开放的 这里需要注意下 
    mailInfo.setValidate(true); 
    // 邮箱用户名(根据自己情况设置) 这里可以多弄几个邮箱过来 避免邮箱账号需要验证 或者被当成垃圾邮件封号 A失败就用B 
    mailInfo.setUserName("此处填写跟上面发送邮件服务器对应的邮箱"); 
    // 邮箱密码(根据自己情况设置) 
    mailInfo.setPassword("这是你的密码"); 
    // 发件人邮箱(根据自己情况设置,如果你没对邮箱进行特别设置,应该和邮箱用户名一致) 
    mailInfo.setFromAddress("这里跟上面一样"); 
    // 收件人邮箱(根据自己情况设置) 
    mailInfo.setToAddress(email); 
    // 邮件标题 
    mailInfo.setSubject("我是标题"); 
    // 邮件内容 
    mailInfo.setContent("我是内容,正经的内容不是垃圾邮箱"); 
    // 发送邮件 
    SimpleMailSender sms = new SimpleMailSender(); 
    // 发送文体格式 
    sms.sendTextMail(mailInfo); 
  } 

5.这里才是真正的发送邮件

public class SimpleMailSender { 
  public boolean sendTextMail(MailSenderInfo mailInfo) { 
     // 判断是否需要身份认证 
     MyAuthenticator authenticator = null; 
     Properties pro = mailInfo.getProperties(); 
     if (mailInfo.isValidate()) { 
      // 如果需要身份认证,则创建一个密码验证器 
      authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); 
     } 
     // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
     Session sendMailSession = Session.getDefaultInstance(pro, authenticator); 
     try { 
      // 根据session创建一个邮件消息 
      Message mailMessage = new MimeMessage(sendMailSession); 
      // 创建邮件发送者地址 
      Address from = new InternetAddress(mailInfo.getFromAddress()); 
      // 设置邮件消息的发送者 
      mailMessage.setFrom(from); 
      // 创建邮件的接收者地址,并设置到邮件消息中 
      Address to = new InternetAddress(mailInfo.getToAddress()); 
      mailMessage.setRecipient(Message.RecipientType.TO, to); 
      // 设置邮件消息的主题 
      mailMessage.setSubject(mailInfo.getSubject()); 
      // 设置邮件消息发送的时间 
      mailMessage.setSentDate(new Date()); 
      // 设置邮件消息的主要内容 
      String mailContent = mailInfo.getContent(); 
      mailMessage.setText(mailContent); 
      mailMessage.saveChanges(); 
      // 发送邮件 
      Transport.send(mailMessage); 
      return true; 
     } catch (MessagingException ex) { 
      ex.printStackTrace(); 
     } 
     return false; 
     } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java多线程并发编程 Synchronized关键字

    Java多线程并发编程 Synchronized关键字

    现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test 的 synchronized 方法,此时线程 B 无法获得 Test 的同步锁,必须等待线程 A 释放 Test 的同步锁才能获得从而执行对应方法的代码
    2017-05-05
  • springboot+mybatis拦截器方法实现水平分表操作

    springboot+mybatis拦截器方法实现水平分表操作

    这篇文章主要介绍了springboot+mybatis拦截器方法实现水平分表操作,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • 详解Spring 两种注入的方式(Set和构造)实例

    详解Spring 两种注入的方式(Set和构造)实例

    本篇文章主要介绍了Spring 两种注入的方式(Set和构造)实例,Spring框架主要提供了Set注入和构造注入两种依赖注入方式。有兴趣的可以了解一下。
    2017-02-02
  • Java仿淘宝首页分类列表功能的示例代码

    Java仿淘宝首页分类列表功能的示例代码

    这篇文章主要介绍了仿淘宝分类管理功能的示例代码,具有很好的参考价值,希望对大家有所帮助,也给大家做个参考
    2018-05-05
  • 详解Java线程池如何统计线程空闲时间

    详解Java线程池如何统计线程空闲时间

    这篇文章主要和大家分享一个面试题:Java线程池是怎么统计线程空闲时间?文中的示例代码讲解详细,对我们掌握Java有一定帮助,需要的可以参考一下
    2022-11-11
  • Java日常练习题,每天进步一点点(22)

    Java日常练习题,每天进步一点点(22)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • MyBatis参数处理实现方法汇总

    MyBatis参数处理实现方法汇总

    这篇文章主要介绍了MyBatis参数处理实现方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • JVM参数NativeMemoryTracking的使用

    JVM参数NativeMemoryTracking的使用

    本文主要介绍了JVM参数NativeMemoryTracking的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 如果你想写自己的Benchmark框架(推荐)

    如果你想写自己的Benchmark框架(推荐)

    这篇文章主要介绍了如果你想写自己的Benchmark框架,本文通过给大家分享八条军规,帮助大家理解,需要的朋友可以参考下
    2020-07-07
  • Java判断文件或者文件夹是否存在的功能(不存在创建,存在删除)

    Java判断文件或者文件夹是否存在的功能(不存在创建,存在删除)

    在Java中,要判断文件或文件夹是否存在,并根据判断结果来执行创建或删除操作,你可以使用java.io.File类或者java.nio.file包中的类,本文介绍Java判断文件或者文件夹是否存在,不存在创建,存在删除,感兴趣的朋友一起看看吧
    2025-03-03

最新评论