邮件的发送

news/2024/10/2 1:25:09
  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("xxx@qq.com","授权码");}});//开启session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象(发送邮件的对象)Transport ts = session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com", "发信人邮箱@qq.com", "授权码");//4.创建邮件//需要传递sessionMimeMessage 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/mixedMimeMultipart 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 {@Overrideprotected 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);}@Overrideprotected 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 = "xxx@qq.com"; // 发件人邮箱final private User user;public MailThread(User user) {this.user = user;}@Overridepublic 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() {@Overrideprotected 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>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

P3842 [TJOI2007] 线段

洛谷-题目链接 [TJOI2007] 线段提示 我们选择的路线是(1, 1) (1, 6)(2, 6) (2, 3)(3, 3) (3, 1)(4, 1) (4, 2)(5, 2) (5, 6)(6, 6) (6, 4) (6, 6)不难计算得到,路程的总长度是 24。代码代码 #include <bits/stdc++.h> using namespace std;const int N = 2e4+5;int n; /…

ssh、PAM模块

.ssh/known_hosts 存储ssh指纹 sshd 服务器端 /etc/ssh/sshd_config 服务器端的配置文件 man 5 sshd_config 服务器端的配置文件帮助 echo root:1111|chapasswd 修改密码 openssl rand -base 64 9 随机取9位密码(随机数经过base编码取9位) ssh常用参数: Port 22 #生产建…

敏捷冲刺day2--数字工匠队

这个作业属于哪个课程 软件工程这个作业的要求是什么 项目冲刺这个作业的目标 冲刺日志2站立式会议照片工作困难 有部分知识不知道,要额外学习 昨日完成工作 用户登录前面前端初版 今日计划工作 登录界面前后端处理 项目燃尽图每日总结 陈家谦:继续学习 陆靖:继续努力 代码签…

CloudXR:更高效便捷的XR应用交互方案

CloudXR是一种新颖而先进的技术,旨在将虚拟现实和增强现实体验从本地设备转移到云端,主要功能也包括了远程渲染、流媒体传输、低延迟、高带宽和高质量的音视频传输。云化XR可以将高保真度的虚拟现实或增强现实场景实时传输到终端设备上,用户只需通过互联网即可感受到身临其境…

01-Excel基础操作-学习笔记

01 选择性粘贴一般的复制粘贴,可以直接使用快捷键Ctrl+C 复制,Ctrl+V 粘贴。但是在工作场景中,这样简单的复制粘贴远远不能满足需要。因此,学习了这个选择性粘贴工具。选择性粘贴工具在哪里? 选中单元格区域——复制——鼠标右击——选择性粘贴应用场景一:要求保留原有格…

优化建图

写 \(2-SAT\) 时刷到的,发现好像一点不会,学习下。 1. 线段树优化建图 当一个点与一段区间连边时,暴力连是 \(O(n^2)\) 的。 因为线段树有一个肥肠优秀的性质,一个区间最多被分为 \(O(logn)\) 个节点。 so,我们可以把区间当成放到线段树上,这样是 \(O(nlogn)\) 的。 具体…

[ISITDTU 2019]EasyPHP RCE异或限制

解决一个一直以来的问题,RCE的异或绕过问题。先了解下奇技淫巧吧--> https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html 接下来说说今天的问题,在做异或问题是发现许多payload都是(xxxxx)^(%ff....),这都是怎么来的呢。 现在说说吧,就比如拿_号来说…

Linux nohup 命令

Linux nohup 命令 应用场景 使用 PyCharm 连接服务器跑模型虽然很方便,但是如果遇到网络不佳、PyCharm出BUG、急需转移阵地等情况就只能中断训练,前面的全白跑了。 因此可以尝试直接在服务器上使用命令跑模型,这个命令好说,笨一点的方法直接抄用 PyCharm 运行时输出的命令嘛…