zoukankan      html  css  js  c++  java
  • Java实现邮箱验证

    JavaMail:

      提供开发者处理电子邮件相关的编程接口,是Sun公司发布处理email的API,可以方便地执行一些常用的邮件传输,我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。

    JavaMail的用途?

      1 用户注册后,网站发送一封激活邮箱验证

      2 用户生日,发祝福

      3 将最新的动态以邮件形式发送 等等··

    邮件开发中的基本术语

      电子邮箱  

      邮箱服务器

      邮件收发协议: SMTP协议(发送邮件)  源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,属于TCP/IP协议簇,帮助每台计算机发送或中转信件时找到下一个目的地,默认端口号25

              POP3协议(接受邮件)  用于支持使用客户端远程管理在服务器上的电子邮件,提供了SSL加密,支持“离线”邮件处理,默认端口号110

      

     Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去 Java 或 Oracle 官网下载。

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

    接下来代码实现(以下代码都是我拷贝的,不负责因为我没跑过,公司用到这块都有现成的框架,而且楼主目前完全没用到,一点兴趣都没有,我就是懒,就想拷贝,你要是不满意尽管提出来,反正我又不管你的!!!)

     1 package com.xiets.javamaildemo;
     3 import javax.mail.Session;
     4 import javax.mail.internet.InternetAddress;
     5 import javax.mail.internet.MimeMessage;
     6 import java.io.FileOutputStream;
     7 import java.io.OutputStream;
     8 import java.util.Date;
     9 import java.util.Properties;
    10 
    11 public class Main {
    12 
    13     public static void main(String[] args) throws Exception {
    14         // 创建一封邮件
    15         Properties props = new Properties();                // 用于连接邮件服务器的参数配置(发送邮件时才需要用到)
    16         Session session= Session.getDefaultInstance(props); // 根据参数配置,创建会话对象(为了发送邮件准备的)
    17         MimeMessage message = new MimeMessage(session);     // 创建邮件对象
    18 
    19         /*
    20          * 也可以根据已有的eml邮件文件创建 MimeMessage 对象
    21          * MimeMessage message = new MimeMessage(session, new FileInputStream("MyEmail.eml"));
    22          */
    23 
    24         // 2. From: 发件人
    25         //    其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
    26         //    真正要发送时, 邮箱必须是真实有效的邮箱。
    27         message.setFrom(new InternetAddress("aa@send.com", "USER_AA", "UTF-8"));
    28 
    29         // 3. To: 收件人
    30         message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("cc@receive.com", "USER_CC", "UTF-8"));
    31         //    To: 增加收件人(可选)
    32         message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));
    33         //    Cc: 抄送(可选)
    34         message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
    35         //    Bcc: 密送(可选)
    36         message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));
    37 
    38         // 4. Subject: 邮件主题
    39         message.setSubject("TEST邮件主题", "UTF-8");
    40 
    41         // 5. Content: 邮件正文(可以使用html标签)
    42         message.setContent("TEST这是邮件正文。。。", "text/html;charset=UTF-8");
    43 
    44         // 6. 设置显示的发件时间
    45         message.setSentDate(new Date());
    46 
    47         // 7. 保存前面的设置
    48         message.saveChanges();
    49 
    50         // 8. 将该邮件保存到本地
    51         OutputStream out = new FileOutputStream("MyEmail.eml");
    52         message.writeTo(out);
    53         out.flush();
    54         out.close();
    55     }
    56 
    57 }

    发送电子邮件

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

    代码实现

      1 package com.xiets.javamaildemo;
      2 
      3 import javax.mail.Session;
      4 import javax.mail.Transport;
      5 import javax.mail.internet.InternetAddress;
      6 import javax.mail.internet.MimeMessage;
      7 import java.util.Date;
      8 import java.util.Properties;
      9 
     10 public class Main {
     11 
     12     // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
     13     // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), 
     14     //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
     15     public static String myEmailAccount = "xxxxxxxxx@163.com";
     16     public static String myEmailPassword = "xxxxxxxxx";
     17 
     18     // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
     19     // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
     20     public static String myEmailSMTPHost = "smtp.163.com";
     21 
     22     // 收件人邮箱(替换为自己知道的有效邮箱)
     23     public static String receiveMailAccount = "xxxxxxxxx@qq.com";
     24 
     25     public static void main(String[] args) throws Exception {
     26         // 1. 创建参数配置, 用于连接邮件服务器的参数配置
     27         Properties props = new Properties();                    // 参数配置
     28         props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
     29         props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
     30         props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
     31 
     32         // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
     33         //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
     34         //     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
     35         /*
     36         // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
     37         //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
     38         //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
     39         final String smtpPort = "465";
     40         props.setProperty("mail.smtp.port", smtpPort);
     41         props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
     42         props.setProperty("mail.smtp.socketFactory.fallback", "false");
     43         props.setProperty("mail.smtp.socketFactory.port", smtpPort);
     44         */
     45 
     46         // 2. 根据配置创建会话对象, 用于和邮件服务器交互
     47         Session session = Session.getDefaultInstance(props);
     48         session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
     49 
     50         // 3. 创建一封邮件
     51         MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
     52 
     53         // 4. 根据 Session 获取邮件传输对象
     54         Transport transport = session.getTransport();
     55 
     56         // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
     57         // 
     58         //    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
     59         //           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
     60         //           类型到对应邮件服务器的帮助网站上查看具体失败原因。
     61         //
     62         //    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
     63         //           (1) 邮箱没有开启 SMTP 服务;
     64         //           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
     65         //           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
     66         //           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
     67         //           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
     68         //
     69         //    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
     70         transport.connect(myEmailAccount, myEmailPassword);
     71 
     72         // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
     73         transport.sendMessage(message, message.getAllRecipients());
     74 
     75         // 7. 关闭连接
     76         transport.close();
     77     }
     78 
     79     /**
     80      * 创建一封只包含文本的简单邮件
     81      *
     82      * @param session 和服务器交互的会话
     83      * @param sendMail 发件人邮箱
     84      * @param receiveMail 收件人邮箱
     85      * @return
     86      * @throws Exception
     87      */
     88     public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
     89         // 1. 创建一封邮件
     90         MimeMessage message = new MimeMessage(session);
     91 
     92         // 2. From: 发件人
     93         message.setFrom(new InternetAddress(sendMail, "某宝网", "UTF-8"));
     94 
     95         // 3. To: 收件人(可以增加多个收件人、抄送、密送)
     96         message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
     97 
     98         // 4. Subject: 邮件主题
     99         message.setSubject("打折钜惠", "UTF-8");
    100 
    101         // 5. Content: 邮件正文(可以使用html标签)
    102         message.setContent("XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");
    103 
    104         // 6. 设置发件时间
    105         message.setSentDate(new Date());
    106 
    107         // 7. 保存设置
    108         message.saveChanges();
    109 
    110         return message;
    111     }
    112 
    113 }

    不清楚的我也没办法啦,去百度吧~~~累死我了,能看懂大致基本上就没问题了,有经验的小伙伴应该看下就能理解~帅帅

  • 相关阅读:
    TC配置文件WCMD.INI详解,只能在ini重修改的配置
    Source Insight中的多行注释
    ACE_Timer_Heap_T定时器
    什么是代理服务器
    太阳能传感器目前主要故障问题解决方案
    source insight中文显示和处理
    C#3.0新特性小结(2)
    .NET中事务操作小结(1)
    常用的正则表达式收藏版
    几种流行的Ajax开发框架比较
  • 原文地址:https://www.cnblogs.com/hzzjj/p/6520400.html
Copyright © 2011-2022 走看看