【知识积累】JavaMail实现发邮件功能

简介: 今天闲来没事,想着通过程序来给别人发邮件。于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附件时,附件里的内容总是会显示在正文里面,并且还会出现正文乱码的现象,之后经过不断的查阅资料,终 于解决了问题,实现了我自己想要的功能。

一、前言

  今天闲来没事,想着通过程序来给别人发邮件。于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附件时,附件里的内容总是会显示在正文里面,并且还会出现正文乱码的现象,之后经过不断的查阅资料,终 于解决了问题,实现了我自己想要的功能。

二、准备工作

  需要的jar包下载地址:https://java.net/projects/javamail/pages/Home

三、源代码

  主要的类有三个,代码分别如下。

  3.1 MailSenderInfo

  MailSenderInfo封装了邮件的基本信息。

package com.leesf.util;
import java.util.Properties;  
public class MailSenderInfo {    
    // 发送邮件的服务器的IP和端口    
    private String mailServerHost;    
    private String mailServerPort = "25";    
    // 邮件发送者的地址    
    private String fromAddress;    
    // 邮件接收者的地址    
    private String toAddress;    
    // 登陆邮件发送服务器的用户名和密码    
    private String userName;    
    private String password;    
    // 是否需要身份验证    
    private boolean validate = false;    
    // 邮件主题    
    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);    
      p.put("mail.smtp.auth", validate ? "true" : "false");    
      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.2 SimpleMailSender


SimpleMailSender 实现发送邮件的功能。


package com.leesf.util;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;    
import java.util.Properties;   
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;    
import javax.mail.BodyPart;    
import javax.mail.Message;    
import javax.mail.MessagingException;    
import javax.mail.Multipart;    
import javax.mail.Session;    
import javax.mail.Transport;    
import javax.mail.internet.InternetAddress;    
import javax.mail.internet.MimeBodyPart;    
import javax.mail.internet.MimeMessage;    
import javax.mail.internet.MimeMultipart;    
import javax.mail.internet.MimeUtility;
public class SimpleMailSender  {    
    /**   
     * 以文本格式发送邮件   
     * @param mailInfo 待发送的邮件的信息   
     * @throws UnsupportedEncodingException
     */    
    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);
          // 发送邮件    
          Transport.send(mailMessage);   
          return true;    
      } catch (MessagingException ex) {    
          ex.printStackTrace();    
      }    
      return false;    
    }    
    /**   
      * 以HTML格式发送邮件   
      * @param mailInfo 待发送的邮件信息   
      */    
    public boolean sendHtmlMail(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());    
          // Message.RecipientType.TO属性表示接收者的类型为TO    
          mailMessage.setRecipient(Message.RecipientType.TO,to);    
          // 设置邮件消息的主题    
          mailMessage.setSubject(mailInfo.getSubject());    
          // 设置邮件消息发送的时间    
          mailMessage.setSentDate(new Date());    
          // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象    
          Multipart mainPart = new MimeMultipart();    
          // 创建一个包含HTML内容的MimeBodyPart    
          BodyPart html = new MimeBodyPart();    
          // 设置HTML内容    
          html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");    
          mainPart.addBodyPart(html);    
          // 将MiniMultipart对象设置为邮件内容    
          mailMessage.setContent(mainPart);    
          // 发送邮件    
          Transport.send(mailMessage);    
          return true;    
      } catch (MessagingException ex) {    
          ex.printStackTrace();    
      }    
      return false;    
    }  
    /**   
      * 以HTML格式发送邮件   
      * 并且添加附件格式
      * @param mailInfo 待发送的邮件信息   
      */  
    public boolean sendAttachMail(MailSenderInfo mailInfo) throws UnsupportedEncodingException {    
        // 判断是否需要身份认证    
        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());  
              //设置带附件的格式
              Multipart multipart = new MimeMultipart();  
              //设置正文
              MimeBodyPart textBodyPart = new MimeBodyPart();   
              textBodyPart.setText(mailInfo.getContent());  
              multipart.addBodyPart(textBodyPart);   
              //设置附件  
              MimeBodyPart attrBodyPart = new MimeBodyPart();
              DataSource dataSource = new FileDataSource(new File("C:\\Users\\LEESF\\Desktop\\test.txt"));  
              attrBodyPart.setDataHandler(new DataHandler(dataSource));  
              // 设置编码格式,使附件能正常显示中文名  
              attrBodyPart.setFileName(MimeUtility.encodeText("test.txt", "gbk", "B"));   
              multipart.addBodyPart(attrBodyPart);  
              mailMessage.setContent(multipart, "text/html;charset=gbk");  
              Transport.send(mailMessage); // 发送邮件  
              return true;    
        } catch (MessagingException ex) {    
            ex.printStackTrace();    
        }    
        return false;    
    }    
}   


3.3 MyAuthenticator


MyAuthenticator类主要实现邮箱的认证。


package com.leesf.util;
import javax.mail.*;   
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);   
    }   
}

3.4 Main


用作测试使用。


package com.leesf.Main;
import java.io.UnsupportedEncodingException;
import com.leesf.util.MailSenderInfo;
import com.leesf.util.SimpleMailSender;
public class Main {
    public static void main(String[] args) throws UnsupportedEncodingException {   
     //这个类主要是设置邮件   
     MailSenderInfo mailInfo = new MailSenderInfo();   
     //服务器端口
     mailInfo.setMailServerHost("smtp.126.com");   
     //或者是通过qq邮箱发送
     //mailInfo.setMailServerHost("smtp.qq.com");
     mailInfo.setMailServerPort("25");    
     mailInfo.setValidate(true);    
     //您的邮箱用户名
     mailInfo.setUserName("leesf456@126.com");  
     //您的邮箱密码   
     mailInfo.setPassword("**********");
     //发送邮件源地址
     mailInfo.setFromAddress("leesf456@126.com");   
     //发送邮件目的地址
     mailInfo.setToAddress("********@126.com");   
     //主题
     mailInfo.setSubject("设置邮箱标题 如:http://www.cnblogs.com/leesf456/ 我的博客园");  
     //内容
     mailInfo.setContent("设置邮箱内容 如:http://www.cnblogs.com/leesf456/ 我的博客园");    
     //这个类主要来发送邮件   
     SimpleMailSender sms = new SimpleMailSender();   
     sms.sendTextMail(mailInfo);//发送文体格式    
     sms.sendHtmlMail(mailInfo);//发送html格式
     sms.sendAttachMail(mailInfo);//发送带附件格式
   }  
}

四、总结

  整个发送邮件的流程就完成了,如果按照上文来,应该是不会出现什么问题,源代码已经上传至github,欢迎fork,谢谢各位园友的观看~

目录
相关文章
|
4月前
|
存储 安全 搜索推荐
想要解析邮件?IMAP协议轻松助你,不再烦恼!
电子邮件仍是关键的通讯工具,利用编程语言自动化处理能显著提高效率。本文介绍使用Go语言从IMAP服务器读取、解析邮件及处理相关信息。首先概述POP3/IMAP/SMTP协议的作用,强调IMAP协议的优势及其在邮件客户端与服务器间双向同步的特点。接着,指导如何获取授权码以连接第三方服务。通过实战演示,展示使用`go-imap`库连接服务器、读取邮件详情(如主题、收件人等)、标记邮件为已读的过程。最后,对比`Store`与`UidStore`方法的区别,指出使用`UidStore`更安全可靠。本文提供了一段详细的Go语言示例代码,帮助读者快速上手。
99 4
|
6月前
|
Java 数据安全/隐私保护
Springboot拓展之整合邮件 JavaMail的使用与实操
Springboot拓展之整合邮件 JavaMail的使用与实操
49 0
|
6月前
|
存储 Java API
JavaMail实现收发邮件
JavaMail 是一套用于发送和接收电子邮件的API,由Sun定义,但不包含在JDK中,属于JavaEE的一部分。它支持SMTP、POP3和IMAP等邮件协议,以及SSL加密传输。JavaMail需要JAF来处理非纯文本邮件内容,如MIME附件。关键对象包括Properties(存储服务器信息)、Session(配置信息集合和初始化环境)、Transport(发送邮件)和Store(接收邮件)。Message用于构建邮件内容,Address处理邮件地址,Authenticator处理认证。JavaMail API允许开发者自定义协议支持,如NNTP和S/MIME。
161 0
|
7月前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
122 1
|
7月前
|
存储 小程序 数据安全/隐私保护
邮件新玩法!Zoho Mail倾力打造微信小程序,邮件畅通无阻
Zoho Mail推出微信小程序,用户可在微信内直接收发邮件,无需下载APP。只需企业超管在后台启用微信集成,员工授权即可使用。目前1.0版本不支持通讯录集成,写信需手动输入邮箱地址。小程序提供邮件回复、新邮件撰写功能,可添加附件。如需进行复杂设置,仍需通过网页版邮箱。联系我们:support-zohomail@zohocorp.com.cn。
52 1
|
Java 区块链 PHP
即时通讯/即时聊天系统开发详细案例,即时通讯/即时聊天系统开发(JAVA及PHP开发)
  区块链的可追溯性来源于区块链数据结构的特殊性。在区块链系统中,它的链式结构是从创世区块开始的,其后系统产生的所有区块都通过父区块的哈希值前后相连,并最终能追溯到创世区块。
|
Java Shell 数据安全/隐私保护
如何利用我们搭建的Mail的发送邮件服务工具
如何利用我们搭建的Mail的发送邮件服务工具
如何利用我们搭建的Mail的发送邮件服务工具
|
程序员
程序员之路:Gmail邮箱客户端配置_
程序员之路:Gmail邮箱客户端配置_
128 0
程序员之路:Gmail邮箱客户端配置_
|
前端开发 数据库 数据安全/隐私保护
FastAPI 学习之路(五十)WebSockets(六)聊天室完善
FastAPI 学习之路(五十)WebSockets(六)聊天室完善
FastAPI 学习之路(五十)WebSockets(六)聊天室完善
|
程序员
程序员之路:Gmail邮箱客户端配置
程序员之路:Gmail邮箱客户端配置
266 0
程序员之路:Gmail邮箱客户端配置