发送邮件_发送邮件失败 - CSDN
精华内容
参与话题
  • 前言,我们这次的案例使用的是QQ邮箱作为示例,作为发送者需要先开启相关的权限(授权)。 授权操作流程: a.进入QQ邮箱,点击‘设置’: b.找到‘账户’: c.往下拉,找到‘POP3/IMAP/SMTP/Exchange/...

     

    前言,我们这次的案例使用的是QQ邮箱作为示例,作为发送者需要先开启相关的权限(授权)。

    授权操作流程:

    a.进入QQ邮箱,点击‘设置’:

    b.找到‘账户’:

    c.往下拉,找到‘POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务’ ,然后开启第一项‘POP3/SMTP服务’,根据提示发送短信,获取授权码(后面代码配置需要用到):

     

    OK,接下来开始编码。

    瞄一眼最后的目录结构:

    首先创建一个Springboot项目,除了勾选web包,还有 Java Mail Sender包:

    创建完成后,pom.xml内依赖包如下:

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

     接下来是配置参数,application.properties(发送者请填写自己的邮箱或者开通授权的邮箱,配置密码的值是刚刚获取的授权码):
     

    #SMTP服务器地址
    spring.mail.host=smtp.qq.com
    #SMTP服务器的端口
    spring.mail.port=587
    #邮箱用户名(发送者)
    spring.mail.username=8XXXXXXXX@qq.com  
    #配置密码(发送短信获取的授权码)
    spring.mail.password=dXXXXXXXyitbdea
    #默认的邮件内容编码格式
    spring.mail.default-encoding=UTF-8
    #SSL 加密工厂
    spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
    #开启debug,会有相关的日志
    spring.mail.properties.mail.debug=true
    
            
    server.port=8011

     到这一步,已经基本完毕,接下来就是使用&调试。

    创建一个MailController.java:

    package com.mail.elegant.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.io.FileSystemResource;
    import org.springframework.mail.MailException;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.File;
    import java.util.Date;
    
    /**
     * @Author : JCccc
     * @CreateTime : 2019/8/6
     * @Description :
     **/
    
    @RestController
    public class MailController {
    
        @Autowired
        JavaMailSender javaMailSender;
    
        /**
         * 发送一般的文本邮件
         * @return
         */
        @PostMapping("sendSimpleMailMessage")
        public String sendSimpleMailMessage() {
            try {
                SimpleMailMessage message = new SimpleMailMessage();
                message.setFrom("86447XXXX@qq.com"); //发送邮件的 邮箱地址
                message.setReplyTo("86447XXXX@qq.com");//回复发送至 邮箱地址
                String[] mail={"330809XXXX@qq.com","114737XXXX@qq.com"};
                message.setTo(mail);//邮件接收的 邮箱地址
               // message.setTo("114737XXXX@qq.com");  可以设置多个 多个时采取数组传参
                message.setCc("86447XXXX@qq.com"); //抄送的 邮箱地址      可以设置多个 多个时采取数组传参
                message.setSentDate(new Date());//发送邮件的 日期
                message.setSubject("测试邮件的标题");//发送邮件的标题
                message.setText("你好,我在测试发送邮件。");//发送邮件的 文本内容
    
                javaMailSender.send(message);
            } catch (MailException e) {
                e.printStackTrace();
                return "send fail";
            }
            return "send success";
    
        }
    
    
        /**
         * 发送带有附近的邮件
         * @return
         */
        @PostMapping("sendEnclosureMailMessage")
        public String sendEnclosureMailMessage() {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
                helper.setSubject("这是一封测试邮件");
                helper.setFrom("86447XXXX@qq.com");
                helper.setTo("330809XXXX@qq.com");
                helper.setCc("86447XXXX@qq.com");
                helper.setBcc("86447XXXX@qq.com");
                helper.setSentDate(new Date());
                helper.setText("这是测试邮件的正文");
                helper.addAttachment("风景.jpg",new File("E:\\elegant\\src\\main\\resources\\pic\\风景.jpg"));
                javaMailSender.send(mimeMessage);
    
            } catch (MailException | MessagingException e) {
                e.printStackTrace();
                return "send fail";
            }
            return "send success";
    
        }
    
        /**
         * 发送内容中带有图片的邮件
         * @return
         */
        @PostMapping("sendImageMailMessage")
        public String sendImageMailMessage() {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
                helper.setSubject("这是一封测试邮件");
                helper.setFrom("86447XXXX@qq.com");
                helper.setTo("330809XXXX@qq.com");
                helper.setCc("86447XXXX@qq.com");
                helper.setBcc("86447XXXX@qq.com");
                helper.setSentDate(new Date());
                helper.setText("<p>hello 大家好,这是一封测试邮件,里面包含了图片</p><p>图片A:</p><img src='cid:p01'/>",true);
                helper.addInline("p01",new FileSystemResource(new File("E:\\elegant\\src\\main\\resources\\pic\\风景.jpg")));
                javaMailSender.send(mimeMessage);
            } catch (MailException | MessagingException e) {
                e.printStackTrace();
                return "send fail";
            }
            return "send success";
    
        }
    
    
    }
    

    PS: 
    1.MailController.java 里面的邮箱地址请正确填写, 只要是setFrom的邮箱地址,必须对应application.properties里面的spring.mail.username
    2.MailController.java 里面的附件路径、图片路径请填写正确(我的图片放在项目里面的):

     

    最后用postman分别调用接口,然后对应的qq邮箱就会收到邮件:

     普通文本邮件:

     带有附件的邮件:

    文本内容带有图片的邮件:

     

     好了,发生邮件教程到此。

    展开全文
  • 您只需输入发送邮件的地址、标题和正文即可发送邮件。 您也可以通过程序简单的修改,生成对企业单独的邮件提交订单! 更新日志 1、减少首页CSS垃圾代码 2、隐藏备注信息 3、脱离配置文件信息
  • javaEmail发送邮件

    千次阅读 2019-03-28 11:58:49
    SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议。该协议定义了邮件客户端软件和SMTP服务器之间,以及两台SMTP服务器之间的通信规则。在Java Mail API中,基于Java Mail的程序将与本公司或Internet...

    效果如下:
    在这里插入图片描述
    在这里插入图片描述

    一.电子邮件协议:

    SMTP 简单邮件传输
    SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议。该协议定义了邮件客户端软件和SMTP服务器之间,以及两台SMTP服务器之间的通信规则。在Java Mail API中,基于Java Mail的程序将与本公司或Internet服务提供商(ISP)的SMTP服务器通信,该SMTP服务器将会把消息转发给用于接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。Java Mail API中没有集成用于处理配置服务器以转发消息或添加/删除电子邮件账户等功能。

    POP3邮局协议
    POP3是Post Office Protocol 3的简称,即邮局协议第3版,该协议是在RFC 1939中定义的。它是Internet电子邮件的第一个离线协议标准,也就是说,POP3是一个简单而实用的邮件信息传输协议。目前在Internet上,大多数人都采用POP3来接收邮件。POP3为每个用户的每个邮箱提供支持,但是POP3并不支持查看邮件信息及统计新邮件的功能,因此,在使用Java Mail API时,如果想获取这些信息,需要自己进行计算。

    IMAP 接收邮件协议
    IMA P的含义是Internet消息访问协议,当前版本是第4版,也称作IMAP4,该协议是在RFC 2060中定义的。IMAP是接收消息的更加高级协议。使用IMAP时,所用邮件服务器必须支持该协议,但是如果所有邮件服务器只支持该协议,并不能使用全部IMAP协议,为了能够支持全部IMAP协议,所用邮件服务器还应该支持POP协议。在Java Mail程序通过IMAP协议可以在服务器上拥有包括多个文件夹的用户,并且这些文件夹可以被多个用户共享。
    虽然IMAP协议具有更高级的功能,但是也不要让每个用户都使用,这是因为IMAP需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护消息、备份信息,这会加重邮件服务器的负荷。

    MIME
    MIME是多用途的网际邮件扩充协议的简称。它不是一种邮件传输协议,而是用于定义传输内容(如消息的格式、附件等)的协议。许多文档都对MIME协议作了描述(包括RFC 2045、RFC 2046和RFC 2047)。MIME是对RFC 822的扩充,RFC 822规定了内容只包括采用ASCII编码的纯文本的邮件格式,而MIME允许在邮件中包含附件。作为Java Mail API的用户,一般不需要担心这些格式。

    二.采用pop3发送邮件

    1.创建springboot项目,目录结构如下
    在这里插入图片描述
    2.配置依赖

        <!--视图解析-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!-- spring热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <!--邮箱-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
    

    3.在application.yml进行配置

    spring:
      mail:
        #邮件协议smtp
        host: smtp.qq.com
        #发送者的邮件的用户名
        username: 657050518@qq.com
        #使用的编码
        default-encoding: utf-8
        #移动端客户授权码(在邮箱中设置)
        password: xxxxxxxxxxx
    

    4.发送邮件,我主要分为简单邮件和带附件的邮件(附件可以是文件和图片,可以多个)

    (4.1)新建IEmailService接口,包含简单邮件,和带附件接口
    在这里插入图片描述

    (4.2)新建EmailService实现类,实现IEmailService接口。

    @Service
    public class EmailService implements IEmailService {
    
    //从application.properties配置文件中注入发送者的邮件地址
    @Value("${spring.mail.username}")
    private String fromEmail;
    
    //注入spring发送邮件的对象
    @Autowired
    private JavaMailSender javaMailSender;
    
    @Override
    public boolean sendAttachmentMail(String to, String subject, String content) {
    	SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    	simpleMailMessage.setTo(to);
    	simpleMailMessage.setFrom(fromEmail);
    	simpleMailMessage.setSubject(subject);
    	simpleMailMessage.setText(content);	
    	try {
    		javaMailSender.send(simpleMailMessage);  		//执行发送
    	} catch (Exception e) {
    		return false;
    	}
    	return true;
    }
    
    @Override
    public boolean sendAttachmentMail(String to, String subject, String content, List filepath) {
    	MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    	try {
    		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
    		helper.setTo(to);
    		helper.setSubject(subject);
    		helper.setText(content);
    		helper.setFrom(fromEmail);
    		if(filepath.size()>0){						//读取附件文件(传入文件路径)
    			for (Object string : filepath) {		//遍历文件数组,实现多个附件的添加
    				FileSystemResource file = new FileSystemResource(string.toString());
    				String fileName = file.getFilename();//获取文件名
    				helper.addAttachment(fileName, file);//参数:文件名,文件路径
    			}
    			try {
    				javaMailSender.send(mimeMessage);		//发送邮件
    			} catch (Exception e) {
    				return false;						//发送出现异常(或者文件路径不对)
    			}
    			return true;							//成功发送
    		}else {
    			return false;    						//没有附件文件(中断发送)
    		}
    	} catch (MessagingException e) {
    		e.printStackTrace();
    		//捕获到创建MimeMessageHelper的异常
    //			return false;
    		}
    		return true;
    	}
    
    }
    

    5.在发送带附件邮件的时候,需要先把附件传到服务器,不过我没有服务器,就先把附件传到本地项目的静态资源file文件里。

    (5.1)在util新建FileUtil类,处理文件上传。如下:
    在这里插入图片描述
    6.接下来写前台界面

    (6.1)经过不懈努力终于写完了

    (6.3)效果如下:
    在这里插入图片描述
    附上项目源码:https://github.com/luo205499/javaemaildemo

    展开全文
  • 利用java实现发送邮件

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

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

    电子邮件协议
    电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
    JavaMail
    我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去官方下载,这里我从 JavaEE 官方的 Github 仓库下载。
    JavaMail 下载地址:https://github.com/javaee/javamail/releases
    最新的版本是 1.6.0 ,包含了 SMTP, IMAP, 和 POP3 协议的实现:

    如果是mvn项目的话,我们只需要添加依赖即可
    <dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
    </dependency>
    创建一封简单的电子邮件
    邮件创建步骤:
    1. 创建一个邮件对象(MimeMessage);
    2. 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
    3. 设置邮件的主题(标题);
    4. 设置邮件的正文(内容);
    5. 设置显示的发送时间;
    6. 保存到本地。
    代码如下:

     

    public class TestMail {
        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("email@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("邮件主题", "UTF-8");
    
            // 5. Content: 邮件正文(可以使用html标签)
            message.setContent("这是邮件正文", "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进行了编码),也可用记事本打开,如下所示:

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

    代码实现:

     

    public class SendMail {
        // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
        // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
        //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
        public static String myEmailAccount = "xxxxxxx@126.com";
        public static String myEmailPassword = "xxxxxxxx";
    
        // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
        // 网易126邮箱的 SMTP 服务器地址为: smtp.126.com
        public static String myEmailSMTPHost = "smtp.126.com";
    
        // 收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxxxxx@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);
            // 设置为debug模式, 可以查看详细的发送 log
            session.setDebug(true);
    
            // 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) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
            //
            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("邮件正文", "text/html;charset=UTF-8");
                // 6. 设置发件时间
            message.setSentDate(new Date());
    
            // 7. 保存设置
            message.saveChanges();
    
            return message;
        }
    }

    下面我们对我们的代码解析一下:
    1、对应用程序配置邮件会话
    javax.mail.Session保存邮件系统的配置属性和提供用户验证的信息,发送email首先要获取session对象。
    (1)Session.getInstance(java.util.Properties)获取非共享的session对象
    (2)Session.getDefaultInstance(java.utilProperties)获取共享的session对象
    两者都必须建立Properties prop=new Properties()对象;
    注意:一般对单用户桌面应用程序使用共享Session对象。
    用SMTP协议发送Email时通常要设置mail.smtp.host(mail.protocol.host协议特定邮件服务器名)属性。

    prop.put("mail.smtp.host","smtp.mailServer.com");
    Session mailSession=Session.getInstance(prop);

    注意:在真正使用创建的过程中,往往会让我们验证密码,这是我们要写一个密码验证类。javax.mail.Authenticator是一个抽象类,我们要写MyAuthenticator的密码验证类,该类继承Authenticator实现:

    protected PasswordAuthentication getPasswordAuthentication(){
    return new PasswordAuthentication(String userName, String password);
    }

    这时我们创建Session对象:
    Session mailSession=Session.getInstance(prop,new MyAuthenticator(userName,Password));
    并且要设置使用验证:prop.put("mail.smtp.auth","true");
    使用 STARTTLS安全连接:prop.put("mail.smtp.starttls.enable","true");
    2、配置邮件会话之后,要编写消息
    要编写消息就要生成javax.mail.Message子类的实例或对Internet邮件使用javax.mail.interet.MimeMessage类。
    (1)建立MimeMessage对象
    MimeMessage扩展抽象的Message类,构造MimeMessage对象:
    MimeMessage message=new MimeMessage(mailSession);
    (2)消息发送者、日期、主题

    message.setFrom(Address theSender);
    message.setSentDate(java.util.Date theDate);
    message.setSubject(String theSubject);

    (3)设置消息的接受者与发送者(寻址接收)

    setRecipient(Message.RecipientType type , Address theAddress);
    setRecipients(Message.RecipientType type , Address[] theAddress);
    addRecipient(Message.RecipientType type , Address theAddress);
    addRecipients(Message.RecipientType type,Address[] theAddress);

    方法都可以指定接受者类型,但是一般用后两个,这样可以避免意外的替换或者覆盖接受者名单。定义接受者类型:
    Message.RecipientType.TO:消息接受者
    Message.RecipientType.CC:消息抄送者
    Message.RecipientType.BCC:匿名抄送接收者(其他接受者看不到这个接受者的姓名和地址)
    (4)设置消息内容
    JavaMail基于JavaBean Activation FrameWork(JAF),JAF可以构造文本消息也可以支持附件。
    设置消息内容时,要提供消息的内容类型-----即方法签名:
    MimeMessage.setContent(Object theContent,String type);
    也可以不用显式的制定消息的内容类型:MimeMessage.setText(String theText);

     

    注意:建立地址javax.mail.InternetAddress toAddress=new InternetAddress(String address);

     

     

    源码

    参考:

    http://blog.csdn.net/qq_32371887/article/details/72821291

    http://www.cnblogs.com/codeplus/archive/2011/10/30/2229391.html

    http://blog.csdn.net/xietansheng/article/details/51673073

    http://blog.csdn.net/xietansheng/article/details/51722660

    http://www.cnblogs.com/jiaguozhilian/p/5809815.html

    http://blog.csdn.net/karem/article/details/4646071

    http://blog.csdn.net/csh624366188/article/details/7183457

    http://www.cnblogs.com/Ant-soldier/p/6592858.html

    http://blog.csdn.net/shuaicihai/article/details/59484175

     

     

     

    展开全文
  • Java实现邮件发送

    万次阅读 多人点赞 2019-08-22 14:05:18
    Java实现邮件发送 一、邮件服务器与传输协议 要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱...

    Java实现邮件发送

    一、邮件服务器与传输协议

    • 要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

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

    • SMTP协议

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

    • POP3协议

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

    二、Java发送邮件

    在这里插入图片描述
    使用到的jar包:

    • mail.jar
    • activation.jar

    QQ邮箱需获取相应的权限:

    QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
    在这里插入图片描述
    Java实现纯文本邮件发送

    package org.westos.email;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendEamil {
        public static void main(String[] args) throws MessagingException, GeneralSecurityException {
            //创建一个配置文件并保存
            Properties properties = new Properties();
    
            properties.setProperty("mail.host","smtp.qq.com");
    
            properties.setProperty("mail.transport.protocol","smtp");
    
            properties.setProperty("mail.smtp.auth","true");
    
    
            //QQ存在一个特性设置SSL加密
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
    
            //创建一个session对象
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("619046217@qq.com","16位授权码");
                }
            });
    
            //开启debug模式
            session.setDebug(true);
    
            //获取连接对象
            Transport transport = session.getTransport();
    
            //连接服务器
            transport.connect("smtp.qq.com","619046217@qq.com","16位授权码");
    
            //创建邮件对象
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //邮件发送人
            mimeMessage.setFrom(new InternetAddress("619046217@qq.com"));
    
            //邮件接收人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("875203654@qq.com"));
    
            //邮件标题
            mimeMessage.setSubject("Hello Mail");
    
            //邮件内容
            mimeMessage.setContent("我的想法是把代码放进一个循环里","text/html;charset=UTF-8");
    
            //发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //关闭连接
            transport.close();
        }
    }
    

    Java实现文本图片附件复杂的邮件发送
    MIME(多用途互联网邮件扩展类型)

    MimeBodyPart类

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

    MimeMultipart类

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

    package org.westos.email;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.*;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendComplexEmail {
        public static void main(String[] args) throws GeneralSecurityException, MessagingException {
            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);
    
            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //传入发件人的姓名和授权码
                    return new PasswordAuthentication("619046217@qq.com","16位授权码");
                }
            });
    
            //2、通过session获取transport对象
            Transport transport = session.getTransport();
    
            //3、通过transport对象邮箱用户名和授权码连接邮箱服务器
            transport.connect("smtp.qq.com","619046217@qq.com","16位授权码");
    
            //4、创建邮件,传入session对象
            MimeMessage mimeMessage = complexEmail(session);
    
            //5、发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //6、关闭连接
            transport.close();
    
    
        }
    
        public static MimeMessage complexEmail(Session session) throws MessagingException {
            //消息的固定信息
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //发件人
            mimeMessage.setFrom(new InternetAddress("619046217@qq.com"));
            //收件人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("619046217@qq.com"));
            //邮件标题
            mimeMessage.setSubject("带图片和附件的邮件");
    
            //邮件内容
            //准备图片数据
            MimeBodyPart image = new MimeBodyPart();
            DataHandler handler = new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试图片.png"));
            image.setDataHandler(handler);
            image.setContentID("test.png"); //设置图片id
    
            //准备文本
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");
    
            //附件
            MimeBodyPart appendix = new MimeBodyPart();
            appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试文件.txt")));
            appendix.setFileName("test.txt");
    
            //拼装邮件正文
            MimeMultipart mimeMultipart = new MimeMultipart();
            mimeMultipart.addBodyPart(image);
            mimeMultipart.addBodyPart(text);
            mimeMultipart.setSubType("related");//文本和图片内嵌成功
    
            //将拼装好的正文内容设置为主体
            MimeBodyPart contentText = new MimeBodyPart();
            contentText.setContent(mimeMultipart);
    
            //拼接附件
            MimeMultipart allFile = new MimeMultipart();
            allFile.addBodyPart(appendix);//附件
            allFile.addBodyPart(contentText);//正文
            allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
    
    
            //放到Message消息中
            mimeMessage.setContent(allFile);
            mimeMessage.saveChanges();//保存修改
    
            return mimeMessage;
        }
    }
    
    

    JavaWeb发送邮件(网站注册成功发送提示邮件)

    1. User

      package org.westos.mail;
      
      public class User {
          private String name;
          private String password;
          private String mail;
      
          public User() {
          }
      
          public User(String name, String password, String mail) {
              this.name = name;
              this.password = password;
              this.mail = mail;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getPassword() {
              return password;
          }
      
          public void setPassword(String password) {
              this.password = password;
          }
      
          public String getMail() {
              return mail;
          }
      
          public void setMail(String mail) {
              this.mail = mail;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "name='" + name + '\'' +
                      ", password='" + password + '\'' +
                      ", mail='" + mail + '\'' +
                      '}';
          }
      }
      
      
    2. Servlet

      package org.westos.mail;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      public class Servlet extends javax.servlet.http.HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request,response);
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) {
              //处理前端请求
              String username = request.getParameter("username");
              String password = request.getParameter("password");
              String email = request.getParameter("email");
      
              //将信息封装进user对象
              User user = new User(username, password, email);
      
              SendMail sendMail = new SendMail(user);
              sendMail.start(); //开启线程
      
              request.setAttribute("msg","发送成功");
              try {
                  request.getRequestDispatcher("msg.jsp").forward(request,response);
              } catch (ServletException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
      
          }
      }
      
      
    3. SengMail

      package org.westos.mail;
      
      import com.sun.mail.util.MailSSLSocketFactory;
      
      import javax.mail.*;
      import javax.mail.internet.AddressException;
      import javax.mail.internet.InternetAddress;
      import javax.mail.internet.MimeMessage;
      import java.security.GeneralSecurityException;
      import java.security.PublicKey;
      import java.util.Properties;
      
      public class SendMail extends Thread {
          //发件人信息
          private String From = "619046217@qq.com";
          //发件人邮箱
          private String recipient = "619046217@qq.com";
          //邮箱密码
          private String password = "16位授权码";
          //邮件发送的服务器
          private String host = "smtp.qq.com";
      
          //收件人信息
          private User user;
          public SendMail(User user){
              this.user = user;
          }
      
          @Override
          public void run() {
              try {
                  Properties properties = new Properties();
      
                  properties.setProperty("mail.host","smtp.qq.com");
      
                  properties.setProperty("mail.transport.protocol","smtp");
      
                  properties.setProperty("mail.smtp.auth","true");
      
                  //QQ存在一个特性设置SSL加密
                  MailSSLSocketFactory sf = null;
                  try {
                      sf = new MailSSLSocketFactory();
                  } catch (GeneralSecurityException e) {
                      e.printStackTrace();
                  }
                  sf.setTrustAllHosts(true);
                  properties.put("mail.smtp.ssl.enable", "true");
                  properties.put("mail.smtp.ssl.socketFactory", sf);
      
                  //创建一个session对象
                  Session session = Session.getDefaultInstance(properties, new Authenticator() {
                      @Override
                      protected PasswordAuthentication getPasswordAuthentication() {
                          return new PasswordAuthentication(recipient,password);
                      }
                  });
      
                  //开启debug模式
                  session.setDebug(true);
      
                  //获取连接对象
                  Transport transport = null;
                  try {
                      transport = session.getTransport();
                  } catch (NoSuchProviderException e) {
                      e.printStackTrace();
                  }
      
                  //连接服务器
                  transport.connect(host,From,password);
      
      
                  //创建一个邮件发送对象
                  MimeMessage mimeMessage = new MimeMessage(session);
                  //邮件发送人
                  mimeMessage.setFrom(new InternetAddress(recipient));
      
                  //邮件接收人
                  mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail()));
      
                  //邮件标题
                  mimeMessage.setSubject("网站注册成功");
      
                  //邮件内容
                  mimeMessage.setContent("网站注册成功,密码为"+user.getPassword()+",请妥善保管密码","text/html;charset=UTF-8");
      
                  //发送邮件
                  transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
      
                  transport.close();
      
              }catch (Exception e){
                  e.printStackTrace();
              }
      
          }
      
      }
      
      
      
    4. register.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>注册页面</title>
      </head>
      <body>
      
      <form action="${pageContext.request.contextPath}/a.do" method="post">
          <p>用户名:<input type="text" name="username" required></p>
          <p>密码:<input type="password" name="password" required></p>
          <p>邮箱:<input type="email" name="email" required></p>
          <p><input type="submit" value="提交"></p>
      </form>
      </body>
      </html>
      
      
    5. msg.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
      ${msg}
      </body>
      </html>
      
      
    6. 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>Servlet</servlet-name>
              <servlet-class>org.westos.mail.Servlet</servlet-class>
          </servlet>
      
          <servlet-mapping>
              <servlet-name>Servlet</servlet-name>
              <url-pattern>/a.do</url-pattern>
          </servlet-mapping>
      </web-app>
      
    展开全文
  • Java邮件发送详解

    万次阅读 多人点赞 2019-08-13 09:06:30
    电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp....
  • 图文并茂邮件实现、普通邮件发送演示、带附件的邮件发送的源码以及编写时所参考的相关资料和大家分享一下!
  • 说到发送邮件发送,先提一下SMTP(呵呵,高手就跳过这一段吧!)。 SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式...
  • 基于JavaMail的Java邮件发送:简单邮件发送

    万次阅读 多人点赞 2019-01-24 11:59:59
    本文链接: ... ...但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发...
  • 怎样发送匿名邮件

    万次阅读 热门讨论 2018-02-22 11:36:25
    有时候,我们不想让收件人知道我们是谁,比如我们想给某个人提意见,或者给暗恋的人写情书,而不想让他们知道我们是谁,这个时候我们就可以匿名发送给他们。 这里小编推荐给大家一种发送匿名邮件的方法。如何发送...
  • 用JS实现发邮件的功能 完美解决

    万次阅读 2010-06-07 16:47:00
    如何用JS实现发邮件的功能? 我想用JS实现把页面文本框中的内容直接通过邮件的方式发送到一个指定的邮箱。fengxq给出的答案是if(confirm("是否发邮件")) location="mailto:fengxq87@126....
  • foxmail没有已发送邮件文件夹

    万次阅读 2016-08-10 12:35:24
    新建一个本地文件夹“已发送邮件”,然后选择文件夹映射,指向“已发送邮件
  • HTML发送邮件链接

    万次阅读 热门讨论 2016-11-04 22:37:10
    大家点击我的博客主页详细资料里的邮箱就可以给我发邮件了,那么这个...给我发邮件 这样会调启系统默认的邮件程序发送给ghsau@163.com,并且收件人那里已经填上了我邮箱的地址。  2. 复杂的链接  效果:给我发邮件
  • 如何使用SAP发送邮件

    千次阅读 2016-07-25 21:50:52
    或用 事务代码SCOT和SMICM来安排后台自动发邮件,这样做是方便其他人发邮件时,不用手动配置,只 要创建新邮件后按发送就可以了。后台作业自动按周期发送出去的,也可以将邮件发送到OA系 统。  四、
  • 本篇学习点击一个链接,触发邮件客户端弹窗。有些网站,我们点击邮件联系管理员,有时候会弹窗,这个弹窗,需要...看看一个例子,我们设置发生邮件给谁,邮件主题和邮件内容都可以指定。 HTML mail 链接
  • Html页面中点击按钮发送邮件

    万次阅读 2012-01-21 16:11:49
    在html页面中写一行代码实现发送邮件功能  Email 点击email链接,给XXX@126.com发送邮件,系统会自动调用outlook,如果没有装的话,那只有自己看一下了
  • 取消outlook正在发送邮件

    万次阅读 2012-11-30 15:02:45
    1、登录OUTLOOK,在 工具 —》选项 —》邮件设置 —》发送/接收(s)... 如图所示: 2、点击 “发送/接收(s)...” 后,将下图红框的勾去掉; 3、然后点击outlook界面最右下角的发送状态图标,把正在发送的...
  • 点击a标签发送邮件的实现

    万次阅读 2017-08-04 17:49:15
    今天去面试,做面试题的时候发现问道: 请问,点击a标签发送邮件的 href 该如何写,当时就蒙了,后来 在网上搜了一下,原来还是挺简单的,代如下: 告诉我们
  • Java发送邮件换行问题

    万次阅读 2017-06-15 20:34:30
    利用用java编写的发送邮件要使用来实现换行,在邮件中内容自动实现换行而不能使用一般的\n,或者\r\n
  • 今日,遇到问题:  在foxmail中,qq企业邮箱收取邮件正常,不能发送。... 另,在解决此问题时候,有人反映在macbook中使用foxmail收取邮件正常,不能发送邮件。有可能是需要确认证书安全的原因。
1 2 3 4 5 ... 20
收藏数 500,152
精华内容 200,060
关键字:

发送邮件