>图片的展示形式:

html中图片元素表示:

其中src部分是比较好玩的,我们可以用图片服务器链接地址,例如:

我们也可以使用base64的图片字符串,例如:

>利用图片加载来跟踪用户打开邮件状态:

我们可以利用img元素,在邮件正文隐藏一张图片,src指向我们服务器的服务URL,例如:

当用户打开邮件正文时,隐藏图片会被加载,请求我们的服务URL时,我们便可以知道用户已读,当然邮件一定发送成功了。

>存在的问题:

上面的方法可以获取用户已读状态,但是在有的邮件客户端,图片无法隐藏,所以我们需要在服务URL请求结束后,真实返回一张图片,但是图片最好近乎不可见。

用java简单生成一个不可见的图片(一个近乎不可见的点),代码如下:

import java.awt.Color;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import javax.imageio.ImageIO;

import jodd.util.Base64;

public class TestImage {

public String getImageBase64() {

ByteArrayOutputStream baos = null;

StringBuffer sb = null;

try {

int width = 1;

int height = 1;

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

Graphics2D g2d = image.createGraphics();

g2d.setBackground(new Color(255, 255, 255));

g2d.setPaint(new Color(0, 0, 0));

g2d.clearRect(0, 0, width, height);

g2d.dispose();

baos = new ByteArrayOutputStream();

ImageIO.write(image, "png", baos);

sb = new StringBuffer("data:image/png;base64,");

sb.append(Base64.encodeToString(baos.toByteArray()));

} catch (Exception ex) {

ex.printStackTrace();

} finally {

if (baos != null) {

try {

baos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

// System.out.println(sb.toString());

return sb.toString();

}

public static void main(String[] args) {

new TestImage().getImageBase64();

}

}

>优化一下:

我们可以直接保存图片base64字符串,它本身就代表图片,无需每次生成,生成字符串如下:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR42mP4//8/AAX+Av4zEpUUAAAAAElFTkSuQmCC

我们在浏览器预览一下,效果如下:

这样我们利用image元素,成功跟踪到用户已读邮件的状态了。完

喜欢请关注微信公众号:码农小麦

java 邮件跟踪_如何跟踪邮件已读状态(Java)相关推荐

  1. mysql中单个表脏读_如何在Outlook中单击邮件后立即将其标记为已读

    mysql中单个表脏读 Do you ever feel annoyed that Outlook doesn't mark messages as read as soon as you click ...

  2. 如何在Outlook中单击邮件后立即将其标记为已读

    Do you ever feel annoyed that Outlook doesn't mark messages as read as soon as you click and view th ...

  3. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

  4. 具有用户已读状态功能的公告(3):一键已读所有公告

    文章目录 1 摘要 2 解决方案 方案一 方案二 方案三 3 结论 1 摘要 关于公告这一系列的博客: 具有用户已读状态功能的公告(1):数据库设计 具有用户已读状态功能的公告(2):用户查询公告列表 ...

  5. pop3 邮件列表_什么是邮件列表| 第1部分

    pop3 邮件列表 什么是邮件列表? (What Is A Mailing List?) The mailing-list is a system for the participation of m ...

  6. imap 已读回执_确保同事看到已读回执和延迟提醒电子邮件的“重要电子邮件”...

    imap 已读回执 A lot of people ask how to schedule an email for a certain date and for good reason.  As w ...

  7. java oom分析_作为测试你应该知道的JAVA OOM及定位分析

    上周现网一个内存溢出问题导致应用服务器每隔一小时死一次,遂整理下常见的OMM.发现方法和处理方式,加入Bug预防. 常见的OutOfMemoryError有三种:OutOfMemoryError:Pe ...

  8. java gradle构建_在Gradle中为JPMS构建Java 6-8库

    java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...

  9. java初学者书籍_面向初学者的5本最佳Java核心书籍

    java初学者书籍 Today I am sharing the best java books to learn java programming. Java is one of the most ...

最新文章

  1. Java面试人事篇(二)
  2. windows开启ssh当跳板机
  3. “跟风离职后,找不到工作了!”:好多同事离职,这家公司还值不值得待?...
  4. CentOS6.4+rabbitmq集群——源码安装
  5. SSIM(structural similarity index),结构相似性
  6. java解析xml转为Map
  7. iOS开发网络篇—网络编程基础
  8. 中国农业大学营养与健康研究院诚聘博士后
  9. [转]QT QDateTime类、QTimer类
  10. Linux more和less
  11. LightOJ1234 Harmonic Number
  12. Laravel 5.3 windows环境安装
  13. No package ‘gtksourceview-4‘ found
  14. python视频操作:下载、选取特定帧、批量导入ppt及硬字幕提取
  15. 动漫学日语《你的名字》(更新中)
  16. 灵魂拷问:为什么5G路由器比2.4G路由器快?
  17. 微信H5开发,怎样禁止手机横屏
  18. linux sftp连接报错:JSchException: Algorithm negotiation fail问题的解决方法
  19. JavaScript(js)基础
  20. AngelScript -- C++程序最好的脚本语言

热门文章

  1. 图像处理 --- 三、图像变换 3.2 图像的几何变换
  2. Linux学习之如何在物理机上安装Linux发行版
  3. 《画解算法》1.两数之和【python实现】
  4. ❤『面试知识集锦100篇』3.mysql篇丨mysql基础知识和面试真题,看完不收藏算我输!!
  5. Python PyInstaller 安装 和 使用教程( 打包生成 exe )
  6. java打开别人的代码报错_同样的代码,别人的可以运行我的报错,求解答
  7. ros自己写避障算法_slam导航避障算法,让无人机自主避障教学研究迈向更高处...
  8. python字符串筛选输出_如何在Python中过滤字符串列表
  9. 外设驱动库开发笔记1:AD56xx系列DAC驱动
  10. Python序列类型常用函数练习:enumerate() reversed() sorted() zip()