• 邮件开发


    背景

    很多web应用在开发的时候都需要集成邮件发送功能;例如新用户注册欢迎邮件;

    邮件简介

            学习目标:

            邮件服务器:邮局;

            

            邮件的发送过程:

            

            

    邮件的协议(重点): 

    SMTP:Simple Message Transfer Protocal 简单消息传输协议(邮件发送协议) 

    默认用的端口:25

    POP:Post Office Protocal 邮局协议(接收邮件协议)

    默认用的端口:110

     

            手工发送邮件:

            前提:a、使用telnet发送,必须有telnet客户端

             

            b、准备两个邮箱:itheimacloud@163.com       iamsorry

                      itheima14@163.com       iamsorry

            发送邮件的邮箱账户名和密码需要进行Base64编码:

              itheimacloud                 aXRoZWltYWNsb3Vk

              iamsorry        aWFtc29ycnk=

               c、知道使用的发送服务器和接收服务器的地址

            POP3服务器:pop.163.com     SMTP服务器:smtp.163.com   

    SMTP协议:

          ehlo XXX        向发送服务器打招呼

          auth login              向发送服务器请求身份认证

          mail from:<itheimacloud@163.com>   发件人

          rcpt to:<itheima14@163.com>             收件人

          data                                    邮件内容开始标记

          --------------

          邮件内容:要符合规范RFC822规范

          from:itheimacloud@163.com(发件人)

          to:itheima14@163.com(收件人)

          subject:this is my first email(标题)

          (正文内容)

          aaaaaaaaaaaaaaaaaaa

          bbbbbbbbbbbbbbbbb 

          --------------

    .                                         邮件内容结束

          

          

          POP协议:

           

    邮件发送过程:

    JavaMail发送邮件: 

    1、简介:

    JavaMail是一套发送邮件的规范,属于JavaEE技术之一。 

    2、JavaMail环境的搭建 

    mail.jar 

    jaf.jar(JDK5-):Java Activation Framework JavaMail中用它读取磁盘文件

    3、JavaMail中的核心类

    Message:代表着一封邮件,实现类MimeMessage

    Properties(配置文件内容或此类的实例对象属性设定)

    mail.smtp.host 指定连接的邮件服务器主机名

    mail.transport.protocol 指定采用的邮件发送协议

    mail.store.protocol 指定采用的邮件接收协议

    mail.smtp.auth 指定客户端是否向邮件服务器提交认证

     1 import java.io.FileOutputStream;
     2 import java.util.Properties;
     3 
     4 import javax.mail.Message;
     5 import javax.mail.Session;
     6 import javax.mail.internet.InternetAddress;
     7 import javax.mail.internet.MimeMessage;
     8 
     9 //利用JavaMailAPI创建一封只有文本内容的邮件
    10 public class MailDemo1 {
    11 
    12     public static void main(String[] args) throws Exception {
    13         Properties props = new Properties();//不设置任何配置,发送时需要
    14         Session session = Session.getInstance(props);
    15         MimeMessage msg = new MimeMessage(session);
    16         //设置发件人
    17         msg.setFrom(new InternetAddress("itheimacloud@163.com"));
    18         //设置收件人:正常送(TO)、抄送(CC)、密送(BCC)
    19         msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com");
    20         //设置主题
    21         msg.setSubject("JavaMail发送的邮件");
    22         //设置邮件正文内容
    23         msg.setText("hello");
    24         msg.saveChanges();
    25         //存到磁盘上:邮件文件的扩展名*.eml
    26         msg.writeTo(new FileOutputStream("d:/1.eml"));
    27         
    28     }
    29 
    30 }
    MailDemo1
     1 import java.util.Properties;
     2 
     3 import javax.mail.Message;
     4 import javax.mail.Session;
     5 import javax.mail.Transport;
     6 import javax.mail.internet.InternetAddress;
     7 import javax.mail.internet.MimeMessage;
     8 
     9 public class SendMail1 {
    10 
    11     public static void main(String[] args) throws Exception {
    12         Properties props = new Properties();//不设置任何配置,发送时需要
    13         props.setProperty("mail.host", "smtp.163.com");
    14         props.setProperty("mail.transport.protocol", "smtp");
    15         props.setProperty("mail.smtp.auth", "true");//请求认证,与JavaMail的实现有关
    16         Session session = Session.getInstance(props);
    17         session.setDebug(true);//调试模式
    18         MimeMessage msg = new MimeMessage(session);
    19         //设置发件人
    20         msg.setFrom(new InternetAddress("itheimacloud@163.com"));
    21         //设置收件人:正常送(TO)、抄送(CC)、密送(BCC)
    22         msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com");
    23         //设置主题
    24         msg.setSubject("JavaMail发送的邮件");
    25         //设置邮件正文内容
    26         msg.setText("hello");
    27         msg.saveChanges();
    28         //发送邮件
    29         Transport ts = session.getTransport();
    30         ts.connect("itheimacloud", "iamsorry");
    31         ts.sendMessage(msg, msg.getAllRecipients());
    32     }
    33 
    34 }
    SendMail1

     

    3.1只有文本的邮件

    3.2文本中内嵌图片的邮件

     1 import java.io.FileOutputStream;
     2 import java.util.Properties;
     3 
     4 import javax.activation.DataHandler;
     5 import javax.activation.FileDataSource;
     6 import javax.mail.Message;
     7 import javax.mail.Session;
     8 import javax.mail.Transport;
     9 import javax.mail.internet.InternetAddress;
    10 import javax.mail.internet.MimeBodyPart;
    11 import javax.mail.internet.MimeMessage;
    12 import javax.mail.internet.MimeMultipart;
    13 
    14 //文本中内嵌图片的邮件
    15 //两部分组成:文本;图片。MIME协议描述的
    16 
    17 /*
    18 文件上传:多部分组成,用的也是MIME协议
    19 --------------------234u3240932
    20 Content-Type:text/html
    21 
    22 aaa<img src='cid:mm'/>aaa
    23 --------------------234u3240932
    24 Content-Type:image/jpeg
    25 Content-Id:mm
    26 
    27 图片的内容:采用Base64编码
    28 --------------------234u3240932--
    29  */
    30 public class MailDemo2 {
    31 
    32     public static void main(String[] args) throws Exception {
    33         Properties props = new Properties();//不设置任何配置,发送时需要
    34         props.setProperty("mail.host", "smtp.163.com");
    35         props.setProperty("mail.transport.protocol", "smtp");
    36         props.setProperty("mail.smtp.auth", "true");//请求认证,与JavaMail的实现有关
    37         Session session = Session.getInstance(props);
    38         session.setDebug(true);
    39         MimeMessage msg = new MimeMessage(session);
    40         msg.setFrom(new InternetAddress("itheimacloud@163.com"));
    41         msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com");
    42         msg.setSubject("JavaMail发送的邮件");
    43         
    44         //邮件主体内容:组装过程
    45             //文本部分
    46             MimeBodyPart textPart = new MimeBodyPart();
    47             textPart.setContent("aaa<img src='cid:mm'/>aaa", "text/html");
    48             
    49             //图片部分
    50             MimeBodyPart imagePart = new MimeBodyPart();
    51                 //搞数据进来需要用到JAF的API
    52             DataHandler dh = new DataHandler(new FileDataSource("src/1.jpg"));//自动探测文件的MIME类型
    53             imagePart.setDataHandler(dh);
    54             imagePart.setContentID("mm");
    55             
    56             //描述关系:
    57             MimeMultipart mmpart = new MimeMultipart();
    58             mmpart.addBodyPart(textPart);
    59             mmpart.addBodyPart(imagePart);
    60             mmpart.setSubType("related");//有关系的
    61         
    62         msg.setContent(mmpart);
    63         
    64         msg.saveChanges();
    65 //        msg.writeTo(new FileOutputStream("d:/2.eml"));
    66         //发送邮件
    67         Transport ts = session.getTransport();
    68         ts.connect("itheimacloud", "iamsorry");
    69         ts.sendMessage(msg, msg.getAllRecipients());
    70     }
    71 
    72 }
    MailDemo2

    3.3文本中内嵌图片还有附件的邮件

     

     1 import java.io.FileOutputStream;
     2 import java.util.Properties;
     3 
     4 import javax.activation.DataHandler;
     5 import javax.activation.FileDataSource;
     6 import javax.mail.Message;
     7 import javax.mail.Session;
     8 import javax.mail.Transport;
     9 import javax.mail.internet.InternetAddress;
    10 import javax.mail.internet.MimeBodyPart;
    11 import javax.mail.internet.MimeMessage;
    12 import javax.mail.internet.MimeMultipart;
    13 import javax.mail.internet.MimeUtility;
    14 
    15 //文本中内嵌图片的邮件,还有附件的邮件
    16 
    17 public class MailDemo3 {
    18 
    19     public static void main(String[] args) throws Exception {
    20         Properties props = new Properties();//不设置任何配置,发送时需要
    21         props.setProperty("mail.host", "smtp.163.com");
    22         props.setProperty("mail.transport.protocol", "smtp");
    23         props.setProperty("mail.smtp.auth", "true");//请求认证,与JavaMail的实现有关
    24         Session session = Session.getInstance(props);
    25         session.setDebug(true);
    26         MimeMessage msg = new MimeMessage(session);
    27         msg.setFrom(new InternetAddress("itheimacloud@163.com"));
    28         msg.setRecipients(Message.RecipientType.TO, "itheima14@163.com");
    29         msg.setSubject("JavaMail发送的邮件");
    30         
    31         //邮件主体内容:组装过程
    32             //文本部分
    33             MimeBodyPart textPart = new MimeBodyPart();
    34             textPart.setContent("美女aaa<img src='cid:mm'/>aaa", "text/html;charset=UTF-8");
    35             
    36             //图片部分
    37             MimeBodyPart imagePart = new MimeBodyPart();
    38                 //搞数据进来需要用到JAF的API
    39             DataHandler dh = new DataHandler(new FileDataSource("src/1.jpg"));//自动探测文件的MIME类型
    40             imagePart.setDataHandler(dh);
    41             imagePart.setContentID("mm");
    42             
    43             //附件部分
    44             MimeBodyPart attachmentPart = new MimeBodyPart();
    45             DataHandler dh1 = new DataHandler(new FileDataSource("src/姓名.zip"));//自动探测文件的MIME类型
    46             String name = dh1.getName();
    47             System.out.println(name);
    48             attachmentPart.setDataHandler(dh1);
    49             //手工设置附件的名称
    50             attachmentPart.setFileName(MimeUtility.encodeText(name));
    51             
    52             //描述关系:
    53             MimeMultipart mmpart = new MimeMultipart();
    54             mmpart.addBodyPart(textPart);
    55             mmpart.addBodyPart(imagePart);
    56             mmpart.setSubType("related");//有关系的
    57             
    58             
    59             //把文本图片当做一个部分
    60             MimeBodyPart textImagePart = new MimeBodyPart();
    61             textImagePart.setContent(mmpart);
    62             
    63             MimeMultipart multipart = new MimeMultipart();
    64             multipart.addBodyPart(textImagePart);
    65             multipart.addBodyPart(attachmentPart);
    66             multipart.setSubType("mixed");//复杂关系
    67             
    68         
    69         msg.setContent(multipart);
    70         
    71         msg.saveChanges();
    72 //        msg.writeTo(new FileOutputStream("d:/3.eml"));
    73         //发送邮件
    74         Transport ts = session.getTransport();
    75         ts.connect("itheimacloud", "iamsorry");
    76         ts.sendMessage(msg, msg.getAllRecipients());
    77     }
    78 
    79 }
    MailDemo3

    邮件中的编码问题 

    a、附件的名称不对

    b、中文乱码问题

    1.主题:一般没有问题

    2.文本内容:

    3.附件名称:

     

    利用Tomcat的JNDI容器管理JavaMail中的session:

    第一步:把javamail的jar包拷贝到Tomcatlib目录下

    第二步:在引用的META-INF目录下,建立一个context.xml的配置文件,内容如下

     

    第三步:在web环境下通过JNDI获取JavaMail的Session

     

    字节码冲突:javax.mail.Session.class有两处。干掉一处即可(只有干掉自己应用中的mail.jar)

    报错异常

    报错原因:

    系统检测到您正在尝试使用IMAP协议访问您的邮箱,为了确保您的帐户安全,该服
         务尚未开启。

    解决方法:

    登入邮箱开启即可

    合群是堕落的开始 优秀的开始是孤行
  • 相关阅读:
    MySQL事务隔离级别和MVCC
    windows环境下查看端口是否被占用
    jar找不到问题解决
    Java注解
    Fastjson
    mybatis
    Idea快捷键
    Date与String的相互转换
    Windows快捷键
    [转]linux awk命令详解
  • 原文地址:https://www.cnblogs.com/biaogejiushibiao/p/9356713.html
Copyright © 2020-2023  润新知