Live2d Test Env

邮件开发

背景

很多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包拷贝到Tomcat\lib目录下

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

 

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

 

 

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

报错异常

报错原因:

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

解决方法:

登入邮箱开启即可

posted @ 2018-07-24 00:09  麦奇  阅读(301)  评论(0编辑  收藏  举报