javaweb_邮件发送

邮件发送

1. 电子邮件

  • 要在网络上实现邮件功能,必须要有专门的邮件服务器。

  • 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

  • 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能。

2. 传输协议

SMTP协议:发送邮件:

  • 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

POP3协议:接收邮件:

  • 我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)

邮件发送原理:

 

步骤:

  1. 大狂神通过smtp协议连接到smtp服务器,然后发送一封邮件给网易的邮件服务器.

  2. 网易分析发现需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的smtp服务器.

  3. QQ将接收到的邮件存储在24736743@qq.com这个邮件账号的空间中.

  4. 小狂神通过Pop3协议连接到Pop3服务器收取邮件.

  5. 24736743@qq.com这个邮件账号的空间中取出邮件.

  6. Pop3服务器将取出来的邮件送到小狂神手中.

 

注意:有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试

3. Java发送邮件概述

我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。

使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework

我们需要得到两个jar包:

  • mail.jar

  • activation.jar

JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络:

  1. 创建包含邮件服务器的网络连接信息的Session对象。

  2. 创建代表邮件内容的Message对象。

  3. 创建Transport对象,连接服务器,发送Message,关闭连接。

     

主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。 

 

4. 实现java发送纯文本邮件

4.1 首先从邮箱中获取对应的权限:

QQ邮箱需要安全验证,我们需要获取他对应的权限:

QQ邮箱–>邮箱设置–>账户

 

 

获取到授权码 复制下来 备用

4.2 导入所需jar包

需要把这两个jar包下载下载放到Tomcat的lib目录下

 <dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1</version>
 </dependency>
 <dependency >
     <groupId >javax.mail </groupId >
     <artifactId >mail </artifactId >
     <version >1.4.7 </version >
 </dependency >

4.3 编写代码

 package com.zcc;
 import com.sun.mail.util.MailLogger;
 import com.sun.mail.util.MailSSLSocketFactory;
 
 import javax.mail.*;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import java.security.GeneralSecurityException;
 import java.util.Properties;
 
 //尝试发送一封纯文本邮件;
 public class EmailSend {
     public static void main(String[] args) throws GeneralSecurityException, MessagingException {
 
         Properties properties=new Properties();
         //设置邮件服务器;
         properties.setProperty("mail.host","smtp.163.com");
         //邮件发送协议;
         properties.setProperty("mail.transport.protocol","smtp");
         //需要验证用户名与密码;
         properties.setProperty("mail.smtp.auth","true");
 
         //QQ邮箱的SSL加密;
         /*MailSSLSocketFactory sf=new MailSSLSocketFactory();
         sf.setTrustAllHosts(true);
         properties.put("mail.smtp.ssl.enable","true");
         properties.put("mail.smtp.ssl.socketFactory",sf);*/
 
         //使用JavaMail发送邮件;
         //1.首先创建整个应用程序的全局session对象;(启动==>session销毁结束)
         //QQ的独特创建方式;===>
         /*Session session=Session.getDefaultInstance(properties, new Authenticator() {
             @Override
             protected PasswordAuthentication getPasswordAuthentication() {
                 //userName:用户名 password:授权码
                 return new PasswordAuthentication("发送人@qq.com","授权码");
             }
         });*/
 
         Session session=Session.getDefaultInstance(properties);
         //开启session的debug模式;
         session.setDebug(true);
 
         //2.session==>获取Transport对象
         Transport ts=session.getTransport();
 
         //3.使用邮箱的授权码,用户名,连接邮件的服务器;
         ts.connect("smtp.163.com","发送人@163.com","授权码");
 
         //4.创建邮件; 需要传递session;
         MimeMessage message=new MimeMessage(session);
         //需要指明邮件的发送人;
         message.setFrom(new InternetAddress("发送人@163.com"));
         //指明收件人==> 此处为自发;
         message.setRecipient(Message.RecipientType.TO,new InternetAddress("收件人邮箱"));
         //邮件标题;
         message.setSubject("520,我想对你说","utf-8");
         //文本内容;
         message.setContent("<h3 style='color: red'>我爱你</h3>","text/html;charset=UTF-8");
 
         //5.发送邮件; 需要指明发送的地址;
         ts.sendMessage(message, message.getAllRecipients());
 
         //6.关闭;
         ts.close();
    }
 }
 

5. 实现java发送带有图片和附件的邮件

先认识两个类一个名词:

MIME(多用途互联网邮件扩展类型)

MimeBodyPart类:

javax.mail.internet.MimeBodyPart类,表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

MimeMultipart类:

javax.mail.internet.MimeMultipart是抽象类,Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。

MimeMultipart对象的使用的时候需要设置setSubType()的属性值,一共就下面3种取值:

我们在使得的时候如果不知道使用哪一个,直接使用mixed即可,使用这个属性值一定不会报错。 

 

创建包含内嵌图片的邮件:

前面的例子 中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可

 package com.zcc;
 
 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.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import java.security.GeneralSecurityException;
 import java.util.Properties;
 
 public class EmailPicturesSend {
     public static void main(String[] args) throws GeneralSecurityException, MessagingException {
 
         Properties properties=new Properties();
         //设置邮件服务器;
         properties.setProperty("mail.host","smtp.163.com");
         //邮件发送协议;
         properties.setProperty("mail.transport.protocol","smtp");
         //需要验证用户名与密码;
         properties.setProperty("mail.smtp.auth","true");
 
         //QQ邮箱的SSL加密;
         /*MailSSLSocketFactory sf=new MailSSLSocketFactory();
         sf.setTrustAllHosts(true);
         properties.put("mail.smtp.ssl.enable","true");
         properties.put("mail.smtp.ssl.socketFactory",sf);*/
 
         //使用JavaMail发送邮件;
         //1.首先创建整个应用程序的全局session对象;(启动==>session销毁结束)
         //QQ的独特创建方式;===>
         /*Session session=Session.getDefaultInstance(properties, new Authenticator() {
             @Override
             protected PasswordAuthentication getPasswordAuthentication() {
                 //userName:用户名 password:授权码
                 return new PasswordAuthentication("发送人@qq.com","授权码");
             }
         });*/
 
         Session session=Session.getDefaultInstance(properties);
         //开启session的debug模式;
         session.setDebug(true);
 
         //2.session==>获取Transport对象
         Transport ts=session.getTransport();
 
         //3.使用邮箱的授权码,用户名,连接邮件的服务器;
         ts.connect("smtp.163.com","发送人@163.com","授权码");
 
         //4.创建邮件; 需要传递session;
         MimeMessage message=new MimeMessage(session);
         //需要指明邮件的发送人;
         message.setFrom(new InternetAddress("发送人@163.com"));
         //指明收件人==> 此处为自发;
         message.setRecipient(Message.RecipientType.TO,new InternetAddress("发送人邮箱"));
         //邮件标题;
         message.setSubject("520,我想对你说","utf-8");
 
         //发送包含图片的复杂邮件==========================================
         //准备图片数据。
         MimeBodyPart image = new MimeBodyPart();
         DataHandler dh = new DataHandler(new FileDataSource("D:\\JavaWeb\\源代码\\Email_java\\src\\main\\resources\\image\\05.png"));
         image.setDataHandler(dh);//在我们的Body中放入这个处理的图片数据。
         image.setContentID("mm");//给图片设置一个id,我们在后面可以使用!
 
         // 准备正文数据。
         MimeBodyPart text = new MimeBodyPart();
         //这里的cid就是上面的哪个setContentID。
         text.setContent("这是一封邮件正文带美女图片<img src='cid:mm'>的邮件", "text/html;charset=UTF-8");
 
         // 描述数据关系。
         MimeMultipart mm = new MimeMultipart();
         mm.addBodyPart(text);
         mm.addBodyPart(image);
         mm.setSubType("related");//设置MimeMultipart对象的相对熟悉为related,即发送的数据为文本+非附件资源。
 
         //设置到消息中,保存修改。
         message.setContent(mm);//把最后编辑好的邮件放到消息当中。
         message.saveChanges();//保存上面的修改。
 
         //发送包含图片的复杂邮件==========================================
 
 
         //5.发送邮件; 需要指明发送的地址;
         ts.sendMessage(message, message.getAllRecipients());
 
         //6.关闭;
         ts.close();
    }
 }
 

发送带图片和附件的复杂邮件

 package com.zcc;
 
 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.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import java.security.GeneralSecurityException;
 import java.util.Properties;
 
 public class EmailFujianSend {
     public static void main(String[] args) throws GeneralSecurityException, MessagingException {
 
         Properties properties=new Properties();
         //设置邮件服务器;
         properties.setProperty("mail.host","smtp.163.com");
         //邮件发送协议;
         properties.setProperty("mail.transport.protocol","smtp");
         //需要验证用户名与密码;
         properties.setProperty("mail.smtp.auth","true");
 
         //QQ邮箱的SSL加密;
         /*MailSSLSocketFactory sf=new MailSSLSocketFactory();
         sf.setTrustAllHosts(true);
         properties.put("mail.smtp.ssl.enable","true");
         properties.put("mail.smtp.ssl.socketFactory",sf);*/
 
         //使用JavaMail发送邮件;
         //1.首先创建整个应用程序的全局session对象;(启动==>session销毁结束)
         //QQ的独特创建方式;===>
         /*Session session=Session.getDefaultInstance(properties, new Authenticator() {
             @Override
             protected PasswordAuthentication getPasswordAuthentication() {
                 //userName:用户名 password:授权码
                 return new PasswordAuthentication("发送人@qq.com","授权码");
             }
         });*/
 
         Session session=Session.getDefaultInstance(properties);
         //开启session的debug模式;
         session.setDebug(true);
 
         //2.session==>获取Transport对象
         Transport ts=session.getTransport();
 
         //3.使用邮箱的授权码,用户名,连接邮件的服务器;
         ts.connect("smtp.163.com","发送人@163.com","授权码");
 
         //4.创建邮件; 需要传递session;
         MimeMessage message=new MimeMessage(session);
         //需要指明邮件的发送人;
         message.setFrom(new InternetAddress("发送人@163.com"));
         //指明收件人==> 此处为自发;
         message.setRecipient(Message.RecipientType.TO,new InternetAddress("收件人邮箱"));
         //邮件标题;
         message.setSubject("520,我想对你说","utf-8");
 
         //发送包含附件的复杂邮件=====================================================
 
         /*
         编写邮件内容
         1.图片
         2.附件
         3.文本
          */
 
         //图片
         MimeBodyPart body1 = new MimeBodyPart();
         body1.setDataHandler(new DataHandler(new FileDataSource("D:\\JavaWeb\\源代码\\Email_java\\src\\main\\resources\\image\\05.png")));
         body1.setContentID("mm"); //图片设置ID
 
         //文本
         MimeBodyPart body2 = new MimeBodyPart();
         body2.setContent("美女图片给你看<img src='cid:mm'>","text/html;charset=utf-8");
 
         //附件
         MimeBodyPart body3 = new MimeBodyPart();
         body3.setDataHandler(new DataHandler(new FileDataSource("D:\\JavaWeb\\源代码\\Email_java\\src\\main\\resources\\fujian\\导出简历.doc")));
         body3.setFileName("test.c"); //附件设置名字
 
         //拼装邮件正文内容
         MimeMultipart multipart1 = new MimeMultipart();
         multipart1.addBodyPart(body1);
         multipart1.addBodyPart(body2);
         multipart1.setSubType("related"); //1.文本和图片内嵌成功!
 
         //new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
         MimeBodyPart contentText =  new MimeBodyPart();
         contentText.setContent(multipart1);
 
         //拼接附件
         MimeMultipart allFile =new MimeMultipart();
         allFile.addBodyPart(body3); //附件
         allFile.addBodyPart(contentText);//正文
         allFile.setSubType("mixed"); //正文和附件都存在邮件中,所以类型设置为mixed;
 
         //设置到消息中,保存修改
         message.setContent(allFile);//将MimeMultipart放入消息对象中。
         message.saveChanges();//保存上面的修改。
 
         //发送包含附件的复杂邮件=====================================================
 
         //5.发送邮件; 需要指明发送的地址;
         ts.sendMessage(message, message.getAllRecipients());
 
         //6.关闭;
         ts.close();
    }
 }
 

Javaweb实现发送邮件

用途:

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

1. 搭建一个javaweb项目,配置Tomcat,添加jar包

 

 

2. 编写jsp注册页面

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
   <head>
     <title>$Title$</title>
   </head>
   <body>
   <form action="${pageContext.request.contextPath}/send.do" method="post">
     <p>用户名:<input type="text" name="username"></p>
     <p>密码:<input type="password" name="password"></p>
     <p>邮箱地址:<input type="text" name="email"></p>
     <p><input type="submit"> <input type="reset"></p>
   </form>
   </body>
 </html>
 

3. 编写对应的实体类

 package com.email_web.pojo;
 
 public class User {
     private String username;
     private String password;
     private String email;
 
     //省略get、set方法。 toString方法。有参无参构造
 }
 

4. 编写邮件发送的工具类

 package com.email_web.utils;
 
 import com.email_web.pojo.User;
 
 import javax.mail.*;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import java.util.Properties;
 
 //网站3秒原则:用户体验。
 //多线程实现用户体验!(异步处理)
 public class Sendmail extends Thread{
 
     //用于给用户发送邮件的邮箱。
     private String from = "邮箱用户名";
     //邮箱的用户名。
     private String username = "邮箱用户名";
     //邮箱的密码。
     private String password = "邮箱密码.";
     //发送邮件的服务器地址。
     private String host = "smtp.163.com";
 
     private User user;
     public Sendmail(User user){
         this.user = user;
    }
 
     //重写run方法的实现,在run方法中发送邮件给指定的用户.
     @Override
     public void run() {
         try{
             Properties prop = new Properties();
             prop.setProperty("mail.host", host);
             prop.setProperty("mail.transport.protocol", "smtp");
             prop.setProperty("mail.smtp.auth", "true");
 
             // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
             /*MailSSLSocketFactory sf = new MailSSLSocketFactory();
             sf.setTrustAllHosts(true);
             prop.put("mail.smtp.ssl.enable", "true");
             prop.put("mail.smtp.ssl.socketFactory", sf);*/
 
             //1、创建定义整个应用程序所需的环境信息的 Session 对象。
             Session session = Session.getDefaultInstance(prop, new Authenticator() {
                 public PasswordAuthentication getPasswordAuthentication() {
                     //发件人邮件用户名、授权码
                     return new PasswordAuthentication("邮箱用户名", "授权码");
                }
            });
 
             //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态。
             session.setDebug(true);
 
             //2、通过session得到transport对象。
             Transport ts = session.getTransport();
 
             //3、使用邮箱的用户名和授权码连上邮件服务器。
             ts.connect(host, username, password);
 
             //4、创建邮件。
             MimeMessage message = new MimeMessage(session);
             message.setFrom(new InternetAddress(from)); //发件人
             message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人
             message.setSubject("用户注册邮件"); //邮件的标题。
 
             String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题请联系网站客服!!";
 
             message.setContent(info, "text/html;charset=UTF-8");
             message.saveChanges();
 
             //发送邮件。
             ts.sendMessage(message, message.getAllRecipients());
             ts.close();
 
        }catch (Exception e) {
             throw new RuntimeException(e);
        }
    }
 
 }
 

5. 编写servlet处理类并注册

 package com.email_web.servlet;
 
 import com.email_web.pojo.User;
 import com.email_web.utils.Sendmail;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 public class EmailSend_web extends HttpServlet {
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
         //接收用户请求的参数
         String username = req.getParameter("username");
         String password = req.getParameter("password");
         String email = req.getParameter("email");
 
         //存入用户对象
         User user = new User(username, password, email);
 
         //调用发送邮件的工具类
         Sendmail sendmail = new Sendmail(user);
 
         //启动线程
         sendmail.start();
 
         //转发页面
         req.setAttribute("success","注册成功");
         req.getRequestDispatcher("/success.jsp").forward(req,resp);
 
    }
 }
 

 

 <servlet>
     <servlet-name>EmailSend_web</servlet-name>
     <servlet-class>com.email_web.servlet.EmailSend_web</servlet-class>
 </servlet>
 <servlet-mapping>
     <servlet-name>EmailSend_web</servlet-name>
     <url-pattern>/send.do</url-pattern>
 </servlet-mapping>

 

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Title</title>
 </head>
 <body>
 ${success}
 </body>
 </html>

 

6. 运行测试

 

 
posted @ 2022-05-21 10:32  超、自律即自由  阅读(110)  评论(0编辑  收藏  举报