diff --git a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
index b663d008d55a00c4ff5ed43b17e860ebda281cfc..a609a07474944d787abb25d353fb5e7bc3d73b53 100644
--- a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
+++ b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
@@ -74,6 +74,9 @@ public class FessFunctions {
 
     private static final String PDF_DATE = "pdf_date";
 
+    private static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}",
+            Pattern.CASE_INSENSITIVE);
+
     private static LoadingCache<String, Long> resourceHashCache = CacheBuilder.newBuilder().maximumSize(1000)
             .expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<String, Long>() {
                 @Override
@@ -419,4 +422,11 @@ public class FessFunctions {
                 .map(user -> user.hasRoles(roles) || user.hasRoles(ComponentUtil.getFessConfig().getAuthenticationAdminRolesAsArray()))
                 .orElse(false);
     }
+
+    public static String maskEmail(final String value) {
+        if (value == null) {
+            return StringUtil.EMPTY;
+        }
+        return EMAIL_ADDRESS_PATTERN.matcher(value).replaceAll("******@****.***");
+    }
 }
diff --git a/src/main/webapp/WEB-INF/fe.tld b/src/main/webapp/WEB-INF/fe.tld
index 561a578481fee4ca9010f3a93df9258f0de3b9f0..e8c7bb6591684f1fcae833c1dfa46854ecbe108a 100644
--- a/src/main/webapp/WEB-INF/fe.tld
+++ b/src/main/webapp/WEB-INF/fe.tld
@@ -258,6 +258,14 @@
     <example>${fe:formatCode("L", "prettyprint", doc.mimetype, doc.content_description)}</example>
   </function>
 
+  <function>
+    <description>Mask e-mail address.</description>
+    <name>maskEmail</name>
+    <function-class>org.codelibs.fess.taglib.FessFunctions</function-class>
+    <function-signature>java.lang.String maskEmail(java.lang.String)</function-signature>
+    <example>${fe:maskEmail(doc.content_description)}</example>
+  </function>
+
   <function>
     <description>Get a message from properties files.</description>
     <name>message</name>
diff --git a/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java b/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java
index be5a45afd2c72067d26261c272d928a700959592..acc01d3f0153efe6cd93744b7466b41828ec01b9 100644
--- a/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java
+++ b/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java
@@ -115,6 +115,33 @@ public class FessFunctionsTest extends UnitFessTestCase {
         code = "aaa\nL10:\nL11:ccc";
         value = FessFunctions.formatCode("L", "prettyprint", "text/plain", code);
         assertEquals("<pre class=\"prettyprint linenums:10\">\nccc</pre>", value);
+    }
+
+    public void test_maskEmail() {
+        String value;
+
+        value = FessFunctions.maskEmail(null);
+        assertEquals("", value);
+
+        value = FessFunctions.maskEmail("");
+        assertEquals("", value);
+
+        value = FessFunctions.maskEmail("aaa bbb ccc");
+        assertEquals("aaa bbb ccc", value);
+
+        value = FessFunctions.maskEmail("aaa@bbb.ccc");
+        assertEquals("******@****.***", value);
+
+        value = FessFunctions.maskEmail("111.aaa@bbb.ccc");
+        assertEquals("******@****.***", value);
+
+        value = FessFunctions.maskEmail("111 aaa+@bbb.ccc 222");
+        assertEquals("111 ******@****.*** 222", value);
+
+        value = FessFunctions.maskEmail("あaaa@bbb.ccc1");
+        assertEquals("あ******@****.***1", value);
 
+        value = FessFunctions.maskEmail("<aaa@bbb.ccc>");
+        assertEquals("<******@****.***>", value);
     }
 }