电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如果通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

1. 电子邮件协议

电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

2. JavaMail

我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去 Java 或 Oracle 官网下载。

下载地址: 
https://java.net/projects/javamail/pages/Home 
或者 
http://www.oracle.com/technetwork/java/javamail/index.html

这里我从 java.NET 网站中下载一个目前最新的(release 1.5.5),包含了 SMTP, IMAP, 和 POP3 协议的实现的 jar 包:

3. 创建一封简单的电子邮件

首先创建一个 Java 工程,把下载好的 javax.mail.jar 作为类库加入工程,这里不多说。

邮件创建步骤:

  1. 创建一个邮件对象(MimeMessage);
  2. 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
  3. 设置邮件的主题(标题);
  4. 设置邮件的正文(内容);
  5. 设置显示的发送时间;
  6. 保存到本地。

代码实现:

package com.huida.util;
import java.util.Date;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MailUtil {
// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
// PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
//     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
public static String myEmailAccount = "18716029020@163.com";
public static String myEmailPassword = "fujiqing0712";
// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
public static String myEmailSMTPHost = "smtp.163.com";
// 收件人邮箱(替换为自己知道的有效邮箱)
public static String receiveMailAccount = "1106389464@qq.com";
public static void sendActiveMail(String receiveMailAccount,String mailActiveCode) throws Exception {
// 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");            // 需要请求认证
// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
//     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
//     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
/*
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
//                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
//                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
final String smtpPort = "465";
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
*/
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getDefaultInstance(props);
session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
// 3. 创建一封邮件
MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount, mailActiveCode);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
//
//    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
//           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
//           类型到对应邮件服务器的帮助网站上查看具体失败原因。
//
//    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
//           (1) 邮箱没有开启 SMTP 服务;
//           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
//           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
//           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
//           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
//
//    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
transport.connect(myEmailAccount, myEmailPassword);
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
}
/**
* 创建一封只包含文本的简单邮件
*
* @param session 和服务器交互的会话
* @param sendMail 发件人邮箱
* @param receiveMail 收件人邮箱
* @return
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,String mailActiveCode) throws Exception {
// 1. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, "惠达商城", "UTF-8"));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
// 4. Subject: 邮件主题
message.setSubject("打折钜惠", "UTF-8");
String activeUrl="http://localhost:8080/shop/shopqt/user/activemail?mailcode="+mailActiveCode;
// 5. Content: 邮件正文(可以使用html标签)
message.setContent("尊敬的用户,您好!我是符吉清,请点击激活链接完成邮箱激活"+activeUrl+"", "text/html;charset=UTF-8");
// 6. 设置发件时间
message.setSentDate(new Date());
// 7. 保存设置
message.saveChanges();
return message;
}
}

4. 发送电子邮件

发送邮件首先需要有一个邮箱账号和密码,本文以网易163邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,如下所示(其他邮箱大同小异):

激活邮件的方法

/**
* 激活邮件方法
*
* */
public ServiceReturnObj activemail(){
String mailcode = param.get("mailcode");
try {
//1.根据激活码从数据库查出用户信息
ShopUser user = shopUserDao.selectUserByMailCode(mailcode);
//2.如果能查出来那么我们就将这个用户的激活码状态变为激活
if (user!=null) {
shopUserDao.updateUserMailActive(user.getId());
}
} catch (SQLException e) {
e.printStackTrace();
return ServiceReturnObj.newServiceReturn("/success.jsp", "邮箱激活失败");
}
return ServiceReturnObj.newServiceReturn("/success.jsp", "邮箱激活成功");
}

Dao层

    public ShopUser selectUserByMailCode(String mailcode) throws SQLException {
String sql = "select * from shop_user where MAILACTIVECODE=?";
return queryRunner.query(DbUtil.getConnection(),sql,new BeanHandler(ShopUser.class),mailcode);
}
public void updateUserMailActive(String id) throws SQLException {
String sql="update shop_user set MAILACTIVEFLAG='1',MAILACTIVECODE=null where id=?";
int rows = queryRunner.update(DbUtil.getConnection(),sql,id);
}

java用户注册邮箱激活相关推荐

  1. java web 邮箱激活 与 忘记密码(重置密码)

    推荐: java后台通用权限管理系统(springboot)(https://blog.csdn.net/zwx19921215/article/details/97806078) 推荐:java 个 ...

  2. java实现邮箱激活注册账号完整案例

    项目业务流程介绍:1.用户填写用户名,邮箱,注册密码,提交注册信息(此时还不能登录系统).2.系统通过一个已配置好的QQ邮箱账号向刚刚注册的QQ邮箱发送激活邮件,邮件内容包含激活链接.3.注册用户登录 ...

  3. java实现用户注册邮箱激活验证

    功能:通过邮箱注册账号,注册成功会向邮箱发送激活邮件.提示用户登录邮箱进行账户激活,方可使用账号. 流程:本质上就是向user表里新增一条数据,user表中应有一个code字段存放随机串.code在添 ...

  4. Laravel 5.7用户注册邮箱激活的功能演示

    邮箱验证与激活,可以说是现在web app里的必备功能了,在laravel 5.7以前的版本,你得自行实现这个功能,从5.7开始,开箱即有此功能了.这里我们就演示一下,如何在用户注册了以后,自动发送一 ...

  5. Java案例-用户注册邮箱验证将邮箱激活码存入redis功能实现

    <–start–> 用户注册时,要求用户填写注册邮箱,然后后台向用户的注册邮箱中发送绑定邮件,并将激活码保存到redis中. 手机短信验证码因为时效期短,只需要将短信验证码存储到sessi ...

  6. Java案例-用户注册邮箱绑定激活功能实现

    <–start–> 需求描述:当客户打开收到邮箱激活码的邮件,点击激活链接,正确填写激活码后就会完成邮箱激活的步骤. 在后台编程代码编写中,有以下几个要点: ① 接收客户的手机号码和邮箱激 ...

  7. Java实现注册邮箱激活验证

    最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用 RegisterValidateService.java package com.app.service.impl;import java ...

  8. 使用 Java Mail 实现注册时邮箱激活验证功能

    最近在做毕设中实现注册功能时使用到了邮箱激活验证,在此总结下. 简介 JavaMail 是提供给开发者处理电子邮件相关的编程接口,它是 SUN 发布的用来处理 email 的 API ,它可以方便地执 ...

  9. SSM框架解决QQ邮箱激活535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´及端口25被占用问题

    SSM解决阿里云服务器邮箱激活25端口被占用,通过JAVA代码调用端口465及535 SSM框架实现商城邮箱激活账号出现535问题 阿里云服务器25端口关闭问题 控制器EmailCtrl代码: 接下来 ...

最新文章

  1. 字符串与base64相互转换
  2. class ts 扩展方法_如使用Typescript撸Vue(Vue2 + TS +TSX+CSS module)
  3. 5 种方法教你用Python玩转histogram直方图
  4. redis分片_Redis分片
  5. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(1)
  6. intellij idea jdk language level
  7. 心理学上的被动_心理学教你认识孤僻、被动、社交恐惧症,它们都是内向惹的祸...
  8. Spring Boot 2 尝鲜-动态 Banner
  9. c语言第八章实验题答案,第八章实验报告
  10. 极路由1 1s 2 3 刷机 / 恢复 /强刷教程
  11. GOM引擎版本为什么玩家会自动掉线或闪退?
  12. flash activex java_Adobe flash player ActiveX和NPAPI和PPAPI 这三个软件有什么区别?哪个是不必要的?...
  13. 上海图书馆及分馆特色
  14. VMware Workstation虚拟机无法获取IP地址的解决办法
  15. Python实现股票查询
  16. 快速构建属于自己的博客网站
  17. 安装tensorflow报错---CondaHTTPError: HTTP 000 CONNECTION FAILED for url
  18. 树莓派安装操作系统-raspbian的方法
  19. Java常用设计模式之装饰者模式
  20. C Primer Plus 第三章编程练习一

热门文章

  1. Python字典--练习题
  2. ZooKeeper到底有什么问题?导致阿里为什么不用 ZK 做服务发
  3. 机器视觉运动控制一体机应用例程|柔性振动盘上料解决方案
  4. 树莓派-OMV-NAS
  5. .net core 下使用XUnit自动化生成测试用例
  6. APIO2020 蒟蒻游记
  7. Hive_SQL 一次删除多个分区数据
  8. 基于java的完整项目总结
  9. grafana添加被监控主机
  10. c/c++,char型数组转化为int类型