Java实现邮件发送

邮件协议概述:(跟Http协议一样,邮件也是有传输协议的)

SMTP(Simple Mail Transfer Protocol):简单邮件传输协议 发送邮件协议

POP3(Post Office Protocol Version 3):邮局协议第三版 收邮件协议

IMAP(Internet Message Access Protocol):因特网访问协议 收发邮件协议

邮件服务器名称:

smtp服务器的端口号为25,服务器名称为smtp.xxx.xxx

pop3服务器的端口号为110,服务器名称为pop3.xxx.xxx

如:163邮箱:smtp.163.com pop3.163.com

qq邮箱: smtp.qq.com pop3.qq.com

JavaMail概述

JavaMail是sun公司提供的针对邮件的API,主要jar包:mail.jar、activation.jar

JavaaMail中主要的类:

javax.mail.Session:表示会话,也就是客户端与邮件服务器之间的会话。获取会话需要提供账户和密码以及服务器名称,在邮件服务的Session对象,相当于jdbc连接数据库中的Connection对象。

javax.mail.internet.MimeMessage:表示邮件类。是Message的子类,包含邮件的主题、内容、收件人地址、发件人地址,可以设置抄送和暗送,也可以设置邮件附件。

javax.mail.Transport:用来发送邮件,可以理解为邮件发送器。

实现发送邮件主要步骤:第一步首先获取Session(得到Session,需要使用Session.getInstance(Properties,Authenticator)),第二步创建MimeMessage对象(表示一个邮件对象,可以调用它的setFrom方法,设置发件人,设置收件人。。。),第三步发送邮件(Transport.send(msg);)。

  1. 首先把Javamail需要的两个jar导进去,如下

邮箱需要开通POP3/SMTP服务(如QQ邮箱在帐户设置中开通)

Java实现邮件发送_第1张图片

发送一封没有带附件的邮件 代码如下

    //发件人的smtp服务地址,这里使用的是qq邮箱smtp服务器地址,如果是其他邮箱的,填写对应的服务器地址

    private static String sendSmtpHost="smtp.qq.com";

    private static String toEmailAdd="[email protected]";//收件人邮箱

    @Test

    public void test() throws AddressException, MessagingException {

    //得到Session

        Properties prop = new Properties();

        prop.setProperty("mail.transport.protocol", "smtp");

        prop.setProperty("mail.smtp.host",sendSmtpHost);

        prop.setProperty("mail.smtp.auth","true");

        Authenticator auth = new Authenticator() {

            //创建验证器

            @Override

            protected PasswordAuthentication getPasswordAuthentication() {

                // 验证密码 第一个参数是账号后面不带   第二个为邮箱开通的stmp服务后得到的客户端授权码

                return new PasswordAuthentication("[email protected]", "kgckwqgoslxfcbad");

            }

        };

        //创建一个客户端与邮箱服务器会话对象

        Session session = Session.getInstance(prop,auth);

        //创建MimeMessage

        MimeMessage msg= new MimeMessage(session);

        //设置发件人

        msg.setFrom(new InternetAddress("[email protected]"));

        msg.setRecipients(RecipientType.TO, toEmailAdd);      //设置收件人

        //msg.setRecipients(RecipientType.CC, "33035288@qq.com"); //设置抄送

        //msg.setRecipients(RecipientType.BCC, "522639332@qq.com");//设置暗送

        msg.setSubject("sunflower");

        msg.setContent("无人能阻挡我们去寻找属于自己的光芒。", "text/html;charset=utf-8");

        Transport.send(msg); //发送邮件

}

效果

Java实现邮件发送_第2张图片

发送带附件的邮件,代码如下

//发送带附件的邮件

    @Test

    public void test1() throws Exception {

        // 得到Session

        Properties prop = new Properties();

        prop.setProperty("mail.transport.protocol", "smtp");

        prop.setProperty("mail.smtp.host", sendSmtpHost);

        prop.setProperty("mail.smtp.auth", "true");

        Authenticator auth = new Authenticator() {

            // 创建验证器

            @Override

            protected PasswordAuthentication getPasswordAuthentication() {

                // 验证密码 第一个参数是账号后面不带 第二个为邮箱开通的stmp服务后得到的客户端授权码

                return new PasswordAuthentication("[email protected]", "kgckwqgoslxfcbad");

            }

        };

        // 创建一个客户端与邮箱服务器会话对象

        Session session = Session.getInstance(prop, auth);

        MimeMessage msg = new MimeMessage(session);   // 创建MimeMessage

        msg.setFrom(new InternetAddress("[email protected]")); // 设置发件人

        msg.setRecipients(RecipientType.TO, toEmailAdd); // 设置收件人

        msg.setSubject("sunflower");

        /*发送包含附件的邮件时,邮件体为多部件的形式

         * 创建一个多部件的部件内容(MimeMultipart),用来装载多个主体部件

         * 发送包含附件的邮件需要创建两个主体部件(MimeBodyPart),一个是文本,一个是附件

         *MimeMultipart设置给MimeMessage的内容

        **/

        MimeMultipart mime = new MimeMultipart();//创建多部分主体

        MimeBodyPart part = new MimeBodyPart(); //创建MimeBodyPart

        part.setContent("","text/html;charset=utf-8");//设置主体部件的内容

        mime.addBodyPart(part);//把主体部件添加到MimeMultipart里去

        //创建MimeBodyPart

        MimeBodyPart part1 = new MimeBodyPart();

        part1.attachFile(new File("D:/向日葵.jpg"));

        //设置文件名称,MimeUtility.encodeText方法是解决中文乱码问题

        part1.setFileName(MimeUtility.encodeText("向日葵.jpg"));

        mime.addBodyPart(part1);

        msg.setContent(mime);//把它设置为邮件的内容

        Transport.send(msg);// 发送邮件

    }

Javamail常见异常总结:

抛异常的话,先检查下的你的邮箱名和授权是否正确,是否开通了邮箱服务。

发件人和发送对象不一致会触发下面异常,需要保持一致。我这里是授权码打错导致的。

发件人和发送邮箱的对象使用的邮箱不一致会触发以下异常,需要保持一致

导入的包没有包含sun的实现,需要重新导入javax.mail包。

 

 

 

 

 

 

你可能感兴趣的:(Java)