精华内容
参与话题
问答
  • 基于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;
        }
    
    }
    

    发送后查看收件人的收件箱:

    sended-email.jpg


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


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

    万次阅读 多人点赞 2019-07-20 16:03:19
    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>
      
    展开全文
  • springboot 2.x 整合邮件发送

    千次阅读 多人点赞 2020-08-01 12:48:32
    又比如通过邮件发送系统情况,通过邮件发送报表信息等等,实际应用场景很多。 原文地址:https://www.mmzsblog.cn/articles/2020/07/28/1595865811262.html 正常我们会用 JavaMail 相关 api 来写发送邮件的相关代码...

    在实际项目中,经常需要用到邮件通知功能。比如,用户通过邮件注册,通过邮件找回密码等;又比如通过邮件发送系统情况,通过邮件发送报表信息等等,实际应用场景很多。

    原文地址https://www.mmzsblog.cn/articles/2020/07/28/1595865811262.html

    正常我们会用 JavaMail 相关 api 来写发送邮件的相关代码,但现在 SpringBoot 提供了一套更简易使用的封装。这篇文章,阿淼就带大家通过 SpringBoot 快速的实现发送邮件的功能。

    1、开启smtp

    这里以 163 邮箱为例。登录 163 邮箱之后,点击设置,如下图:

    1.1、登录邮箱-设置
    获取 spring.mail.password 授权码:

    1.2、开启IMAP/SMTP服务,根据提示走获取授权码

    这个授权码,就是发送邮件时需要的密码。

    1.3、下方有服务地址SMTP服务器:smtp.163.com就是我们要的

    以上步骤完成之后,就可以开始开发了。

    2、新建 maven 项目

    3、 pom 文件中所涉及的依赖包

    导入 SpringBoot 父依赖版本为 2.02

    <parent>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-parent</artifactId>
    	<version>2.0.2.RELEASE</version>
    </parent>
    

    导入 webmail 邮件相关依赖包

    <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>
    

    4、配置文件

    配置文件中参数的获取,最后介绍。

    server:
      port: 8082
    spring:
      http:
        encoding:
          # 编码集
          charset: utf-8
          enabled: true
      mail:
        default-encoding: UTF-8
        #发送邮件的账户
        username: xxxxxxx@qq.com
        # 授权码(获取方式前文已描述)
        password: xxxxxxyyyyyy    
        # (邮箱服务器地址,获取方式前文已描述)  
        # 163 邮箱是smtp.163.com
        # qq邮箱则为smtp.qq.com
        host: smtp.163.com
        properties: 
          mail:
            smtp:
              ssl:
                enable: true
    

    5、发送类实现

    Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能。

    Spring 自带了一个 MailSender 的实现 JavaMailSenderImpl,它会使用 JavaMail API 来发送 Email。后来 spring 推出
    JavaMailSender 进一步简化邮件发送的过程,然后 SpringBoot 对此进行了封装,就有了
    现在的 spring-boot-starter-mail

    接下来,阿淼和大家一起通过实例看看如何在 SpringBoot 中使用 JavaMailSenderImpl 发送邮件。

    简单消息邮件

    @Resource
    private JavaMailSenderImpl javaMailSenderImpl;
        
    public void sendSimpleMail() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        // 设置邮件主题
        simpleMailMessage.setSubject("账号激活");
        // 设置要发送的邮件内容
        simpleMailMessage.setText("hello!");
        // 要发送的目标邮箱
        simpleMailMessage.setTo("yyyyyyyyyy@163.com");
        // 发送者邮箱和配置文件中的邮箱一致
        simpleMailMessage.setFrom("xxxxxxxx@qq.com");
        javaMailSenderImpl.send(simpleMailMessage);
    }
    

    复杂消息邮件

    @Resource
    private JavaMailSenderImpl javaMailSenderImpl;
    
    public void sendMimeMail() {
        MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
        try {
            // 开启文件上传
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            // 设置文件主题
            mimeMessageHelper.setSubject("账号激活");
            // 设置文件内容 第二个参数设置是否支持html
            mimeMessageHelper.setText("<b style='color:red'>账号激活,请点击我</b>", true);
            // 设置发送到的邮箱
            mimeMessageHelper.setTo("yyyyyyyyyy@163.com");
            // 设置发送人和配置文件中邮箱一致
            mimeMessageHelper.setFrom("xxxxxxxx@qq.com");
            // 上传附件
            // mimeMessageHelper.addAttachment("", new File(""));
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        javaMailSenderImpl.send(mimeMessage);
    }
    

    6、 Controller

    @RestController
    public class SendMailController {
    	@Resource
    	private SendMail sendMail;
    	
    	@GetMapping("/sendSimpleMail")
    	public void sendSimpleMail() {
    		sendMail.sendSimpleMail();
    	}
    	
    	@GetMapping("/sendMimeMail")
    	public void sendMimeMail() {
    		sendMail.sendMimeMail();
    	}
    }
    

    7、测试

    7.1、简单邮件

    利用 postman 发送请求:

    查看邮箱结果:

    7.2、复杂邮件

    利用 postman 发送请求:

    查看邮箱结果:

    从结果可以看出,我们设置的 <b style='color:red'>账号激活,请点击我</b> 字体样式已经展示出效果了!

    参考https://www.cnblogs.com/jmcui/p/9758442.html

    github代码地址:

    https://github.com/mmzsblog/mmzsblog-util

    展开全文
  • Python 技术篇-邮件写入html代码,邮件发送表格,邮件发送超链接,邮件发送网络图片。 邮件可以发送html,那我们就能做个表格出来,做个超链接出来,网上找个图片发出来。 重点是:`message = MIMEText(html_text, '...

    邮件可以发送 html,那我们就能做个表格出来,做个超链接出来,网上找个图片发出来。

    重点是: message = MIMEText(html_text, 'html')
    html_text 为邮件内容,第二个可选参数要为 html 才可以。

    qq 账号发送邮箱登陆密码需要用授权码。
    可以看我的这个文章:
    Python 技术篇-qq邮箱授权码开通

    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    html_text = '''
    <table border=1>
    <tr><th>水果</th><th>蔬菜</th></tr>
    <tr><td>苹果</td><td>西红柿</td></tr>
    <tr><td>香蕉</td><td>黄瓜</td></tr>
    </table>
    <p><a href="https://www.baidu.com">进入异世界百度搜索</a></p>
    <img src="...">
    '''
    
    message = MIMEText(html_text,'html')   # 邮件内容,第二个可选参数要为html才可以
    message['From'] = Header('小爱')   # 邮件发送者名字
    message['To'] = Header('小蓝枣')   # 邮件接收者名字
    message['Subject'] = Header('来自异世界的一封信!')   # 邮件主题
    
    mail = smtplib.SMTP()
    mail.connect("smtp.qq.com")   # 连接 qq 邮箱
    mail.login("1150741131@qq.com", "授权码")   # 账号和授权码
    mail.sendmail("1150741131@qq.com", ["2418546511@qq.com"], message.as_string())   # 发送账号、接收账号和邮件信息
    

    运行效果图:
    在这里插入图片描述
    局部放大一下:
    在这里插入图片描述
    喜欢的点个赞❤吧!

    展开全文
  • java 创建邮件发送功能

    万次阅读 2018-03-11 08:40:16
    -- 邮件服务的jar包 --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> package appl...
  • SSL邮件发送

    千次阅读 2020-04-24 08:47:26
    发送邮件,使用第三方邮箱,设计SSL,和用qq/163略有不同 实现代码 package com.reachauto.vspcloud.message.utils; import javax.mail.*; import javax.mail.internet.InternetAddress; impor...
  • Java邮件发送详解

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

    千次阅读 2019-06-26 14:10:48
    Jenkins如何在构建之后将构建状况发送到指定邮箱? 实现 首先,Jenkins要安装插件Email Extension Plugin 安装完成之后,进入系统管理->系统设置,开始设置! Jenkins Location 设置Jenkins Localtion: ...
  • 提示问题: Connection error sending email,retrying once more in 10 seconds…… Connection error sending email,retrying once more in 10 seconds…… Failed after second try sending email ...
  • tp3邮件发送

    千次阅读 2019-05-14 13:44:40
    首先开启QQ邮箱的POP3/SMTP服务 此时开启会有一个动态密码,这个先记下来,下面的function.php 文件夹的 $mail->Password = “*******”; // 邮箱授权码 填写刚才这个 ...有点版本没有以下这几个文件,...
  • SpringBoot整合Email 邮件发送

    千次阅读 2020-03-14 21:50:08
    在开发中,经常会碰到email邮件发送的场景 如发送验证码,向客户发送邮件等等。 今天,本项目将讲解通过Springboot 发送email 邮件 普通文本邮件 ,HTML内容板式邮件 ,包含静态资源邮件,以及带附件邮件。
  • Python 邮件发送之嵌套图片&发送附件

    千次阅读 2020-01-17 15:33:43
    4.发送各种文档和图片,html样式 1. SMTP 介绍 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议。 SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。SMTP 是建立在 TCP上的一种邮件...
  • PHP实现邮件发送

    千次阅读 2019-06-16 16:51:59
    PHP环境下,是提供了发送邮件的函数mail()的,不过该函数要求服务器支持sendmail或者必须设置一台不需要中继的邮件发送服务器,但现在要找到一台不需要身份验证的邮件发送中继几乎不可能,所以使用ma...
  • 基于JavaMail的Java邮件发送:复杂邮件发送

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

    千次阅读 2019-03-07 19:47:52
    java实现邮件发送逻辑并不复杂(不包含附件),只是根据官方调用官方提供的sdk,首先需要引入maven依赖:javax.mail &lt;dependency &gt; &lt;groupId &gt;com.sun.mail&lt;/groupId &gt...
  • 假如我的邮箱地址为huang.ying@@wswhr.com1、安装 Email Extension Plugin 插件2、Extended E-mail Notification设置,如下图:3、邮件通知配置,如下图:3、配置系统管理员邮箱,系统管理员邮件地址必须与上...
  • SAP 邮件发送记录查询

    千次阅读 2019-11-05 11:04:48
    事务代码:SOST 查询自SAP端发出的邮件记录。
  • 第一步:下载邮件   yum install mailx安装过程中有提示,直接回车即可。第二步:进入etc / mail.rc vim etc / mail.rc  设置一些参数,此处用163邮箱,先注册163邮箱,并进入设置里设置勾选POP3 / SMTP与IMAP ...
  • Spring Boot实现邮件发送

    千次阅读 2019-08-15 11:30:24
    Spring Boot实现邮件发送邮件基础准备工作创建项目基本配置 邮件基础   我们经常会听到各种各样的邮件协议,比如 SMTP、POP3、IMAP ,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题。   SMTP ...

空空如也

1 2 3 4 5 ... 20
收藏数 74,088
精华内容 29,635
关键字:

邮件发送