邮件开发

JavaMail开发:JavaEE技术之一


一、邮件开发用到的协议:SMTP、POP、RFC822、MIME
            SMTP:  Simple Message Transfer Protocal 简单消息传输协议。
                         发送邮件时使用的协议。描述了数据该如何表示。默认使用的端口:25
                         通常将处理用户SMTP请求的邮件服务器成为SMTP服务器
            POP  :   ost Office Protocal邮局协议。
                         接收邮件时使用的协议。默认使用的端口:110
                         通常将处理用户POP请求的邮件服务器成为POP3服务器
                                  
                         
二、 邮件的发送过程及用到的协议
         




三、 手工发送邮件和接收邮件(熟练SMTP等协议的)

         0、 准备:
                      QQ邮箱服务器地址:SMTP:smtp.qq.com ;  POP3:pop.qq.com
                      将用户名和密码进行Base64编码

          1、DOS命令行手工发送邮件的过程:telnet (了解)
                      telnet  smtp.qq.com 25
                      ------------------------------------------------------------以下属于SMTP协议的内容
                      ehlo wzt                                                        //向服务器打招呼(主机名称)
                      auth login                                                     //请求认证  
                     
                      //  提示输入用户名和密码(Base64编码后的)
                      aXRoZWltYWNsb3Vk
                      aWFtc29ycnk=
                      
                      mail from:<963353706@qq.com>
                      rcpt to:<963353706@qq.com>
                      
                      data                                                              //说明邮件的开始
                                                                                            //邮件内容是要遵循一定格式的:RFC822规范
                                  
                      from:itheimacloud@163.com                    //邮件头  此处可以冒充别人发送邮件(fengjie@163.com)
                      to:itheima14@163.com
                      subject:这是一封手工发送的邮件                 //主题
                                                                                            // 头体用空行分隔
                      aaaaaaaaaaaaaaaaaa                                  //邮件体
                      bbbbbbbbbbbbbbbbbb
                      .                                                                     // .用于结束邮件内容
                      
                      ------------------------------------------------------------
                      quit
              
          2、手工收取邮件(POP协议)
                      telnet pop.qq.com 110
                      ----------------------------------以下属于POP协议的东东
                      user 963353706
                      pass iamsorry
                      stat                                                                //返回邮箱的统计信息
                      list 邮件编号                                                  //返回某一封的邮件统计信息
                      retr 邮件编号                                                 //取出某一封邮件的内容
                      ----------------------------------
                      quit
              


四、 JavaMail的核心API简介


           准备:  导入jar包:mail.jar  (注意:Javamail的API依赖jaf(Java Activation Framework)框架,
                        还需要导入jaf的jar包activation.jar。如果使用的是JDK6及以上版本,就不需要了)
                        
            Session:  代表邮件的环境
            Message:   代表邮件内容部分          
            BodyPart:  代表复杂邮件中的每一部分
            Multipart:描述由多个BodyPart组成的邮件的关系
            
五、 复杂邮件的组成原理图
         


            

六、 创建邮件:(卫星)
          例:
                  ① 只有文本的邮件
                        -------------------------------------------------------------------------------------------------
                        // JavaMail创建邮件过程,并将其保存到磁盘上
                        
                        public class MailDemo1 {
                                public static void main(String[] args) throws Exception {
                                        // 创建一封邮件
                                        Properties props = new Properties();  // 环境变量设置,发送邮件时才需要
                                        Session session = Session.getDefaultInstance(props);
                                        MimeMessage message = new MimeMessage(session);  // 代表一封邮件
                                        
                                        // 设置发件人
                                        message.setFrom(new InternetAddress("963306@qq.com"));
                                        // 设置收件人
                                        message.setRecipients(Message.RecipientType.TO, "963306@qq.com");
                                        // 设置主题
                                        message.setSubject("这是javamail发出的第一封邮件");
                                        // 设置邮件的正文内容
                                        message.setText("嘿嘿,javaMail发送的邮件1哦");
                                        
                                        // 把邮件存储到磁盘上 注: 邮件的扩展名为.eml
                                        message.writeTo(new FileOutputStream("c:/1.eml"));                                 
                                }
                        }
                        
                        -------------------------------------------------------------------------------------------------
                  
                  
                  
                  ② 既有文本,文本中还内嵌图片的邮件(MIME协议描述的)  related
                            分割线:------------------------------238748932bc07
                                    ------------------------------238748932bc07
                                    //文本部分
                                    //头 Content-Type:text/html;
                                    
                                    //体aaa<img src='cid:mm'/>aaa
                                    ------------------------------238748932bc07
                                    //图片部分
                                    Content-Type:image/jpeg
                                    Content-Id:mm
                                    
                                    jsdlkfjlkdslkjfds(base64编码)
                                    dsfds
                                    f
                                    dsf
                                    dsfds
                                    f
                                    dsfds
                                    ------------------------------238748932bc07--
                                    
                        -------------------------------------------------------------------------------------------------
                        // 创建文本中内嵌图片的邮件
                        
                        public class MailDemo2 {
                                public static void main(String[] args) throws Exception {
                                        Properties props = new Properties();
                                        Session session = Session.getDefaultInstance(props);
                                        MimeMessage message = new MimeMessage(session);
                                        
                                        message.setFrom(new InternetAddress("963306@qq.com"));
                                        message.setRecipients(Message.RecipientType.TO, "963706@qq.com");
                                        message.setSubject("这是一封文本中内嵌图片的邮件");
                                        
                                        // 文本部分 注: 该文本内嵌id为mm的图片
                                        MimeBodyPart textPart = new MimeBodyPart();
                                        textPart.setContent("aaa<img src='cid:mm'/>aaa","text/html");
                                        
                                        // 图片部分 
                                        MimeBodyPart imagePart = new MimeBodyPart();
                                        // 借助JAF框架将磁盘上的文件读取过到邮件中
                                        DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));
                                        // 注: 通过jaf读取到的文件,不需要设置其MIME类型,JAF框架会自动探测到  且之后与原图片无关
                                        imagePart.setDataHandler(dh);
                                        imagePart.setContentID("mm");
                                        
                                        // 将文本部分和图片部分整合到一个mmpart中,顺便说明俩者的关系
                                        MimeMultipart mmpart = new MimeMultipart();
                                        mmpart.addBodyPart(textPart);
                                        mmpart.addBodyPart(imagePart);
                                        mmpart.setSubType("related");  // 说明俩者有关系
                                        
                                        // 将mmpart添加到邮件中,并保存改变
                                        message.setContent(mmpart);
                                        message.saveChanges();
                                        
                                        message.writeTo(new FileOutputStream("c:/2.eml"));
                                }
                        }  
                        -------------------------------------------------------------------------------------------------  
                   
                   
                                    
                  ③  既有文本,文本中还内嵌图片的邮件,还有附件的邮件
                                 注意: 主题、内容、附件名称的中文编码问题
                                             主题和内容修改charset即可
                                             附件名称采用解决编码的类MimeUtility.encodeText(filename)修改
                        -------------------------------------------------------------------------------------------------
                        // 创建一封包含文本、图片、附件的复杂邮件(参考  复杂邮件的组成原理图)
                        
                        public class MailDemo3 {
                                public static void main(String[] args) throws Exception {
                                  
                                        Properties props = new Properties();
                                        Session session = Session.getDefaultInstance(props);
                                        MimeMessage message = new MimeMessage(session);
                                        
                                        message.setFrom(new InternetAddress("96306@qq.com"));
                                        message.setRecipients(Message.RecipientType.TO,"963706@qq.com");
                                        message.setSubject("这是一封包含文本、图片、附件的复杂邮件");
                                        
                                        // 文本部分
                                        MimeBodyPart textPart = new MimeBodyPart();
                                        textPart.setContent("古风图片bbb<img src='cid:mm'/>bbb", "text/html;charset=UTF-8");
                                        // 内嵌图片部分
                                        MimeBodyPart imagePart = new MimeBodyPart();
                                        DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));
                                        imagePart.setDataHandler(dh);
                                        imagePart.setContentID("mm");
                                        
                                        // 文本和内嵌图片合体部分
                                        MimeMultipart mpart1 = new MimeMultipart();
                                        mpart1.addBodyPart(textPart);
                                        mpart1.addBodyPart(imagePart);
                                        mpart1.setSubType("related");
                                        
                                        MimeBodyPart textImagePart = new MimeBodyPart();
                                        textImagePart.setContent(mpart1);
                                        
                                        // 附件部分
                                        MimeBodyPart attachmentPart = new MimeBodyPart();
                                        dh = new DataHandler(new FileDataSource("c:/附件.rar"));
                                        String filename = dh.getName();   // 获取附件原文件名
                                        attachmentPart.setDataHandler(dh);
                                        // 手工设置附件文件名(原文件名称) 注: 中文文件名要注意编码                                          
                                        attachmentPart.setFileName(MimeUtility.encodeText(filename)); 
                                        
                                        // 全部合体部分
                                        MimeMultipart mpart2 = new MimeMultipart();
                                        mpart2.addBodyPart(textImagePart);  // 文本加内嵌图片部分
                                        mpart2.addBodyPart(attachmentPart); // 附件部分
                                        mpart2.setSubType("mixed");  // 复杂关系
                                        
                                        message.setContent(mpart2);
                                        message.saveChanges();
                                        
                                        message.writeTo(new FileOutputStream("c:/3.eml"));                                        
                                }
                        }
                     
                        -------------------------------------------------------------------------------------------------
                        
                        

七、发送邮件的俩种方式(火箭):
            
            方式1:
                        ---------------------------------------------------------------------------------------------------
                        public class SendMail1 {
                                public static void main(String[] args) throws Exception {                                  
                                        // 创建邮件
                                        Properties props = new Properties();// 环境变量设置,发送邮件时才需要
                                        props.setProperty("mail.transport.protocol", "smtp");  // 发送使用的协议
                                        props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址
                                        props.setProperty("mail.smtp.auth", "true");   // 请求身份验证
                                        Session session = Session.getDefaultInstance(props);
                                        MimeMessage message = new MimeMessage(session);
                                        
                                        message.setFrom(new InternetAddress("9706@qq.com"));
                                        message.setRecipients(MimeMessage.RecipientType.TO, "96336@qq.com");
                                        message.setSubject("这是我发送的一封简单邮件");
                                        
                                        message.setText("嘿,马上要开学了~~~");
                                        message.saveChanges();
                                                                         
                                        // 发送邮件
                                        Transport ts = session.getTransport();  // 得到火箭
                                        ts.connect("963706@qq.com", "qq邮箱密码");  // 连接
                                        ts.sendMessage(message, message.getAllRecipients()); // 发送给所有的用户
                                        ts.close();
                                }
                        }
                        ---------------------------------------------------------------------------------------------------
            
             方式2:
                        ---------------------------------------------------------------------------------------------------   
                        public class SendMail2 {
                                public static void main(String[] args) throws Exception {
                                        Properties props = new Properties();
                                        props.setProperty("mail.transport.protocol","smtp");   // 发送使用的协议
                                        props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址
                                        props.setProperty("mail.smtp.auth", "true");   // 请求身份验证
                                        Session session = Session.getDefaultInstance(props,new Authenticator() {
                                                @Override
                                                protected PasswordAuthentication getPasswordAuthentication() {
                                                        return new PasswordAuthentication("966@qq.com", "1877");
                                                }
                                        });
                                        MimeMessage message = new MimeMessage(session);
                                        
                                        message.setFrom(new InternetAddress("963353706@qq.com"));
                                        message.setRecipients(MimeMessage.RecipientType.TO, "qq邮箱密码"); 
                                        message.setSubject("这是我发送的第二封邮件哦");
                                        message.setText("2   o my god tomorrow is learning~~~");
                                        message.saveChanges();
                                        
                                        Transport.send(message);                                      
                                }
                        }
                        ---------------------------------------------------------------------------------------------------   






八、案例:用户注册,发送激活邮件

























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值