diff --git a/pgpainless-core/src/main/java/org/pgpainless/key/util/UserId.java b/pgpainless-core/src/main/java/org/pgpainless/key/util/UserId.java
index e79d9700..1a2ea265 100644
--- a/pgpainless-core/src/main/java/org/pgpainless/key/util/UserId.java
+++ b/pgpainless-core/src/main/java/org/pgpainless/key/util/UserId.java
@@ -82,6 +82,12 @@ public final class UserId implements CharSequence {
*
* In these cases, {@link #parse(String)} will detect email addresses, names and comments and expose those
* via the respective getters.
+ * This method does not support parsing mail addresses of the following formats:
+ *
*
* @see RFC5322 §3.4. Address Specification
* @param string user-id
diff --git a/pgpainless-core/src/test/java/org/pgpainless/key/UserIdTest.java b/pgpainless-core/src/test/java/org/pgpainless/key/UserIdTest.java
index aece0efb..93cb6922 100644
--- a/pgpainless-core/src/test/java/org/pgpainless/key/UserIdTest.java
+++ b/pgpainless-core/src/test/java/org/pgpainless/key/UserIdTest.java
@@ -441,4 +441,95 @@ public class UserIdTest {
assertEquals("संपर्क@डाटामेल.भारत", samparka.getEmail());
assertEquals("संपर्क", samparka.getName());
}
+
+ @Test
+ public void parseMailWithPlus() {
+ UserId id = UserId.parse("disposable.style.email.with+symbol@example.com");
+ assertEquals("disposable.style.email.with+symbol@example.com", id.getEmail());
+
+ id = UserId.parse("Disposable Mail ");
+ assertEquals("disposable.style.email.with+symbol@example.com", id.getEmail());
+ assertEquals("Disposable Mail", id.getName());
+ }
+
+ @Test
+ public void parseMailWithHyphen() {
+ UserId id = UserId.parse("other.email-with-hyphen@example.com");
+ assertEquals("other.email-with-hyphen@example.com", id.getEmail());
+
+ id = UserId.parse("Other Email ");
+ assertEquals("other.email-with-hyphen@example.com", id.getEmail());
+ assertEquals("Other Email", id.getName());
+ }
+
+ @Test
+ public void parseMailWithTagAndSorting() {
+ UserId id = UserId.parse("user.name+tag+sorting@example.com");
+ assertEquals("user.name+tag+sorting@example.com", id.getEmail());
+
+ id = UserId.parse("User Name ");
+ assertEquals("user.name+tag+sorting@example.com", id.getEmail());
+ assertEquals("User Name", id.getName());
+ }
+
+ @Test
+ public void parseMailWithSlash() {
+ UserId id = UserId.parse("test/test@test.com");
+ assertEquals("test/test@test.com", id.getEmail());
+
+ id = UserId.parse("Who uses Slashes ");
+ assertEquals("test/test@test.com", id.getEmail());
+ assertEquals("Who uses Slashes", id.getName());
+ }
+
+ @Test
+ public void parseDoubleDots() {
+ UserId id = UserId.parse("\"john..doe\"@example.org");
+ assertEquals("\"john..doe\"@example.org", id.getEmail());
+
+ id = UserId.parse("John Doe <\"john..doe\"@example.org>");
+ assertEquals("\"john..doe\"@example.org", id.getEmail());
+ assertEquals("John Doe", id.getName());
+ }
+
+ @Test
+ public void parseBangifiedHostRoute() {
+ UserId id = UserId.parse("mailhost!username@example.org");
+ assertEquals("mailhost!username@example.org", id.getEmail());
+
+ id = UserId.parse("Bangified Host Route ");
+ assertEquals("mailhost!username@example.org", id.getEmail());
+ assertEquals("Bangified Host Route", id.getName());
+ }
+
+ @Test
+ public void parsePercentRouted() {
+ UserId id = UserId.parse("user%example.com@example.org");
+ assertEquals("user%example.com@example.org", id.getEmail());
+
+ id = UserId.parse("User ");
+ assertEquals("user%example.com@example.org", id.getEmail());
+ assertEquals("User", id.getName());
+ }
+
+ @Test
+ public void parseLocalPartEndingWithNonAlphanumericCharacter() {
+ UserId id = UserId.parse("user-@example.org");
+ assertEquals("user-@example.org", id.getEmail());
+
+ id = UserId.parse("User ");
+ assertEquals("user-@example.org", id.getEmail());
+ assertEquals("User", id.getName());
+ }
+
+ @Test
+ public void parseDomainIsIpAddress() {
+ UserId id = UserId.parse("postmaster@[123.123.123.123]");
+ assertEquals("postmaster@[123.123.123.123]", id.getEmail());
+
+ id = UserId.parse("Alice (work email) ");
+ assertEquals("postmaster@[123.123.123.123]", id.getEmail());
+ assertEquals("Alice", id.getName());
+ assertEquals("work email", id.getComment());
+ }
}