精华内容
下载资源
问答
  • 2021-08-23 18:18:32

    TOM邮箱的正确格式是什么?邮箱格式是指账号的组成部分,一个正确的邮箱地址由“邮箱账号”“@”符号和邮箱后缀组成,也就是常见的YourName@vip.tom.com,通常邮箱账号注册时可由用户选择用户名,而邮箱后缀是由运营商提供,是无法修改的,在TOM有3个后缀选择。邮箱格式你知道了,那你知道如何发送一封规范的邮件吗?一起来看看吧!

    发送邮件规范标准

    1、收件人:我们发送的邮件都要有指定的收件人,必须确保收件人地址填写无误

    2、邮件主题:邮件主题是以概括性方式表明邮件的主要内容,所以要紧扣邮件内容

    3、邮件正文:邮件正文包含称呼、正文内容、结尾签名都是不可少的

    VIP高端商务邮箱

    TOMVIP邮箱以其超高的性价比和卓越的品质服务于用户,无限邮箱容量、超大附件发送、邮件误删恢复、邮件撤回、注册VIP邮箱送靓号都是VIP邮箱所提供的特权功能,让您在办公中更加得心应手,快人一步。

    更多相关内容
  • java邮件发送

    千次阅读 2022-04-06 16:18:16
    JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail ...

    一、JavaMail介绍
    1、概述

    JavaMail是利用现有的邮件账户发送邮件的工具,比如我在网易注册一个邮箱账户,通过JavaMail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。

    JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

    SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议
    POP3(Post Office Protocol - Version 3):用于接收电子邮件的标准协议
    IMAP(Internet Mail Access Protocol):互联网消息协议,是POP3的替代协议

    JavaMail下载(javax.mail-1.6.0.jar):JavaMail API

    2、JavaMail API

    JavaMail API 按照功能可以划分为如下三大类:

      ①、创建和解析邮件的API

      ②、发送邮件的API

      ③、接收邮件的API

      以上三种类型的API在JavaMail 中由多个类组成,但是主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。

    ①Message 类:javax.mail.Message 类是创建和解析邮件的核心 API,这是一个抽象类,通常使用它的子类javax.mail.internet.MimeMessage 类。它的实例对象表示一份电子邮件。客户端程序发送邮件时,首先使用创建邮件的 JavaMail API 创建出封装了邮件数据的 Message 对象,然后把这个对象传递给邮件发送API(Transport 类) 发送。客户端程序接收邮件时,邮件接收API把接收到的邮件数据封装在Message 类的实例中,客户端程序在使用邮件解析API从这个对象中解析收到的邮件数据。

    ②Transport 类:javax.mail.Transport 类是发送邮件的核心API 类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如 SMTP 协议,客户端程序创建好 Message 对象后,只需要使用邮件发送API 得到 Transport 对象,然后把 Message 对象传递给 Transport 对象,并调用它的发送方法,就可以把邮件发送给指定的 SMTP 服务器。

    ③Store 类:javax.mail.Store 类是接收邮件的核心 API 类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如 POP3 协议,客户端程序接收邮件时,只需要使用邮件接收 API 得到 Store 对象,然后调用 Store 对象的接收方法,就可以从指定的 POP3 服务器获得邮件数据,并把这些邮件数据封装到表示邮件的 Message 对象中。

    ④Session 类:javax.mail.Session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,例如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session 对象根据这些信息构建用于邮件收发的 Transport 和 Store 对象,以及为客户端创建 Message 对象时提供信息支持。

    二、基于JavaMail的简单邮件发送

    1、准备工作
    (1)新建java项目,将下载的javax.mail-1.6.0添加进项目

     (2)准备好邮箱授权码,授权密码不是邮箱密码,邮箱授权密码要自己去申请,具体百度!

    2、邮件创建步骤

    • 创建一个邮件对象(MimeMessage);
    • 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
    • 设置邮件的主题(标题);
    • 设置邮件的正文(内容);
    • 设置显示的发送时间;
    • 保存到本地。

    3、简单邮件发送主程序
    以下代码需要修改成自己对应的发送人邮箱地址、授权码、收件人邮箱地址。

    import java.util.Date;
    import java.util.Properties;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    /**
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上(必须)
     */
    public class sendEmail{
        //发件人的邮箱和密码(替换为自己的邮箱和密码)
        //PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
        //对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
        public static String myEmailAccount = "xxx@163.com";
        public static String myEmailPassword = "XXXXXXXX";
    
        //发件人邮箱的 SMTP服务器地址,必须准确,不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
        //网易163邮箱的 SMTP 服务器地址为: smtp.163.com
        public static String myEmailSMTPHost = "smtp.163.com";
    
        // 收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxx@qq.com";
    
        public static void main(String[] args) throws Exception {
            //1.创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    //参数配置
            props.setProperty("mail.transport.protocol", "smtp");   //使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);   //发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");            //需要请求认证
    
            // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
            //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
            //     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
    
            /*
            // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
            //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
            //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
            final String smtpPort = "465";
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            */
    
            //2.根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getInstance(props);
            //session.setDebug(true);                                 //设置为debug模式,可以查看详细的发送log
    
            //3.创建一封邮件
            MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
    
            //4.根据 Session获取邮件传输对象
            Transport transport = session.getTransport();
    
            // 5.使用邮箱账号和密码连接邮件服务器, 这里认证的邮箱必须与 message中的发件人邮箱一致,否则报错
            //
            //    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
            //           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
            //           类型到对应邮件服务器的帮助网站上查看具体失败原因。
            //
            //    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
            //           (1)邮箱没有开启 SMTP 服务;
            //           (2)邮箱密码错误, 例如某些邮箱开启了独立密码;
            //           (3)邮箱服务器要求必须要使用 SSL 安全连接;
            //           (4)请求过于频繁或其他原因, 被邮件服务器拒绝服务;
            //           (5)如果以上几点都确定无误, 到邮件服务器网站查找帮助。
            //
            //PS_03:仔细看log,认真看log,看懂log,错误原因都在log已说明。
            transport.connect(myEmailAccount, myEmailPassword);
            //6.发送邮件,发到所有的收件地址,message.getAllRecipients()获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
            System.out.println("邮件发送成功");
            // 7. 关闭连接
            transport.close();
        }
    
        /**
         * 创建一封只包含文本的简单邮件
         *
         * @param session 和服务器交互的会话
         * @param sendMail 发件人邮箱
         * @param receiveMail 收件人邮箱
         * @return
         * @throws Exception
         */
        public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
            // 1.创建一封邮件
            MimeMessage message = new MimeMessage(session);
            // 2.From:发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
            message.setFrom(new InternetAddress(sendMail, "某宝网", "UTF-8"));
            // 3.To:收件人(可以增加多个收件人、抄送、密送)
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
            // 4.Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
            message.setSubject("打折钜惠", "UTF-8");
            // 5.Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
            message.setContent("XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");
            // 6.设置发件时间
            message.setSentDate(new Date());
            // 7.保存设置
            message.saveChanges();
            return message;
        }
    }

    结果:

    三、基于JavaMail的复杂邮件发送(包含图片、附件等)

    import java.util.Date;
    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message.RecipientType;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;
    
    /**
     * 创建并发送一封包含文本、图片、附件的复杂邮件
     *
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上(必须)
     *
     * @author xietansheng
     */
    public class SendMail{
        //发件人的邮箱和密码(替换为自己的邮箱和密码)
        public static String myEmailAccount = "xxx@163.com";
        public static String myEmailPassword = "XXXXXXXXXX";
    
        //发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
        //网易163邮箱的 SMTP 服务器地址为: smtp.163.com
        public static String myEmailSMTPHost = "smtp.163.com";
    
        //收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxx@qq.com";
    
        public static void main(String[] args) throws Exception {
            //1.创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    //参数配置
            props.setProperty("mail.transport.protocol", "smtp");   //使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);   //发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");            //需要请求认证
    
            //如果要开启SSL连接,参考基于JavaMail的简单邮件发送注释部分
    
            //2.根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getInstance(props);
            //session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
    
            //3.创建一封邮件
            MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
    
            //也可以保持到本地查看
            //message.writeTo(file_out_put_stream);
    
            //4.根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();
    
            //5.使用 邮箱账号 和 密码 连接邮件服务器
            //这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错
            transport.connect(myEmailAccount, myEmailPassword);
    
            //6.发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
    
            System.out.println("邮件发送成功!");
    
            //7.关闭连接
            transport.close();
        }
    
        /**
         * 创建一封复杂邮件(文本+图片+附件)
         */
        public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
            //1.创建邮件对象
            MimeMessage message = new MimeMessage(session);
            //2.From: 发件人
            message.setFrom(new InternetAddress(sendMail, "我的测试邮件_发件人昵称", "UTF-8"));
            //3.To: 收件人(可以增加多个收件人、抄送、密送)
            message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, "我的测试邮件_收件人昵称", "UTF-8"));
            //4.Subject: 邮件主题
            message.setSubject("TEST邮件主题(文本+图片+附件)", "UTF-8");
            /*
             * 下面是邮件内容的创建:
             */
    
            //5.创建图片“节点”
            MimeBodyPart image = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("E:\\guigu\\test\\src\\mail\\picture.png")); //读取本地文件
            image.setDataHandler(dh);		            // 将图片数据添加到“节点”
            image.setContentID("image_picture");	    // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
    
            //6.创建文本“节点”
            MimeBodyPart text = new MimeBodyPart();
            //    这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
            text.setContent("这是一张图片<br/><img src='cid:image_picture'/>", "text/html;charset=UTF-8");
    
            //7.(文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
            MimeMultipart mm_text_image = new MimeMultipart();
            mm_text_image.addBodyPart(text);
            mm_text_image.addBodyPart(image);
            mm_text_image.setSubType("related");	// 关联关系
    
            //8.将 文本+图片 的混合“节点”封装成一个普通“节点”
            //最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
            //上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
            MimeBodyPart text_image = new MimeBodyPart();
            text_image.setContent(mm_text_image);
    
            //9.创建附件“节点”
            MimeBodyPart attachment = new MimeBodyPart();
            DataHandler dh2 = new DataHandler(new FileDataSource("E:\\guigu\\test\\src\\mail\\word1.docx"));  //读取本地文件
            attachment.setDataHandler(dh2);		//将附件数据添加到“节点”
            attachment.setFileName(MimeUtility.encodeText(dh2.getName()));//设置附件的文件名(需要编码)
    
            //10.设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text_image);
            mm.addBodyPart(attachment);		//如果有多个附件,可以创建多个多次添加
            mm.setSubType("mixed");			//混合关系
    
            //11.设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
            message.setContent(mm);
    
            //12.设置发件时间
            message.setSentDate(new Date());
    
            //13.保存上面的所有设置
            message.saveChanges();
    
            return message;
        }
    
    }
    

    结果:

    四、基于SpringBoot框架发送邮件

    1、在工程的pom.xml中导入SpringBoot整合JavaMail的坐标

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

    2、在application.yml文件中配置JavaMail

    password处填写授权码,不是邮箱登录密码。

     3、编写功能类
    (1)SendMailServiceImpl实现简单邮件发送

    import com.itheima.service.SendMailService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.stereotype.Service;
    
    @Service
    public class SendMailServiceImpl implements SendMailService {
        @Autowired
        private JavaMailSender javaMailSender;
        //发送人
        private String from = "xxx@163.com";
        //接收人
        private String to = "xxx@qq.com";
        //标题
        private String subject = "测试邮件";
        //正文
        private String context = "测试邮件正文内容";
        @Override
        public void sendMail() {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(from+"(小甜甜)");
            message.setTo(to);
            message.setSubject(subject);
            message.setText(context);
            javaMailSender.send(message);
        }
    }
    

    在测试类中运行
     

    import com.itheima.service.SendMailService;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class Springboot23MailApplicationTests {
    
        @Autowired
        private SendMailService sendMailService;
    
        @Test
        void contextLoads() {
            sendMailService.sendMail();
        }
    }

    结果:

    (2)SendMailServiceImpl2实现复杂邮件发送

    import com.itheima.service.SendMailService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Service;
    import javax.mail.internet.MimeMessage;
    import java.io.File;
    
    @Service
    public class SendMailServiceImpl2 implements SendMailService {
        @Autowired
        private JavaMailSender javaMailSender;
        //发送人
        private String from = "xxx@163.com";
        //接收人
        private String to = "xxx@qq.com";
        //标题
        private String subject = "测试邮件";
        //正文
        private String context = "<img src='https://img-blog.csdnimg.cn/8774575ed57d48159111f8f505235f89.png?x-oss-process=image/resize,m_fixed,h_300,image/format,png'/><a href='https://www.baidu.com/'>点开有惊喜</a>";
    
        @Override
        public void sendMail() {
            try {
                MimeMessage message = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(message,true);
                helper.setFrom(from +"(小甜甜)");
                helper.setTo(to);
                helper.setSubject(subject);
                helper.setText(context,true);
    
                //添加附件
                File f1 = new File("E:\\guigu\\springbooot\\springboot_23_mail\\target\\classes\\logo.png");
                File f2 = new File("E:\\guigu\\test\\src\\mail\\word1.docx");
    
                helper.addAttachment(f1.getName(),f1);
                helper.addAttachment("最靠谱的培训结构.png",f2);
    
                javaMailSender.send(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    结果:

    参考链接:

    1、邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件 - YSOcean - 博客园

    2、基于JavaMail的Java邮件发送:简单邮件发送_xietansheng的博客-CSDN博客_javamail

    3、基于JavaMail的Java邮件发送:复杂邮件发送_xietansheng的博客-CSDN博客_java发送邮件

    展开全文
  • 基于JavaMail的Java邮件发送:简单邮件发送

    万次阅读 多人点赞 2016-06-14 21:56:35
    电子邮件的应用非常广泛,例如在某网站注册了一个...但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发...

    本文链接: https://blog.csdn.net/xietansheng/article/details/51673073

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

    1. 电子邮件协议

    电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

    2. JavaMail

    我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去官方下载,这里我从 JavaEE 官方的 Github 仓库下载。

    JavaMail 下载地址: https://github.com/javaee/javamail/releases

    这里我下载的版本是 1.6.0 版本,包含了 SMTP, IMAP, 和 POP3 协议的实现的 jar 包:

    javaxmail.png

    我把 JavaMail 1.6.0 的 jar 包上传到了 CSDN,如果无法从 Github 下载,可以从 CSDN 下载(建议到Github下载,CSDN上我设了积分): http://download.csdn.net/download/xietansheng/9928266

    特别注意:

    • 本测试用例用的 JavaMail 版本是 1.6.0,如果下载到其他版本的 JavaMail 运行时出现问题,请使用 JavaMail 1.6.0 版本再进行尝试。
    • 使用 JavaMail 1.6.0 要求的 JDK 版本必须是 JDK 1.7 以上(建议使用最新版 JDK)。
    • 不要直接就完完全全复制我的代码,需要 修改一下发送的标题、内容、用户昵称,要不然所有人都直接复制我的代码发送(自己也不要反复发送内容相同的邮件),内容一致的邮件多次发送,邮箱服务器就可能会检测到这些内容是垃圾广告内容,不让你发送,会返回错误码,查询错误码也能查询到失败原因。

    有些童鞋反应代码提示某些类找不到,或运行出现问题,往往都是 JDK 版本过低,或 JavaMail 版本过低,出现问题时 请使用推荐的版本

    再出现问题,只要能连接成功,都有错误码返回,有些童鞋发送失败在控制台已经给出了错误码,大部分还给出了查看错误码含义的链接,点开链接,查询对应的错误码,为什么失败,已经明明白白的告诉你了,针对失败原因修改即可!

    邮件发送,涉及多端(本地代码端、邮件发送服务器端、邮件接收服务器端),保证自己的代码没问题了,不一定就能成功,你把你的邮件提交到邮件发送服务器,发送的服务器可以给你拒绝服务(比如认为发送的内容是垃圾广告,或者你频繁请求发送),这不是代码端能管的事情,但都有错误码返回,明确告诉你为什么错误。就算你发送成功了,对方也有可能接收不到,成功发送到对方的邮件接收服务器后,对方的服务器可以根据你的内容拒绝收你的邮件(比如认为你的内容是广告诈骗等信息,或者发送过于频繁),对方的服务器可能直接把你的邮件扔垃圾箱,或者直接忽略。出现这些问题,请修改发送的标题、内容、昵称等,重复的内容不要反复发送,或多更换收件箱和发件箱试试!!!

    3. 创建一封简单的电子邮件

    首先创建一个 Java 工程,把下载好的 javax.mail.jar 作为类库加入工程,这里不多说。

    邮件创建步骤:

    1. 创建一个邮件对象(MimeMessage);
    2. 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
    3. 设置邮件的主题(标题);
    4. 设置邮件的正文(内容);
    5. 设置显示的发送时间;
    6. 保存到本地。

    代码实现:

    package com.xiets.javamaildemo;
    
    import javax.mail.Session;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上(必须)
     */
    public class Main {
    
        public static void main(String[] args) throws Exception {
            // 1. 创建一封邮件
            Properties props = new Properties();
            // 用于连接邮件服务器的参数配置(发送邮件时才需要用到)
            Session session= Session.getInstance(props);        // 根据参数配置,创建会话对象(为了发送邮件准备的)
            MimeMessage message = new MimeMessage(session);     // 创建邮件对象
    
            /*
             * 也可以根据已有的eml邮件文件创建 MimeMessage 对象
             * MimeMessage message = new MimeMessage(session, new FileInputStream("MyEmail.eml"));
             */
    
            // 2. From: 发件人
            //    其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
            //    真正要发送时, 邮箱必须是真实有效的邮箱。
            message.setFrom(new InternetAddress("aa@send.com", "USER_AA", "UTF-8"));
    
            // 3. To: 收件人
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("cc@receive.com", "USER_CC", "UTF-8"));
            //    To: 增加收件人(可选)
            message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));
            //    Cc: 抄送(可选)
            message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
            //    Bcc: 密送(可选)
            message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));
    
            // 4. Subject: 邮件主题
            message.setSubject("TEST邮件主题", "UTF-8");
    
            // 5. Content: 邮件正文(可以使用html标签)
            message.setContent("TEST这是邮件正文。。。", "text/html;charset=UTF-8");
    
            // 6. 设置显示的发件时间
            message.setSentDate(new Date());
    
            // 7. 保存前面的设置
            message.saveChanges();
    
            // 8. 将该邮件保存到本地
            OutputStream out = new FileOutputStream("MyEmail.eml");
            message.writeTo(out);
            out.flush();
            out.close();
        }
    
    }
    

    保存的 MyEmail.eml 可以使用邮件客户端打开查看,实际上就是一堆符合SMTP协议格式的文本(内容使用base64进行了编码),也可用记事本打开,如下所示:

    my-email.png

    my-email-txt.png

    4. 发送电子邮件

    发送邮件首先需要有一个邮箱账号和密码,本文以网易163邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,如下所示(其他邮箱大同小异):

    smtp-163-setting.jpg

    代码实现:

    package com.xiets.javamaildemo;
    
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上(必须)
     */
    public class Main {
    
        // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
        // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), 
        //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
        public static String myEmailAccount = "xxxxxxxxx@163.com";
        public static String myEmailPassword = "xxxxxxxxx";
    
        // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
        // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
        public static String myEmailSMTPHost = "smtp.163.com";
    
        // 收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxxxxxxxx@qq.com";
    
        public static void main(String[] args) throws Exception {
            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    // 参数配置
            props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
    
            // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
            //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
            //     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
            /*
            // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
            //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
            //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
            final String smtpPort = "465";
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            */
    
            // 2. 根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getInstance(props);
            session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
    
            // 3. 创建一封邮件
            MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
    
            // 4. 根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();
    
            // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
            // 
            //    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
            //           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
            //           类型到对应邮件服务器的帮助网站上查看具体失败原因。
            //
            //    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
            //           (1) 邮箱没有开启 SMTP 服务;
            //           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
            //           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
            //           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
            //           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
            //
            //    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
            transport.connect(myEmailAccount, myEmailPassword);
    
            // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
    
            // 7. 关闭连接
            transport.close();
        }
    
        /**
         * 创建一封只包含文本的简单邮件
         *
         * @param session 和服务器交互的会话
         * @param sendMail 发件人邮箱
         * @param receiveMail 收件人邮箱
         * @return
         * @throws Exception
         */
        public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
            // 1. 创建一封邮件
            MimeMessage message = new MimeMessage(session);
    
            // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
            message.setFrom(new InternetAddress(sendMail, "某宝网", "UTF-8"));
    
            // 3. To: 收件人(可以增加多个收件人、抄送、密送)
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
    
            // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
            message.setSubject("打折钜惠", "UTF-8");
    
            // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
            message.setContent("XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");
    
            // 6. 设置发件时间
            message.setSentDate(new Date());
    
            // 7. 保存设置
            message.saveChanges();
    
            return message;
        }
    
    }
    

    发送后查看收件人的收件箱:
    dmeo.jpg


    包含文本、图片、附件 的复杂邮件的创建请看下一篇:基于 JavaMail 的 Java 邮件发送:复杂邮件发送


    展开全文
  • Java邮件发送详解

    万次阅读 多人点赞 2019-07-19 13:37:34
    电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp....

    电子邮件

    要在网络上实现邮件功能,必须要有专门的邮件服务器。

    这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

    SMTP服务器地址:一般是 smtp.xxx.com比如163邮箱是smtp.163.comqq邮箱是smtp.qq.com

    电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能;
    在这里插入图片描述

    传输协议

    SMTP协议

    发送邮件:

    我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

    POP3协议

    接收邮件:

    我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

    邮件收发原理

    在这里插入图片描述

    1. 首先通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器
    2. 网易分析发现需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的Smtp服务器
    3. QQ将接收到的邮件存储在545646733@qq.com这个邮件账号的空间中
    4. 再通过Pop3协议连接到Pop3服务器收取邮件
    5. 从545646733@qq.com这个邮件账号的空间中取出邮件
    6. Pop3服务器将取出来的邮件送出去

    注意】有可能填写的收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试

    Java发送邮件

    概述

    我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。

    使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework 。

    得到两个jar包:

    • mail.jar
    • activation.jar

    JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

    我们可以先尝试发送一封简单的邮件,首先请确保电脑可以连接网络。

    • 创建包含邮件服务器的网络连接信息的Session对象。
    • 创建代表邮件内容的Message对象
    • 创建Transport对象,连接服务器,发送Message,关闭连接

    主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序,如图所示:
    在这里插入图片描述

    纯文本邮件

    先在项目中导入jar包
    导入的就是在概述中提到的activation,jar和mail.jar包,如图所示:
    1563456199217.png

    QQ邮箱中获取对应的权限

    QQ邮箱需要安全验证,我们需要获取他对应的权限;

    进入QQ邮箱–>邮箱设置–>账户,下滑找到POP3/IMAP/SMTP/Exchange/CardDav/CalDav服务,开启POP3/SMTP服务,如图所示:
    在这里插入图片描述
    在这里插入图片描述
    记住这16位授权码,然后开始编写测试程序:

    import com.sun.mail.util.MailSSLSocketFactory;
    
    import java.util.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    
    public class SendEmail {
    
        public static void main(String[] args) throws Exception {
    
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com");  设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
    
            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            //使用JavaMail发送邮件的5个步骤
    
            //创建定义整个应用程序所需的环境信息的 Session 对象
    
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication("545646733@qq.com", "授权码");
                }
            });
    
    
            //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);
    
            //2、通过session得到transport对象
            Transport ts = session.getTransport();
    
            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect("smtp.qq.com", "545646733@qq.com", "授权码");
    
            //4、创建邮件
    
            //创建邮件对象
            MimeMessage message = new MimeMessage(session);
    
            //指明邮件的发件人
            message.setFrom(new InternetAddress("545646733@qq.com"));
    
            //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
            message.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
    
            //邮件的标题
            message.setSubject("只包含文本的简单邮件");
    
            //邮件的文本内容
            message.setContent("你好啊!", "text/html;charset=UTF-8");
    
            //5、发送邮件
            ts.sendMessage(message, message.getAllRecipients());
    
            ts.close();
        }
    
    }
    

    带图片和附件的邮件

    先认识两个类一个名词:

    MIME(多用途互联网邮件扩展类型)

    MimeBodyPart类

    javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

    MimeMultipart类

    javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。

    1563462870340.png

    创建包含内嵌图片的邮件

    前面的例子中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可。
    代码如下:

    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import java.util.Properties;
    
    public class SendImageEmail {
        public static void main(String[] args) throws Exception {
    
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com");  设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
    
            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            //使用JavaMail发送邮件的5个步骤
    
            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication("545646733@qq.com", "授权码");
                }
            });
    
    
            //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);
    
            //2、通过session得到transport对象
            Transport ts = session.getTransport();
    
            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect("smtp.qq.com", "545646733@qq.com", "授权码");
    
            //4、创建邮件
    
            //创建邮件
            MimeMessage message = new MimeMessage(session);
    
            // 设置邮件的基本信息
            //发件人
            message.setFrom(new InternetAddress("545646733@qq.com"));
            //收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
            //邮件标题
            message.setSubject("带图片的邮件");
    
            // 准备邮件数据
    
            // 准备图片数据
            MimeBodyPart image = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg"));
            image.setDataHandler(dh);
            image.setContentID("bz.jpg");
    
            // 准备正文数据
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件", "text/html;charset=UTF-8");
    
            // 描述数据关系
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text);
            mm.addBodyPart(image);
            mm.setSubType("related");
    
            //设置到消息中,保存修改
            message.setContent(mm);
            message.saveChanges();
    
            //5.发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        }
    }
    

    带图片和附件的复杂邮件发送
    代码如下:

    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendFileMail {
        public static void main(String[] args) throws MessagingException, GeneralSecurityException {
    
            //创建一个配置文件保存并读取信息
            Properties properties = new Properties();
    
            //设置qq邮件服务器
            properties.setProperty("mail.host","smtp.qq.com");
            //设置发送的协议
            properties.setProperty("mail.transport.protocol","smtp");
            //设置用户是否需要验证
            properties.setProperty("mail.smtp.auth", "true");
    
    
            //=================================只有QQ存在的一个特性,需要建立一个安全的链接
            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
    
            //=================================准备工作完毕
    
            //1.创建一个session会话对象;
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("545646733@qq.com", "授权码");
                }
            });
    
            //可以通过session开启Dubug模式,查看所有的过程
            session.setDebug(true);
    
    
            //2.获取连接对象,通过session对象获得Transport,需要捕获或者抛出异常;
            Transport tp = session.getTransport();
    
            //3.连接服务器,需要抛出异常;
            tp.connect("smtp.qq.com","545646733@qq.com","授权码");
    
            //4.连接上之后我们需要发送邮件;
            MimeMessage mimeMessage = imageMail(session);
    
            //5.发送邮件
            tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //6.关闭连接
            tp.close();
    
        }
    
    
        public static MimeMessage imageMail(Session session) throws MessagingException {
    
            //消息的固定信息
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //邮件发送人
            mimeMessage.setFrom(new InternetAddress("545646733@qq.com"));
            //邮件接收人,可以同时发送给很多人,我们这里只发给自己;
            mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
            mimeMessage.setSubject("我也不知道是个什么东西就发给你了"); //邮件主题
    
    
            /*
            编写邮件内容
            1.图片
            2.附件
            3.文本
             */
    
            //图片
            MimeBodyPart body1 = new MimeBodyPart();
            body1.setDataHandler(new DataHandler(new FileDataSource("src/resources/yhbxb.png")));
            body1.setContentID("yhbxb.png"); //图片设置ID
    
            //文本
            MimeBodyPart body2 = new MimeBodyPart();
            body2.setContent("请注意,我不是广告<img src='cid:yhbxb.png'>","text/html;charset=utf-8");
    
            //附件
            MimeBodyPart body3 = new MimeBodyPart();
            body3.setDataHandler(new DataHandler(new FileDataSource("src/resources/log4j.properties")));
            body3.setFileName("log4j.properties"); //附件设置名字
    
            MimeBodyPart body4 = new MimeBodyPart();
            body4.setDataHandler(new DataHandler(new FileDataSource("src/resources/1.txt")));
            body4.setFileName(""); //附件设置名字
    
            //拼装邮件正文内容
            MimeMultipart multipart1 = new MimeMultipart();
            multipart1.addBodyPart(body1);
            multipart1.addBodyPart(body2);
            multipart1.setSubType("related"); //1.文本和图片内嵌成功!
    
            //new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
            MimeBodyPart contentText =  new MimeBodyPart();
            contentText.setContent(multipart1);
    
            //拼接附件
            MimeMultipart allFile =new MimeMultipart();
            allFile.addBodyPart(body3); //附件
            allFile.addBodyPart(body4); //附件
            allFile.addBodyPart(contentText);//正文
            allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed;
    
    
            //放到Message消息中
            mimeMessage.setContent(allFile);
            mimeMessage.saveChanges();//保存修改
    
    
            return mimeMessage;
    
        }
    
    }
    

    JavaWeb发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

    项目实现:

    1. 新建一个JavaWeb项目,配置tomcat的参数,然后添加jar包(记得在tomcat目录下的common目录下也导包,不然会报500错误),并且添加实体类User,Servlet类RegisterServlet,工具类Sendmail,如图所示:
      在这里插入图片描述
    2. User类代码如下:
    public class User {
    
        private String username;
        private String password;
        private String email;
    
        public User() {
        }
    
        public User(String username, String password, String email) {
            this.username = username;
            this.password = password;
            this.email = email;
        }
    
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }
    }
    
    1. 前端注册页面register.jsp代码如下:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>注册</title>
    </head>
    <body>
    
    <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
        用户名:<input type="text" name="username"><br/>
        密码:<input type="password" name="password"><br/>
        邮箱:<input type="text" name="email"><br/>
        <input type="submit" value="注册">
    </form>
    
    </body>
    </html>
    
    1. 工具类Sendmail类代码如下:
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Properties;
    
    public class Sendmail extends Thread {
    
        //用于给用户发送邮件的邮箱
        private String from = "24736743@qq.com";
        //邮箱的用户名
        private String username = "24736743@qq.com";
        //邮箱的密码
        private String password = "授权码";
        //发送邮件的服务器地址
        private String host = "smtp.qq.com";
    
        private User user;
        public Sendmail(User user){
            this.user = user;
        }
    
        //重写run方法的实现,在run方法中发送邮件给指定的用户
        @Override
        public void run() {
            try{
                Properties prop = new Properties();
                prop.setProperty("mail.host", host);
                prop.setProperty("mail.transport.protocol", "smtp");
                prop.setProperty("mail.smtp.auth", "true");
    
                // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
                MailSSLSocketFactory sf = new MailSSLSocketFactory();
                sf.setTrustAllHosts(true);
                prop.put("mail.smtp.ssl.enable", "true");
                prop.put("mail.smtp.ssl.socketFactory", sf);
    
                //1、创建定义整个应用程序所需的环境信息的 Session 对象
                Session session = Session.getDefaultInstance(prop, new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        //发件人邮件用户名、授权码
                        return new PasswordAuthentication("24736743@qq.com", "授权码");
                    }
                });
    
                //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
                session.setDebug(true);
    
                //2、通过session得到transport对象
                Transport ts = session.getTransport();
    
                //3、使用邮箱的用户名和授权码连上邮件服务器
                ts.connect(host, username, password);
    
                //4、创建邮件
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress(from)); //发件人
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人
                message.setSubject("用户注册邮件"); //邮件的标题
    
                String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题请联系网站客服!!";
    
                message.setContent(info, "text/html;charset=UTF-8");
                message.saveChanges();
    
                //发送邮件
                ts.sendMessage(message, message.getAllRecipients());
                ts.close();
            }catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    1. Servlet类RegisterServlet类代码如下:
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class RegisterServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                //接收用户请求,封装成对象
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                String email = request.getParameter("email");
                User user = new User(username,password,email);
    
                //用户注册成功之后,给用户发送一封邮件
                //我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况;
                Sendmail send = new Sendmail(user);
                //启动线程,线程启动之后就会执行run方法来发送邮件
                send.start();
    
                //注册用户
                request.setAttribute("message", "注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!!");
                request.getRequestDispatcher("info.jsp").forward(request, response);
            } catch (Exception e) {
                e.printStackTrace();
                request.setAttribute("message", "注册失败!!");
                request.getRequestDispatcher("info.jsp").forward(request, response);
            }
        }
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    1. 配置web.xml,代码如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>register</servlet-name>
            <servlet-class>com.kuang.servlet.RegisterServlet</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>register</servlet-name>
            <url-pattern>/RegisterServlet.do</url-pattern>
        </servlet-mapping>
    </web-app>
    
    1. 编写反馈页面info.jsp,代码如下:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>提示信息</title>
    </head>
    <body>
        ${message}
    </body>
    </html>
    
    展开全文
  • 邮件发送失败的原因和解决方法

    千次阅读 2021-07-31 05:22:41
    以下是对邮件发送失败 提示信息的解析: 1、提示信息:There are no DNS entries for the hostname, I cannot determine where to send this message. 退信原因:检索不到接收方域名的邮件解析(MX记录)和 2、提示...
  • JAVA实现邮件发送

    千次阅读 2020-07-04 22:52:37
    一、邮件服务器与传输协议 要在网络上实现邮件...SMTP协议:通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 POP3协议:通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP
  • 【编程开发】之 Java 实现邮件发送

    千次阅读 2020-12-11 10:51:07
    一、邮件简介 1、邮件服务器与传输协议 邮件服务器:要在网络上实现...SMTP服务器:通常把处理用户 smtp 请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 POP3服务器:通常把处理用户 pop3 请求(邮
  • JavaMail邮件发送

    千次阅读 2021-08-04 11:08:02
    文章目录邮件协议下载jar发送邮件创建邮件会话(Session)Properties 属性开启调试模式创建邮件内容多内容以及图片/附件发送邮件完整代码示例 邮件协议 常见的电子邮件协议有SMTP,POP3,IMAP4,它们都隶属于TCP/IP协议...
  • Python实现自动发送邮件(详解)

    千次阅读 多人点赞 2020-12-16 12:21:21
    Python实现自动发送邮件 1.开启SMTP服务 为了实现自动发送邮件的目的,我们需要在邮箱中开启SMTP服务: 这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成...
  • python 发送邮件

    千次阅读 2021-02-03 02:23:35
    smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主...
  • 基于JavaMail的Java邮件发送:复杂邮件发送

    万次阅读 多人点赞 2016-06-20 23:11:52
    上一篇文章 基于 JavaMail 的 Java 邮件发送:简单邮件发送 讲解了邮件的基本协议,JavaMail组件,创建并发送一封简单邮件的详细步骤。本文将介绍如何创建并发送一封包含图片和附件的复杂邮件。 一封复杂的邮件内容...
  • 使用 SMTP 发送电子邮件

    千次阅读 2021-07-08 03:12:08
    使用 SMTP 发送电子邮件Duwamish OnlineAaron ChingMicrosoft Developer Network2000年12月摘要:本文讨论使用 Internet 信息服务 (IIS) 提供的简单邮件传输协议 (SMTP) 服务发送电子邮件的优点。文中同时讲述了配置...
  • 主要可能的原因是 你发送的由于包含了过大的附件 超过了对方邮箱服务器的限制大小 这种情况尤其是在给国外地址发送时容易出现 我也遇到过 给一土耳其的地址发送时就失败过 他们的服务器限制大小不能超过4.9M 将附件...
  • 使用python发送邮件

    千次阅读 多人点赞 2021-10-07 10:15:39
    准备写一个漏洞预警信息脚本,每天定时发送漏洞邮件给自己。python发送邮件有原生的smtplib和email库,但添加附件的时候,需要自己设置MIME, 代码最少也会有十多行, 不太方便,本章主要介绍python中如何使用更方便的...
  • 网易邮件发送不出去MI:SFQ错误

    千次阅读 2021-08-02 01:11:12
    因为业务需要,写了一个在线留言发送到邮箱的小程序,前几天使得挺好。突然发送不了了,报错事务失败。 服务器响应为: 5.5.0MI:STC。经过百度查询,发现是550MI:STC短期内发送了大量信件,超过了网易的限制,该发件...
  • 发邮件时出现邮件发送失败,邮件连接超时的问题主要可能的原因是 你发送的邮件由于包含了过大的附件 超过了对方邮箱服务器的限制大小 这种情况尤其是在给国外邮件地址发送时容易出现我也遇到过 给一土耳其的邮件地址...
  • SpringBoot 发送邮件和附件

    千次阅读 2019-01-22 16:29:41
    作者:yizhiwazi ... SpringBoot集成邮件服务竟如此简单,还等什么... SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件规范,通过它来控制邮件的中转方式。...
  • .Net 发送邮件

    千次阅读 2019-04-08 23:16:41
    关于POP3/SMTP:POP3 用于接收电子邮件 ,SMTP 用于发送电子邮件。 POP3:     POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行...
  • IPC摄像头在线状态ping检测与告警邮件发送项目总结

    千次阅读 多人点赞 2021-10-10 18:50:03
    本文讲述了IPC摄像头在线监测与发送告警邮件项目的详细实现过程,通过ping检测IPC设备是否在线,通过调用libcurl库实现告警邮件发送
  • 一.发到 sina.com 的邮件会被退回二.发到 tom.com 的邮件会被退回三.发到 aol.com 的邮件会被退回五. 收到退信错误提示为"554 5.7.1 ...发给Yahoo的邮件出现"553 Mail from 61.185.81.172 not allowed - VS99-I.
  • 使用Spring Boot发送邮件

    万次阅读 多人点赞 2018-07-30 23:19:01
    SpringBoot版本:2.0.3 ...邮件发送有着很多的原因,如:配置过程中的端口号/授权码错误、550 DT:SPM主题/内容不规范被当做垃圾邮件、发送过于频繁、网络原因。 163邮箱退信的常见问题
  • 问题描述:发送压缩文件到qq邮箱,发现标题为中文名称,能正常显示,但是附件的中文名称为乱码。...Smtp发送中文邮件的时候也会产生像ftp乱码的现象,不知道在网上这样的资料很少,让我们那些第一次遇到这种问题的...
  • 关于python 通过代理服务器发送邮件

    千次阅读 2019-03-26 16:52:03
    终于可以通过公司的代理服务器发邮件了。 最大的感受是参考别人的博客时要认真,切忌心浮气躁。 1、想使用代理服务器,就要用到socks、socket这两个包。首先 安装 Pysocks这个模块。 增加如下代码: import socks ...
  • 10 分钟实现 Java 发送邮件功能

    千次阅读 2020-02-23 13:49:00
    作者 | yizhiwazi链接 |jianshu.com/p/5eb000544dd7Spring Boot集成邮件服务竟如此简单,快速掌握邮件业务类的核心逻辑和企业邮件的日常服务。...
  • 利用java实现发送邮件

    万次阅读 多人点赞 2017-11-14 15:01:31
    很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。电子邮件协议 电子邮件在网络中传输和网页...
  • 2.1 JavaMailSender发送邮件

    千次阅读 2022-02-20 13:39:32
    发送邮件 步骤: 1、邮箱设置 ​ -启用客户端SMTP服务 2、Spring Email ​ -导入jar包 ...它是一组用于从源地址到目的地址传输邮件规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计
  • 23. Django进阶:Django发送邮件

    千次阅读 热门讨论 2021-05-12 23:24:59
    Django进阶:Django发送邮件
  • 它是一组用于从源地址到目的地址传输邮件规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送
  • Spring整合邮件模板定时发送

    千次阅读 2018-07-24 16:09:11
    在企业级开发中,我们不可避免的使用到邮件发送,可能由于项目的需要,我们要定时定频率的给用户或者业务方发送邮件。 目录 发送邮件原理简介 电子邮件的发送与接收过程 过程解释说明 1、用户A的电子邮箱为...
  • Java调用网易163邮箱,发送邮件

    千次阅读 2021-06-25 16:39:42
    Java调用网易163邮箱,发送邮件 Java调用163邮箱发送邮件,大概分为两部分: 1.创建邮件信息,包括标题,内容等 2.创建邮件邮件链接,发送邮件 一、创建邮件链接 1.首先要有163邮箱的账号。 2. 在邮箱设置中查找smtp...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,350
精华内容 32,140
关键字:

关于邮件发送规范要求