Javamail学习笔记

一、JavaMail概述:

    JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。但它并没有包含在JDK中,而是作为JavaEE的一部分。

    厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;

  • POP3:用于接收电子邮件的标准协议;

  • IMAP:互联网消息协议,是POP3的替代协议。

    这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。

    除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。

    mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;

    activation.jar:此JAR文件包含JAF API和Sun的实现。

二、发送邮件的两种方式

1.用telnet指令

1.在控制台下用telnet指令发送。这里采用smtp协议,在此之前要注册sina邮箱,然后设置邮箱开启smtp、pop3协议

2.telnet  smtp.sina.com 25 //端口号

或者

telnet  pop3.sina.com 110

3、用base64加密的邮箱和登录密码字符串(126用授权码,qq用独立密码)与smtp服务器验证身份   注:此处可以用php中的base64_encode()函数来获取。

>auth login                                                               //开始验证身份

>cGhwamlhb31ZWRldkBhbGl5dW4uY29t       //这是邮箱的base64编码字符串

>YWxpZW1haWwMjM=                                         //这是邮箱的base64编码字符串

4、身份验证成功之后就可以写邮件了

>mail  from:<[email protected]>                         //发件人的邮箱地址

>rcpt to:<[email protected]>                                   //收件人的邮箱地址

5、输入DATA指令开始写邮件

(data可选项:

  • 输入from:发件人名称,此项可以任意填入,将显示在收件箱的发件人一栏。

  • 输入to:收件人名称,可任意填入,将显示在收件箱的收件人一栏。

  • 输入subject:信件主题,显示在收件箱的主题一栏中。

  • 写完subject需要空一行,即在一空行直接回车,表示正文部分的开始。

  • 空行后输入信件的正文内容。

  • 按下回车 . 回车,邮件就发出去了。

  • 最后quit就可以退出。

//>DATA                                                                     //开始撰写邮件

细化的写:

>from:aliyun

>to:sina

>subject:this is a demo                                      //主题

>          //空行不能少

>this is email content                                           //正文

>          //空行不能少

>.          //点不能少

>                                                                               //此处返回250表示邮件已经发送成功了

>quit

这里附上常出现的(521、550等参数),参考链接https://www.alibabacloud.com/help/zh/faq-detail/44499.htm

2.在eclispe上

针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,下表是针对SMTP协议的一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):

属性名 属性类型 说明
mail.smtp.host String SMTP服务器地址,如smtp.sina.com.cn
mail.smtp.port

int

SMTP服务器端口号,默认为25
mail.smtp.auth boolean SMTP服务器是否需要用户认证,默认为false
mail.smtp.user String SMTP默认的登陆用户名
mail.smtp.from String 默认的邮件发送源地址
mail.smtp.socketFactory.class String socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.net.SocketFactory接口
mail.smtp.socketFactory.port int 指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号
mail.smtp.socketFactory.fallback boolean 设置为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为true
mail.smtp.timeout int I/O连接超时时间,单位为毫秒,默认为永不超时

2.1了解邮件发送原理,以及javamail.api

2.2发送一封只包含文本的简单邮件

package com.test.mail;

import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* @ClassName: Sendmail
* @Description: 发送Email
* @author: 55044
* @date: 2015-1-12 下午9:42:56
*
*/ 
public class mail {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.sina.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
        ts.connect("smtp.sina.com", "[email protected]", "密码");
        //4、创建邮件
        Message message = createSimpleMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }
    
    /**
    * @Method: createSimpleMail
    * @Description: 创建一封只包含文本的邮件
    * @Anthor:55044
    *
    * @param session
    * @return
    * @throws Exception
    */ 
    public static MimeMessage createSimpleMail(Session session)
            throws Exception {
        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("[email protected]"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
        //邮件的标题
        message.setSubject("只包含文本的简单邮件");
        //邮件的文本内容
        message.setContent("你好啊!", "text/html;charset=UTF-8");
        //返回创建好的邮件对象
        return message;
    }
}

2.3发送包含内嵌图片的邮件

  //创建邮件
        MimeMessage message = new MimeMessage(session);
        // 设置邮件的基本信息
        //发件人
        message.setFrom(new InternetAddress("[email protected]"));
        //收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
        //邮件标题
        message.setSubject("带图片的邮件");

        // 准备邮件数据
        // 准备邮件正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='taaarannn_1.png'>的邮件", "text/html;charset=UTF-8");
        // 准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src\\taaarannn_1.png"));
        image.setDataHandler(dh);
        image.setContentID("taaarannn_1.png");
        // 描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        message.setContent(mm);
        message.saveChanges();
        //将创建好的邮件写入到E盘以文件的形式进行保存
        message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
        //返回创建好的邮件
        return message;

猜你喜欢

转载自blog.csdn.net/qq_39586409/article/details/81456190