邮件介绍和实现

本文介绍了如何使用JavaMailAPI和JavaActivationFramework实现邮件发送功能,包括SMTP和POP3协议的原理。详细讲解了发送简单邮件和复杂邮件(包含MIME附件)的步骤,并提供了Java代码示例。邮件发送涉及开启邮箱的SMTP协议,使用授权码,以及处理SSL加密。此外,还展示了如何创建MimeMessage和Multipart对象来组合邮件内容和附件。
摘要由CSDN通过智能技术生成
9.邮件介绍和实现
  • 要在网络上实现邮件功能,得有专门的邮件服务器

  • 邮件服务器类似邮局,主要负责接收用户投递过来的邮件,并将器发送到接收者的电子邮箱中

  • SMTP服务器地址:smtp.xxx.com,163邮箱是smtp.163.com,qq邮箱是smtp.qq.com

  • 电子邮箱email地址需要在邮件服务器上申请,如qq邮箱要开通邮箱功能

  • 注册邮箱账号的过程是在邮件服务器上开辟空间的过程, 用户a(a@163.com)登录浏览器通过网络链接163服务器,在自己账号下创建一份邮件,发送到163服务器,163服务器通过收件人通过收件人的名称区分之后通过网络找到b(b@qq.com)所在的qq服务器,将邮件发送到qq服务器上b(b@qq.com)账号所在的空间中,此过程发邮件完成,qq服务器发送消息或弹窗给b,b登录服务器打开接收。

  • 发邮件三要素:收件人,主题,内容

  • Socket实现类似的功能了,就是一个线程循环监听和服务器临时存储消息。

  • 发送邮件:smtp协议

  • 接收邮件:pop3协议
    在这里插入图片描述

9.1 传输协议
  • SMTP协议;发送邮件:通常把处理用户smtp请求(邮件发送请求)的服务器称为smtp服务器。
  • POP3协议;接受邮件;通常把处理用户pop3请求(邮件接收请求)的服务器称为pop3服务器。
  • 注意:信件地址正确,控制台也打印了正确信息,收件箱收不到,有可能是收件箱服务器拒收了你发的邮件,认为是广告,这时可能会在垃圾箱找到,也可能找不到。此时应该换收件箱测试
9.2 java邮件发送
  • 代码完成邮件发送。如:注册需要发送邮件进行账号激活,或oa项目中利用邮件进行任务提醒。

  • 需要准备javamail api和java activation framework即两个jar包

  • javamail :供java开发人员在程序中实现邮件发送和接受的标准开发包,支持常用的邮件协议POP3/IMAP/SMTP/MIME(附件,非文本格式)。使用此包编写邮件,无需考虑邮件实现的底层细节,只需要调用此包中的api即可。

  • 发送一封简单的邮件,保证电脑连接网络

    • 创建包含邮件服务器的网络链接信息的session对像
    • 创建代办邮件内容的message对象
    • 创建transport对象,链接服务器,发送message,关闭链接
  • 有4个核心类:
    在这里插入图片描述

9.3 简单邮件
  • 发送邮件,需要协议支持,开启邮箱的pop3/SMTP协议
  • 用到邮箱服务授权码
@Test
public void sentSampleEmail() throws GeneralSecurityException, MessagingException {
    Properties prop = new Properties();
    //设置qq邮件服务器
    prop.setProperty("mail.host","smtp.qq.com");
    //邮件发生协议
    prop.setProperty("mail.transport.protocol","smtp");
    //需要验证用户名和密码
    prop.setProperty("mail.smtp.auth","smtp.qq.com");

    //关于qq邮箱,还要设置ssl加密,加上以下代码,其他邮箱不需要
    MailSSLSocketFactory msf = new MailSSLSocketFactory();
    msf.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable","true");
    prop.put("mail.smtp.ssl.socketFactory",msf);

    //使用javamail发送邮件5个步骤

    //1.创建定义整个应用所需的环境信息的session,用了监听器,qq才有
    Session session = Session.getDefaultInstance(prop, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
        }
    });
    //开启session的Debug,可以看到发送email的运行状态
    session.setDebug(true);

    //2.通过session得到Transport对象
    Transport transport = session.getTransport();

    //3.使用邮箱用户名和授权码链上服务器
    transport.connect("smtp.qq.com","发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");

    //4.创建邮件
    //创建邮件对象,用本次邮箱回话的session
    Message message = new MimeMessage(session);
    //指明邮件发送人
    message.setFrom(new InternetAddress("发送方账户@qq.com"));
    //指明邮件接受人
    message.setRecipient(Message.RecipientType.TO,new InternetAddress("接受方账户@163.com"));

    //设置邮件主题
    message.setSubject("简单邮件");
    //设置邮件内容,Multipart附件
    message.setContent("<p style='color: chocolate'>简单邮件内容</p>","text/html;charset=utf-8");
    /*if (o instanceof Multipart)
 setContent((Multipart)o);
     else
 setDataHandler(new DataHandler(o, type));*/

    //5.发送邮件
    transport.sendMessage(message,message.getAllRecipients());

    //5.关闭邮件
    transport.close();
}
9.4 复杂邮件
  • MIME:多用途互联网邮件扩展协议

  • 发送邮件,需要协议支持,开启邮箱的pop3/SMTP协议

  • Multipart附件

  • javax.mail.internet.MimeBodyPart:表示是一个mime消息,和MimeMessage类是一样从Part接口继承过来的。(代表一个个的信件组成部分)

  • javax.mail.internet.MimeMultipart是抽象类Multipart的子类,用来组合多个mime消息,一个MimeMultipart对象可以包含多个代码mime消息的MimeBodyPart对象(将多个信件部分糅合成一个信件)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/8eceec684bf643efa69c7f1eb9991513.png

@Test
public void sendFileEmail() throws Exception {
    Properties prop = new Properties();
    //设置qq邮件服务器
    prop.setProperty("mail.host","smtp.qq.com");
    //邮件发生协议
    prop.setProperty("mail.transport.protocol","smtp");
    //需要验证用户名和密码
    prop.setProperty("mail.smtp.auth","smtp.qq.com");

    //关于qq邮箱,还要设置ssl加密,加上以下代码,其他邮箱不需要
    MailSSLSocketFactory msf = new MailSSLSocketFactory();
    msf.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable","true");
    prop.put("mail.smtp.ssl.socketFactory",msf);

    //使用javamail发送邮件5个步骤

    //1.创建定义整个应用所需的环境信息的session,用了监听器,qq才有
    Session session = Session.getDefaultInstance(prop, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
        }
    });
    //开启session的Debug,可以看到发送email的运行状态
    session.setDebug(true);

    //2.通过session得到Transport对象
    Transport transport = session.getTransport();

    //3.使用邮箱用户名和授权码链上服务器
    transport.connect("smtp.qq.com","发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
    MimeMessage message = getMimeMessage(session);
    //5.发送邮件
    transport.sendMessage(message,message.getAllRecipients());

    //5.关闭邮件
    transport.close();

}

public static MimeMessage getMimeMessage(Session session) throws MessagingException {
    //4.创建邮件
    //创建邮件对象,用本次邮箱回话的session
    MimeMessage message = new MimeMessage(session);
    //指明邮件发送人
    message.setFrom(new InternetAddress("发送方账户@qq.com"));
    //指明邮件接受人
    message.setRecipient(Message.RecipientType.TO,new InternetAddress("接收方账户@163.com"));

    //设置邮件主题
    message.setSubject("简单邮件");
    //设置邮件内容,Multipart附件
    //message.setContent("<p style='color: chocolate'>简单邮件内容</p>","text/html;charset=utf-8");
    //复杂邮件内容

    //图片数据
    MimeBodyPart image = new MimeBodyPart();
    //图片需要经过数据处理,二进制到图片,DataHandler
    DataHandler imageDH = new DataHandler(new FileDataSource("src/main/resources/dec.jpg"));
    //在消息体中加入图片
    image.setDataHandler(imageDH);
    //给图片设置id,后续可以使用
    image.setContentID("dec.jpg");


    //正文数据:文本
    MimeBodyPart content = new MimeBodyPart();
    //cid:图片被使用
    content.setContent("<p style='color: chocolate'>这是一封带<img src='cid:dec.jpg' alt='dec.jpg'>\n图片的信件</p>","text/html;charset=utf-8");

    //附件
    MimeBodyPart filecontent = new MimeBodyPart();
    DataHandler propDH = new DataHandler(new FileDataSource("src/main/resources/log4j.properties"));
    filecontent.setDataHandler(propDH);
    filecontent.setFileName("log4j.properties");

    //描述数据关系
    MimeMultipart mimeMultipart = new MimeMultipart();
    mimeMultipart.addBodyPart(image);
    mimeMultipart.addBodyPart(content);
    mimeMultipart.addBodyPart(filecontent);
    mimeMultipart.setSubType("mixed");

    //设置到消息中,保存更改
    message.setContent(mimeMultipart);
    message.saveChanges();

    return message;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值