首页 > 其他分享 >邮件的发送

邮件的发送

时间:2024-05-09 20:24:20浏览次数:19  
标签:mail 发送 服务器 邮箱 new message 邮件

  1. 邮件发送和接收的协议

    SMTP协议 (Simple Mail Transfer Protocol)

    • 属于TCP/IP协议族。
    • 控制信件的中转方式,帮助每台计算机在发送或中转信件时找到下一个目的地。
    • SMTP服务器是遵循SMTP协议的发送邮件服务器。

    POP3协议 (Post Office Protocol - Version 3)

    • 属于TCP/IP协议族。
    • 用于远程管理在服务器上的电子邮件,帮助用户登录到邮件服务器上、取邮件、删邮件等。
    • POP服务器是遵循POP协议的邮件接收服务器。
  2. 邮件服务器

    要在网络上实现邮件功能,要使用专门的邮件服务器。

    • SMTP服务器 :一般是smtp.xxx.com。如163邮箱smtp.163.com,QQ邮箱smtp.qq.com。
    • POP服务器:一般是pop.xxx.com。如163邮箱pop.163.com,QQ邮箱pop.qq.com。
  3. 原理图

  1. 用户A通过SMTP协议连接到SMTP服务器,发送邮件到QQ邮箱的SMTP服务器;
  2. QQ邮箱的SMTP服务器,通过SMTP协议将邮件中转到网易邮箱的SMTP服务器;
  3. 网易邮箱的SMTP服务器,将接收到的邮件存储在B的邮箱账号的邮箱空间中;
  4. 用户B通过POP3协议连接到POP服务器,请求收取邮件;
  5. POP服务器从B的邮箱账号的邮箱空间中取出邮件;
  6. POP服务器将取出来的邮件给B。
  1. 用java简单邮件发送实现(qq邮件)

    需要依赖的jar包:

    • javaMail API
    • java Activation Framework
      package com.email;
    
      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 MailSendDemo {
          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);
    
              //1.创建定义整个应用程序所需的环境信息的session对象
              //只有qq邮箱有
              Session session = Session.getDefaultInstance(prop, new Authenticator() {
                  public PasswordAuthentication getPasswordAuthentication(){
                      return new PasswordAuthentication("[email protected]","授权码");
                  }
              });
              //开启session的debug模式,这样就可以查看到程序发送Email的运行状态
              session.setDebug(true);
    
              //2.通过session得到transport对象(发送邮件的对象)
              Transport ts = session.getTransport();
    
              //3.使用邮箱的用户名和授权码连上邮件服务器
              ts.connect("smtp.qq.com", "发信人邮箱@qq.com", "授权码");
    
              //4.创建邮件
              //需要传递session
              MimeMessage message = new MimeMessage(session);
              //发件人
              message.setFrom(new InternetAddress("发信人邮箱@qq.com"));
              //收件人
              message.setRecipient(Message.RecipientType.TO, new InternetAddress("收信人邮箱@qq.com"));
              //设置邮件的主体
              message.setSubject("简单邮件");
              //设置邮件的内容
              //同样可以设置样式
              message.setContent("你好啊", "text/html;charset=UTF-8");
    
              //5.发送邮件
              ts.sendMessage(message, message.getAllRecipients());
              //6.关闭连接
              ts.close();
          }
      }
    
    
  2. 用java实现复杂邮件发送,复杂邮件指的是:邮件内容既有文本,又有图片还有附件。

      /**
       * 创建复杂邮件
       * 相比普通邮件增加:图片和附件(需要数据处理,设置CID和附件名)、描述数据关系、设置并保存修改
       *
       * @param session   Session对象
       * @param addresser 发件人
       * @param addressee 收件人
       * @return 复杂邮件
       */
      private MimeMessage makeMixedMessage(Session session, String addresser, String addressee) throws MessagingException {
          MimeMessage message = new MimeMessage(session);
    
          message.setFrom(new InternetAddress(addresser)); // 发件人
          message.setRecipient(Message.RecipientType.TO, new InternetAddress(addressee)); // 收件人
          message.setSubject("Java实现邮件发送:复杂邮件"); // 邮件主题
    
          // 邮件内容
          // 1、正文
          MimeBodyPart textPart = new MimeBodyPart();
          textPart.setContent("复杂邮件的正文,<img src='cid:a'>附带一张图片", "text/html;charset=utf-8");
    
          // 2、图片
          MimeBodyPart imgPart = new MimeBodyPart();
          DataHandler dh = new DataHandler(new FileDataSource("src\\main\\resources\\img\\a.jpg"));
          imgPart.setDataHandler(dh); // 需要数据处理
          imgPart.setContentID("a"); // 设置CID
    
          // 3、附件
          MimeBodyPart attachPart = new MimeBodyPart();
          DataHandler dh1 = new DataHandler(new FileDataSource("src\\main\\resources\\test\\test.md"));
          attachPart.setDataHandler(dh1); // 需要数据处理
          attachPart.setFileName("file.md"); // 设置附件名,最好包含后缀名
    
          // 描述数据关系:alternative/related/mixed
          MimeMultipart mm = new MimeMultipart();
          mm.addBodyPart(textPart);
          mm.addBodyPart(imgPart);
          mm.addBodyPart(attachPart);
          mm.setSubType("mixed");
    
          // 设置到消息中,保存修改
          message.setContent(mm);
          message.saveChanges();
    
          return message;
      }
    
    
  3. Java Web中的邮件发送

    //servlet
    public class RegisterServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 获取参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String mail = req.getParameter("mail");
    
            User user = new User(username, password, mail);
    
            // 启动线程来发送邮件,优化注册等待时间
            MailThread mailThread = new MailThread(user);
            mailThread.start(); // start()才是开启多线程,run()只是调用方法
    
            req.setAttribute("msg","注册成功,稍后会收到一封邮件");
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    //User类
    public class User {
        private String username; // 账户
        private String password; // 密码
        private String mailAddress; // 邮箱地址
    }
    //多线程实现邮件发送
    /*
    多线程实现邮件发送的意义:
    
    如果不用多线程,在邮件成功发出后,程序才会继续运行;
    用户体验差,等待时间长;
    使用多线程优化,在完成注册后程序继续运行(如跳转页面等),邮件发送在单独的线程中完成。
    */
    public class MailThread extends Thread {
        final private String host = "smtp.qq.com"; // 服务器主机号
        final private String authCode = "xxx"; // 授权码
        final private String addresser = "[email protected]"; // 发件人邮箱
        final private User user;
    
        public MailThread(User user) {
            this.user = user;
        }
    
        @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"); // 权限:验证用户名、授权码
    
                // SSL加密:QQ邮箱需要设置,通过以下4行代码
                MailSSLSocketFactory mssf = null;
                mssf = new MailSSLSocketFactory();
                mssf.setTrustAllHosts(true);
                prop.put("mail.smtp.ssl.enable", "true");
                prop.put("mail.smtp.ssl.socketFactory", mssf);
    
                // 1、创建Session对象
                Session session = Session.getDefaultInstance(prop, new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(addresser, authCode);
                    }
                });
    
                session.setDebug(true); // 开启Debug模式
    
                // 2、获得Transport对象
                Transport transport = session.getTransport();
                transport.connect(host, addresser, authCode);
    
    
                // 3、创建邮件:调用相应方法(纯文本/内嵌资源/带附件)
                MimeMessage message = new MimeMessage(session);
    
                message.setFrom(new InternetAddress(addresser)); // 发件人
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getMailAddress())); // 收件人
                message.setSubject("用户注册邮件"); // 邮件主题
    
                String info = "注册成功,您的用户名:" + user.getUsername() + ",密码:" + user.getPassword();
    
    
                // 邮件内容
                message.setContent(info, "text/html;charset=utf-8");
    
                // 4、发送邮件
                transport.sendMessage(message, new InternetAddress[]{new InternetAddress(user.getMailAddress())});
    
                // 关闭邮件服务器
                transport.close();
            } catch (GeneralSecurityException | MessagingException e) {
                e.printStackTrace();
            }
        }
    }
    //注册servlet
    <servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>com.test.mail.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/register.do</url-pattern>
    </servlet-mapping>
    

标签:mail,发送,服务器,邮箱,new,message,邮件
From: https://www.cnblogs.com/hytip/p/18183005

相关文章

  • 编程:java 发送email程序:通用版本:借鉴“蚂蚁小哥 <[email protected]>”的文章
     1packagecom.alibaba.otter.canal.adapter.launcher.loader;23importjava.text.SimpleDateFormat;4importjava.util.*;5importjavax.mail.*;6importjavax.mail.internet.*;78publicclassJavaxJavaMailClient{910private......
  • phpcms发送邮件
     pc_base::load_sys_func('mail');sendmail($email,'您好,点击链接注册账号','注册账号请点击链接:'."<ahref=".$addr.">".$addr."</a>");会得到一个授权码(很重要)  下面代码,就是一个普通的类/***发送邮件*@p......
  • 多语言 JDBC SQL 发送
    多语言JDBCSQL发送记录各个语言使用JDBC发送SQL的代码片段。Pythonimportjaydebeapi#pipinstalljaydebeapi#JDBC驱动类名driver='com.mysql.jdbc.Driver'#数据库连接URLurl='jdbc:mysql://hostname:port/databasename?characterEncoding=UTF-8&serverT......
  • Java发送HTTP GET/POST请求
    一、Java11HttpClient在Java11的java.net.http.*包中,有一个HttpClient类可以完成HTTP请求。Java11HttpClientExample.javapackagecom.lyl.http;importjava.net.URI;importjava.net.URLEncoder;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;im......
  • 21.Prometheus告警之Alertmanager告警(一)-邮件钉钉微信
    一、Prometheus告警简介   告警能⼒在Prometheus的架构中被划分成两个独⽴的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进⾏计算,如果满⾜告警触发条件就会向Alertmanager发送告警信息 Alertmanager作为⼀个独⽴的组件,负责接......
  • 开源电子邮件营销平台 listmonk 使用教程
    做产品肯定要做电子邮件营销,特别是面向海外的产品,电子邮件营销已成为企业与客户沟通、建立品牌忠诚度和推动销售的重要工具,可以直接接触到目标受众,提供个性化内容,并以相对较低的成本获得可观的投资回报。你看,MEAP又来提醒我买电子书了!做电子邮件营销首先需要考虑的是选哪个电子......
  • SMTP发送邮箱(默认用QQ 邮箱发送)
    1.源码`//////SMTP发送邮箱(默认用QQ邮箱发送)//////收件人邮箱///邮件主题///邮件正文///host----->QQ的为smtp.qq.com///port----->QQ的为587///是否添加附件///添加附件路径///是否抄送///抄送地址即抄送多个邮箱*/publicvoidSen......
  • A2P,即Application-to-Person,是一种将信息或服务通过应用程序(如短信)发送给用户的过程
    A2P,即Application-to-Person,是一种将信息或服务通过应用程序(如短信)发送给用户的过程。它广泛应用于各种场景,特别是在市场营销和客户服务领域,因其能够直接接触到用户并提供丰富的交互方式而备受青睐。在A2P的应用中,短信服务扮演着至关重要的角色。例如,在业务触发向个人发送短信的......
  • 1.验整码的发送与检验
    通过restTemplate.exchage()来发送验证码,需要4个参数,url,请求方式,请求内容,需要相应类型)响应的结果为map结合,我们需要取出key值,用俩次map取值可以取出key检验验证需要输入验证码和keyrestTeMPLATE.exhcange(url,....);//发送请求获得验证码请求内容为空判断是否一样mapstrac......
  • 还在为邮件大附件发送困扰?企业邮件大文件解决方案来了!
    邮箱是企业最基础也是最常用的信息传递和业务往来方式,一般而言,对于文字及图片的业务沟通,邮箱完全可以胜任,但当涉及附件,特别是超大的附件,如影视频资料、大的工程文件、应用程序等,此时,邮件的大文件就会是很大的困扰。通常来说,企业解决邮件大文件的方式一般如下:分批发送:如果文件不......