From e1a84f22e237e09dfacb16dd96acc2eee652cee6 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Mon, 20 Oct 2025 20:27:54 +0300 Subject: [PATCH 1/8] accept all --- .../src/main/java/com/zerobounce/ZBValidateResponse.java | 2 +- .../src/main/java/com/zerobounce/ZBValidateSubStatus.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateResponse.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateResponse.java index 5b25d0d..a17be8d 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateResponse.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateResponse.java @@ -19,7 +19,7 @@ public class ZBValidateResponse { @Nullable private ZBValidateStatus status = null; - // [antispam_system, greylisted, mail_server_temporary_error, forcible_disconnect, mail_server_did_not_respond, timeout_exceeded, failed_smtp_connection, mailbox_quota_exceeded, exception_occurred, possible_traps, role_based, global_suppression, mailbox_not_found, no_dns_entries, failed_syntax_check, possible_typo, unroutable_ip_address, leading_period_removed, does_not_accept_mail, alias_address, role_based_catch_all, disposable, toxic] + // [antispam_system, greylisted, mail_server_temporary_error, forcible_disconnect, mail_server_did_not_respond, timeout_exceeded, failed_smtp_connection, mailbox_quota_exceeded, exception_occurred, possible_traps, role_based, global_suppression, mailbox_not_found, no_dns_entries, failed_syntax_check, possible_typo, unroutable_ip_address, leading_period_removed, does_not_accept_mail, alias_address, role_based_catch_all, disposable, toxic, accept_all] @SerializedName("sub_status") @Nullable private ZBValidateSubStatus subStatus = null; diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateSubStatus.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateSubStatus.java index 59da7f1..ddd72a1 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateSubStatus.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBValidateSubStatus.java @@ -76,5 +76,8 @@ public enum ZBValidateSubStatus { DISPOSABLE, @SerializedName("toxic") - TOXIC + TOXIC, + + @SerializedName("accept_all") + ACCEPT_ALL } \ No newline at end of file From b63f60058e271f6cbe06b38f91bb7ae409ecacc8 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Tue, 21 Oct 2025 21:30:05 +0300 Subject: [PATCH 2/8] Added new methods. --- .../com/zerobounce/ZBFindDomainResponse.java | 130 ++++++++++++++++++ .../com/zerobounce/ZBFindEmailResponse.java | 103 ++++++++++++++ .../java/com/zerobounce/ZeroBounceSDK.java | 112 +++++++++++++++ 3 files changed, 345 insertions(+) create mode 100644 zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java create mode 100644 zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java new file mode 100644 index 0000000..46eec45 --- /dev/null +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java @@ -0,0 +1,130 @@ +package src.main.java.com.zerobounce; + +import com.google.gson.annotations.SerializedName; +import com.zerobounce.DomainFormat; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class ZBFindDomainResponse { + + @NotNull + private String email = ""; + + @NotNull + private String domain = ""; + + @NotNull + @SerializedName("company_name") + private String companyName = ""; + + @NotNull + private String format = ""; + + @NotNull + private String confidence = ""; + + @NotNull + @SerializedName("did_you_mean") + private String didYouMean = ""; + + @NotNull + @SerializedName("failure_reason") + private String failureReason = ""; + + @NotNull + @SerializedName("other_domain_formats") + private List otherDomainFormats = Collections.emptyList(); + + public @NotNull String getEmail() { + return email; + } + + public void setEmail(@NotNull String email) { + this.email = email; + } + + public @NotNull String getDomain() { + return domain; + } + + public void setDomain(@NotNull String domain) { + this.domain = domain; + } + + public @NotNull String getCompanyName() { + return companyName; + } + + public void setCompanyName(@NotNull String companyName) { + this.companyName = companyName; + } + + public @NotNull String getFormat() { + return format; + } + + public void setFormat(@NotNull String format) { + this.format = format; + } + + public @NotNull String getConfidence() { + return confidence; + } + + public void setConfidence(@NotNull String confidence) { + this.confidence = confidence; + } + + public @NotNull String getDidYouMean() { + return didYouMean; + } + + public void setDidYouMean(@NotNull String didYouMean) { + this.didYouMean = didYouMean; + } + + public @NotNull String getFailureReason() { + return failureReason; + } + + public void setFailureReason(@NotNull String failureReason) { + this.failureReason = failureReason; + } + + public @NotNull List getOtherDomainFormats() { + return otherDomainFormats; + } + + public void setOtherDomainFormats(@NotNull List otherDomainFormats) { + this.otherDomainFormats = otherDomainFormats; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + ZBFindDomainResponse that = (ZBFindDomainResponse) o; + return Objects.equals(email, that.email) && Objects.equals(domain, that.domain) && Objects.equals(companyName, that.companyName) && Objects.equals(format, that.format) && Objects.equals(confidence, that.confidence) && Objects.equals(didYouMean, that.didYouMean) && Objects.equals(failureReason, that.failureReason) && Objects.equals(otherDomainFormats, that.otherDomainFormats); + } + + @Override + public int hashCode() { + return Objects.hash(email, domain, companyName, format, confidence, didYouMean, failureReason, otherDomainFormats); + } + + @Override + public String toString() { + return "ZBFindDomainResponse{" + + "email='" + email + '\'' + + ", domain='" + domain + '\'' + + ", companyName='" + companyName + '\'' + + ", format='" + format + '\'' + + ", confidence='" + confidence + '\'' + + ", didYouMean='" + didYouMean + '\'' + + ", failureReason='" + failureReason + '\'' + + ", otherDomainFormats=" + otherDomainFormats + + '}'; + } +} diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java new file mode 100644 index 0000000..36fa55e --- /dev/null +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java @@ -0,0 +1,103 @@ +package src.main.java.com.zerobounce; + +import com.google.gson.annotations.SerializedName; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class ZBFindEmailResponse { + + @NotNull + private String email = ""; + + @NotNull + @SerializedName("email_confidence") + private String emailConfidence = ""; + + @NotNull + private String domain = ""; + + @NotNull + @SerializedName("company_name") + private String companyName = ""; + + @NotNull + @SerializedName("did_you_mean") + private String didYouMean = ""; + + @NotNull + @SerializedName("failure_reason") + private String failureReason = ""; + + public @NotNull String getEmail() { + return email; + } + + public void setEmail(@NotNull String email) { + this.email = email; + } + + public @NotNull String getEmailConfidence() { + return emailConfidence; + } + + public void setEmailConfidence(@NotNull String emailConfidence) { + this.emailConfidence = emailConfidence; + } + + public @NotNull String getDomain() { + return domain; + } + + public void setDomain(@NotNull String domain) { + this.domain = domain; + } + + public @NotNull String getCompanyName() { + return companyName; + } + + public void setCompanyName(@NotNull String companyName) { + this.companyName = companyName; + } + + public @NotNull String getDidYouMean() { + return didYouMean; + } + + public void setDidYouMean(@NotNull String didYouMean) { + this.didYouMean = didYouMean; + } + + public @NotNull String getFailureReason() { + return failureReason; + } + + public void setFailureReason(@NotNull String failureReason) { + this.failureReason = failureReason; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + ZBFindEmailResponse that = (ZBFindEmailResponse) o; + return Objects.equals(email, that.email) && Objects.equals(emailConfidence, that.emailConfidence) && Objects.equals(domain, that.domain) && Objects.equals(companyName, that.companyName) && Objects.equals(didYouMean, that.didYouMean) && Objects.equals(failureReason, that.failureReason); + } + + @Override + public int hashCode() { + return Objects.hash(email, emailConfidence, domain, companyName, didYouMean, failureReason); + } + + @Override + public String toString() { + return "ZBFindEmailResponse{" + + "email='" + email + '\'' + + ", emailConfidence='" + emailConfidence + '\'' + + ", domain='" + domain + '\'' + + ", companyName='" + companyName + '\'' + + ", didYouMean='" + didYouMean + '\'' + + ", failureReason='" + failureReason + '\'' + + '}'; + } +} diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java index 4793b29..7629639 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java @@ -18,6 +18,8 @@ import org.apache.http.util.EntityUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import src.main.java.com.zerobounce.ZBFindDomainResponse; +import src.main.java.com.zerobounce.ZBFindEmailResponse; import java.io.*; import java.lang.reflect.Type; @@ -160,6 +162,12 @@ public void validateBatch( * @param successCallback the success callback * @param errorCallback the error callback */ + /** + * @deprecated The 'guessFormat' method has been split into two specific functions. + * If you are finding a person's email, use {@link #findEmail(String, String, String, String, String, com.zerobounce.ZeroBounceSDK.OnSuccessCallback, com.zerobounce.ZeroBounceSDK.OnErrorCallback)}. + * If you are only determining the domain's email pattern, use {@link #findDomain(String, String, com.zerobounce.ZeroBounceSDK.OnSuccessCallback, com.zerobounce.ZeroBounceSDK.OnErrorCallback)}. + */ + @Deprecated public void guessFormat( @NotNull String domain, @Nullable String firstName, @@ -195,6 +203,110 @@ public void guessFormat( ); } + /** + * Finds the email based on a given [firstName], [domain] or [companyName]. + *

+ * **Note**: At least one of [domain] or [companyName] must be provided. + * + * @param firstName the first name of the person whose email format is being searched + * @param domain the email domain for which to find the email format + * @param companyName the company name for which to find the email format + * @param middleName the middle name of the person whose email format is being searched; + * optional + * @param lastName the last name of the person whose email format is being searched; optional + * @param successCallback the response callback + * @param errorCallback the error callback + */ + public void findEmail( + @NotNull String firstName, + @Nullable String domain, + @Nullable String companyName, + @Nullable String middleName, + @Nullable String lastName, + @NotNull OnSuccessCallback successCallback, + @NotNull OnErrorCallback errorCallback + ) { + if (invalidApiKey(errorCallback)) return; + + // Validate that at least one of companyName or domain is provided. + if ((companyName == null || companyName.isEmpty()) && (domain == null || domain.isEmpty())) { + errorCallback.onError(ErrorResponse.parseError("Either companyName or domain must be provided.")); + return; + } + + sendRequest( + apiBaseUrl + "/guessformat", + new HashMap() { + { + put("api_key", apiKey); + put("first_name", firstName); + if (domain != null) { + put("domain", domain); + } + if (companyName != null) { + put("company_name", companyName); + } + if (middleName != null) { + put("middle_name", middleName); + } + if (lastName != null) { + put("last_name", lastName); + } + } + }, + null, + new TypeToken() { + }, + successCallback, + errorCallback + ); + } + + /** + * Find other domain formats based on a given [domain] or [companyName]. + *

+ * **Note**: At least one of [domain] or [companyName] must be provided. + * + * @param domain the email domain for which to find the email format + * @param companyName the company name for which to find the email format + * @param successCallback the response callback + * @param errorCallback the error callback + */ + public void findDomain( + @Nullable String domain, + @Nullable String companyName, + @NotNull OnSuccessCallback successCallback, + @NotNull OnErrorCallback errorCallback + ) { + if (invalidApiKey(errorCallback)) return; + + // Validate that at least one of companyName or domain is provided. + if ((companyName == null || companyName.isEmpty()) && (domain == null || domain.isEmpty())) { + errorCallback.onError(ErrorResponse.parseError("Either companyName or domain must be provided.")); + return; + } + + sendRequest( + apiBaseUrl + "/guessformat", + new HashMap() { + { + put("api_key", apiKey); + if (domain != null) { + put("domain", domain); + } + if (companyName != null) { + put("company_name", companyName); + } + } + }, + null, + new TypeToken() { + }, + successCallback, + errorCallback + ); + } + /** * Returns the API usage between the given dates. * From ba41b69ee254ad6e9e9ee9cd9d76e98de3083534 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Tue, 21 Oct 2025 22:45:04 +0300 Subject: [PATCH 3/8] Added readme. --- README.md | 226 ++++++++++++++++++ .../main/java/com/zerobounce/ZBConstants.java | 10 + .../java/com/zerobounce/ZeroBounceSDK.java | 17 +- 3 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java diff --git a/README.md b/README.md index d2b5ade..22e3406 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,10 @@ ZeroBounceSDK.getInstance().initialize(""); ZeroBounceSDK.getInstance().initialize("", timeoutInMillis); ``` +```java +ZeroBounceSDK.getInstance().initialize("", timeoutInMillis,""); +``` + ## Examples @@ -155,6 +159,88 @@ Then you can use any of the SDK methods, for example: ); ``` +* ##### Find the email formats based on a given first name and domain + ```java + ZeroBounceSDK.getInstance().findEmail( + "" + "", + null, + null, + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindEmailResponse response) { + System.out.println("findEmail response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findEmail error=" + errorMessage); + } + }); + ); + ``` + +* ##### Find the email formats based on a given first name and company name + ```java + ZeroBounceSDK.getInstance().findEmail( + "" + null, + "", + null, + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindEmailResponse response) { + System.out.println("findEmail response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findEmail error=" + errorMessage); + } + }); + ); + ``` + +* ##### Find other domain formats based on a given domain + ```java + ZeroBounceSDK.getInstance().findDomain( + "", + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindDomainResponse response) { + System.out.println("findDomain response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findDomain error=" + errorMessage); + } + }); + ); + ``` + +* ##### Find other domain formats based on a given company name + ```java + ZeroBounceSDK.getInstance().findDomain( + null, + "COMPANY_NAME_TO_TEST", + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindDomainResponse response) { + System.out.println("findDomain response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findDomain error=" + errorMessage); + } + }); + ); + ``` + * ##### Check how many credits you have left on your account ```java ZeroBounceSDK.getInstance().getCredits( @@ -374,6 +460,146 @@ Then you can use any of the SDK methods, for example: }); ``` +## Breaking Changes: +**`guessFormat`** has been deprecated. To continue using your existing code, you must migrate to **`findEmail`** or **`findDomain`** . +The change is not a simple one-to-one replacement, as the functionality has been split: +- **If you were finding a person's email format**, use the new **`findEmail()`** method. +- **If you were only determining the domain's general email pattern**, use the new **`findDomain()`** method. +### Migration Example: +- #### Old (Deprecated) + ```java + ZeroBounceSDK.getInstance().guessFormat( + "", + null, + null, + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBEmailFinderResponse response) { + System.out.println("guessFormat response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("guessFormat error=" + errorMessage); + } + }); + ); + +- #### New Methods + - ##### Find the email formats based on a given first name and domain + ```java + ZeroBounceSDK.getInstance().findEmail( + "" + "", + null, + null, + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindEmailResponse response) { + System.out.println("findEmail response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findEmail error=" + errorMessage); + } + }); + ); + ``` + - ##### Find the email formats based on a given first name and company name + ```java + ZeroBounceSDK.getInstance().findEmail( + "" + null, + "", + null, + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindEmailResponse response) { + System.out.println("findEmail response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findEmail error=" + errorMessage); + } + }); + ); + + - ##### Find other domain formats based on a given domain + ```java + ZeroBounceSDK.getInstance().findDomain( + "", + null, + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindDomainResponse response) { + System.out.println("findDomain response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findDomain error=" + errorMessage); + } + }); + ); + ``` + - ##### Find other domain formats based on a given company name + ```java + ZeroBounceSDK.getInstance().findDomain( + null, + "COMPANY_NAME_TO_TEST", + new ZeroBounceSDK.OnSuccessCallback() { + @Override + public void onSuccess(ZBFindDomainResponse response) { + System.out.println("findDomain response=" + response.toString()); + } + }, new ZeroBounceSDK.OnErrorCallback() { + @Override + public void onError(String errorMessage) { + System.out.println("findDomain error=" + errorMessage); + } + }); + ); + +## New Features and Enhancements +### Custom API URL Support +The `ZeroBounceSDK.initialize()` method can now accepts an `apiBaseUrl` parameter. +This allows you to specify a custom base URL for the ZeroBounce API. +#### Migration / Usage +The existing way of initializing the SDK is still valid. +- Default Usage (No Change Required). If you don't provide a URL, the SDK will continue to use the standard ZeroBounce API endpoint: +```java +ZeroBounceSDK.getInstance().initialize(""); +``` +```java +ZeroBounceSDK.getInstance().initialize("", timeoutInMillis); +``` +- Initialize the SDK with your API key and URL: +```java +ZeroBounceSDK.getInstance().initialize("", timeoutInMillis,""); +``` +The SDK now exposes a set of predefined constants for different geographical API endpoints, +allowing for more precise network routing. +### Available API Endpoints +You can specify a custom API base URL during initialization by using the new optional `apiBaseUrl` +parameter in `initialize()`. For convenience, the following constants are available in the +**`ZBConstants`** class: + +| Constant | URL Value | Description | +|-------------------|------------------------------------|--------------------------------------------------------------------| +| **`API_DEFAULT_URL`** | `https://api.zerobounce.net/v2/` | The global default endpoint. | +| **`API_USA_URL`** | `https://api-us.zerobounce.net/v2/` | The US-specific endpoint for lower latency in the Americas. | +| **`API_EU_URL`** | `https://api-eu.zerobounce.net/v2/` | The EU-specific endpoint for compliance and lower latency in Europe. | + +### Usage Example: +To use the EU endpoint for initialization: +```java +ZeroBounceSDK.getInstance().initialize("", timeoutInMillis,ZBConstants.getInstance().API_EU_URL); +``` ## Documentation You can generate the documentation using your desired IDE or using's maven's javadoc command. diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java new file mode 100644 index 0000000..cbfd8d9 --- /dev/null +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java @@ -0,0 +1,10 @@ +package src.main.java.com.zerobounce; + +public class ZBConstants { + + public static final String API_DEFAULT_URL = "https://api.zerobounce.net/v2/"; + + public static final String API_USA_URL = "https://api-us.zerobounce.net/v2/"; + + public static final String API_EU_URL = "https://api-eu.zerobounce.net/v2/"; +} diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java index 7629639..6f973f0 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java @@ -50,7 +50,7 @@ public static ZeroBounceSDK getInstance() { return instance; } - final String apiBaseUrl = "https://api.zerobounce.net/v2"; + String apiBaseUrl = "https://api.zerobounce.net/v2"; private final String bulkApiBaseUrl = "https://bulkapi.zerobounce.net/v2"; private final String bulkApiScoringBaseUrl = "https://bulkapi.zerobounce.net/v2/scoring"; private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US); @@ -90,6 +90,21 @@ public void initialize(String apiKey, int timeoutInMillis) { this.timeoutInMillis = timeoutInMillis; } + /** + * Initializes the SDK. + * + * @param apiKey the API key + * @param timeoutInMillis the timeout in milliseconds to use for all requests (0 for no timeout) + * @param apiBaseUrl the API base URL + */ + public void initialize(String apiKey, int timeoutInMillis, @Nullable String apiBaseUrl) { + this.apiKey = apiKey; + this.timeoutInMillis = timeoutInMillis; + if (apiBaseUrl == null) { + this.apiBaseUrl = apiBaseUrl; + } + } + /** * Validates the given [email]. * From 155d53bd93e22ed0d3d0858f218b3c84d534afa7 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Wed, 5 Nov 2025 11:52:59 +0200 Subject: [PATCH 4/8] Added tests. --- .../main/java/com/zerobounce/ZBConstants.java | 2 +- .../com/zerobounce/ZBFindDomainResponse.java | 2 +- .../com/zerobounce/ZBFindEmailResponse.java | 2 +- .../java/com/zerobounce/ZeroBounceSDK.java | 8 +- .../com/zerobounce/ZeroBounceSDKTest.java | 206 +++++++++++++++++- 5 files changed, 210 insertions(+), 10 deletions(-) diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java index cbfd8d9..4950bc2 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBConstants.java @@ -1,4 +1,4 @@ -package src.main.java.com.zerobounce; +package com.zerobounce; public class ZBConstants { diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java index 46eec45..3d02900 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindDomainResponse.java @@ -1,4 +1,4 @@ -package src.main.java.com.zerobounce; +package com.zerobounce; import com.google.gson.annotations.SerializedName; import com.zerobounce.DomainFormat; diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java index 36fa55e..c875b9f 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java @@ -1,4 +1,4 @@ -package src.main.java.com.zerobounce; +package com.zerobounce; import com.google.gson.annotations.SerializedName; import org.jetbrains.annotations.NotNull; diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java index b926a7a..4ceec7e 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZeroBounceSDK.java @@ -18,8 +18,6 @@ import org.apache.http.util.EntityUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import src.main.java.com.zerobounce.ZBFindDomainResponse; -import src.main.java.com.zerobounce.ZBFindEmailResponse; import java.io.*; import java.lang.reflect.Type; @@ -114,13 +112,11 @@ public void initialize(String apiKey, int timeoutInMillis) { * Initializes the SDK. * * @param apiKey the API key - * @param timeoutInMillis the timeout in milliseconds to use for all requests (0 for no timeout) * @param apiBaseUrl the API base URL */ - public void initialize(String apiKey, int timeoutInMillis, @Nullable String apiBaseUrl) { + public void initialize(String apiKey, @Nullable String apiBaseUrl) { this.apiKey = apiKey; - this.timeoutInMillis = timeoutInMillis; - if (apiBaseUrl == null) { + if (apiBaseUrl != null) { this.apiBaseUrl = apiBaseUrl; } } diff --git a/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java b/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java index df6405f..e176ec1 100644 --- a/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java +++ b/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java @@ -54,7 +54,7 @@ public void setUp() { gsonBuilder.registerTypeAdapter(Date.class, new GsonDateDeserializer()); gson = gsonBuilder.create(); - ZeroBounceSDK.getInstance().initialize(API_KEY); + ZeroBounceSDK.getInstance().initialize(API_KEY, ZBConstants.API_DEFAULT_URL); } @Test @@ -335,6 +335,210 @@ public void guessFormat_ReturnsError() throws Exception { }); } + @Test + public void findEmail_ReturnsSuccess() throws Exception { + // Prepare mock response and add it to the server + String responseJson = "{\n" + + " \"email\": \"john.doe@example.com\",\n" + + " \"domain\": \"example.com\",\n" + + " \"company_name\": \"X company\",\n" + + " \"email_confidence\": \"HIGH\",\n" + + " \"did_you_mean\": \"\",\n" + + " \"failure_reason\": \"\",\n" + + " }"; + ZBFindEmailResponse expectedResponse = gson.fromJson(responseJson, ZBFindEmailResponse.class); + + String domain = "example.com"; + String firstName = "John doe"; + String urlPath = getEncodedUrl( + "https://api.zerobounce.net/v2/guessformat", + new HashMap() { + { + put("api_key", API_KEY); + put("domain", domain); + put("firstName", firstName); + } + } + ); + mockRequest(urlPath, 200, responseJson, ""); + + ZeroBounceSDK.getInstance().findEmail( + firstName, + domain, + null, + null, + null, + response -> { + assertEquals(expectedResponse, response); + }, errorResponse -> { + fail(errorResponse.toString()); + }); + } + + @Test + public void findEmail_ReturnsError() throws Exception { + // Prepare mock response and add it to the server + String responseJson = "{\"error\":[\"Invalid API Key or your account ran out of credits\"]}"; + ErrorResponse expectedResponse = ErrorResponse.parseError(responseJson); + + String domain = "example.com"; + String firstName = "John doe"; + String urlPath = getEncodedUrl( + "https://api.zerobounce.net/v2/guessformat", + new HashMap() { + { + put("api_key", API_KEY); + put("domain", domain); + put("firstName", firstName); + } + } + ); + mockRequest(urlPath, 400, "", responseJson); + + ZeroBounceSDK.getInstance().findEmail( + firstName, + domain, + null, + null, + null, + response -> { + fail(response.toString()); + }, errorResponse -> { + assertEquals(expectedResponse, errorResponse); + }); + } + + @Test + public void findEmail_NoCompanyNameNoDomain_ReturnsError() throws Exception { + // Prepare mock response and add it to the server + String responseJson = "{\"error\":[\"Either companyName or domain must be provided.\"]}"; + ErrorResponse expectedResponse = ErrorResponse.parseError(responseJson); + + String firstName = "John doe"; + String urlPath = getEncodedUrl( + "https://api.zerobounce.net/v2/guessformat", + new HashMap() { + { + put("api_key", API_KEY); + put("firstName", firstName); + } + } + ); + mockRequest(urlPath, 400, "", responseJson); + + ZeroBounceSDK.getInstance().findEmail( + firstName, + null, + null, + null, + null, + response -> { + fail(response.toString()); + }, errorResponse -> { + assertEquals(expectedResponse, errorResponse); + }); + } + + @Test + public void findDomain_ReturnsSuccess() throws Exception { + // Prepare mock response and add it to the server + String responseJson = "{\n" + + " \"email\": \"john.doe@example.com\",\n" + + " \"domain\": \"example.com\",\n" + + " \"company_name\": \"X company\",\n" + + " \"format\": \"first.last\",\n" + + " \"confidence\": \"HIGH\",\n" + + " \"did_you_mean\": \"\",\n" + + " \"failure_reason\": \"\",\n" + + " \"other_domain_formats\": [\n" + + " {\n" + + " \"format\": \"first_last\",\n" + + " \"confidence\": \"HIGH\"\n" + + " },\n" + + " {\n" + + " \"format\": \"first\",\n" + + " \"confidence\": \"MEDIUM\"\n" + + " }\n" + + " ]\n" + + " }"; + ZBFindDomainResponse expectedResponse = gson.fromJson(responseJson, ZBFindDomainResponse.class); + + String domain = "example.com"; + String urlPath = getEncodedUrl( + "https://api.zerobounce.net/v2/guessformat", + new HashMap() { + { + put("api_key", API_KEY); + put("domain", domain); + } + } + ); + mockRequest(urlPath, 200, responseJson, ""); + + ZeroBounceSDK.getInstance().findDomain( + domain, + null, + response -> { + assertEquals(expectedResponse, response); + }, errorResponse -> { + fail(errorResponse.toString()); + }); + } + + @Test + public void findDomain_ReturnsError() throws Exception { + // Prepare mock response and add it to the server + String responseJson = "{\"error\":[\"Invalid API Key or your account ran out of credits\"]}"; + ErrorResponse expectedResponse = ErrorResponse.parseError(responseJson); + + String domain = "example.com"; + String urlPath = getEncodedUrl( + "https://api.zerobounce.net/v2/guessformat", + new HashMap() { + { + put("api_key", API_KEY); + put("domain", domain); + } + } + ); + mockRequest(urlPath, 400, "", responseJson); + + ZeroBounceSDK.getInstance().findDomain( + domain, + null, + response -> { + fail(response.toString()); + }, errorResponse -> { + assertEquals(expectedResponse, errorResponse); + }); + } + + @Test + public void findDomain_NoCompanyNameNoDomain_ReturnsError() throws Exception { + // Prepare mock response and add it to the server + String responseJson = "{\"error\":[\"Either companyName or domain must be provided.\"]}"; + ErrorResponse expectedResponse = ErrorResponse.parseError(responseJson); + + String urlPath = getEncodedUrl( + "https://api.zerobounce.net/v2/guessformat", + new HashMap() { + { + put("api_key", API_KEY); + } + } + ); + mockRequest(urlPath, 400, "", responseJson); + + ZeroBounceSDK.getInstance().findDomain( + null, + null, + response -> { + fail(response.toString()); + }, errorResponse -> { + assertEquals(expectedResponse, errorResponse); + }); + } + @Test public void getCredits_ReturnsSuccess() throws Exception { // Prepare mock response and add it to the server From f4fb50d2f8d5669be7989d8b116b5bc4a19fd427 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Wed, 5 Nov 2025 15:56:32 +0200 Subject: [PATCH 5/8] Little change --- .../java/com/zerobounce/ZBFindEmailResponse.java | 12 ++++++------ .../test/java/com/zerobounce/ZeroBounceSDKTest.java | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java index c875b9f..bab5cf3 100644 --- a/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java +++ b/zero-bounce-sdk/src/main/java/com/zerobounce/ZBFindEmailResponse.java @@ -10,10 +10,6 @@ public class ZBFindEmailResponse { @NotNull private String email = ""; - @NotNull - @SerializedName("email_confidence") - private String emailConfidence = ""; - @NotNull private String domain = ""; @@ -21,6 +17,10 @@ public class ZBFindEmailResponse { @SerializedName("company_name") private String companyName = ""; + @NotNull + @SerializedName("email_confidence") + private String emailConfidence = ""; + @NotNull @SerializedName("did_you_mean") private String didYouMean = ""; @@ -86,16 +86,16 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(email, emailConfidence, domain, companyName, didYouMean, failureReason); + return Objects.hash(email, domain, companyName, emailConfidence, didYouMean, failureReason); } @Override public String toString() { return "ZBFindEmailResponse{" + "email='" + email + '\'' + - ", emailConfidence='" + emailConfidence + '\'' + ", domain='" + domain + '\'' + ", companyName='" + companyName + '\'' + + ", emailConfidence='" + emailConfidence + '\'' + ", didYouMean='" + didYouMean + '\'' + ", failureReason='" + failureReason + '\'' + '}'; diff --git a/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java b/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java index 5707c1b..afcf621 100644 --- a/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java +++ b/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java @@ -361,8 +361,9 @@ public void findEmail_ReturnsSuccess() throws Exception { "company_name": "X company", "email_confidence": "HIGH", "did_you_mean": "", - "failure_reason": "", + "failure_reason": "" }"""; + ZBFindEmailResponse expectedResponse = gson.fromJson(responseJson, ZBFindEmailResponse.class); String domain = "example.com"; From 8712bedb1d5582faa618ecebc3971b9859ebbf62 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Wed, 5 Nov 2025 19:23:25 +0200 Subject: [PATCH 6/8] Tests. --- .../com/zerobounce/ZeroBounceSDKTest.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java b/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java index afcf621..daeecac 100644 --- a/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java +++ b/zero-bounce-sdk/src/test/java/com/zerobounce/ZeroBounceSDKTest.java @@ -55,7 +55,7 @@ public void setUp() { gsonBuilder.registerTypeAdapter(Date.class, new GsonDateDeserializer()); gson = gsonBuilder.create(); - ZeroBounceSDK.getInstance().initialize(API_KEY, ZBConstants.API_DEFAULT_URL); + zeroBounceSDK.initialize(API_KEY); } @Test @@ -355,14 +355,14 @@ public void guessFormat_ReturnsError() throws Exception { public void findEmail_ReturnsSuccess() throws Exception { // Prepare mock response and add it to the server String responseJson = """ - { - "email": "john.doe@example.com", - "domain": "example.com", - "company_name": "X company", - "email_confidence": "HIGH", - "did_you_mean": "", - "failure_reason": "" - }"""; + { + "email": "john.doe@example.com", + "domain": "example.com", + "company_name": "X company", + "email_confidence": "HIGH", + "did_you_mean": "", + "failure_reason": "" + }"""; ZBFindEmailResponse expectedResponse = gson.fromJson(responseJson, ZBFindEmailResponse.class); @@ -468,25 +468,25 @@ public void findEmail_NoCompanyNameNoDomain_ReturnsError() throws Exception { public void findDomain_ReturnsSuccess() throws Exception { // Prepare mock response and add it to the server String responseJson = """ - { - "email": "john.doe@example.com", - "domain": "example.com", - "company_name": "X company", - "format": "first.last", - "confidence": "HIGH", - "did_you_mean": "", - "failure_reason": "", - "other_domain_formats": [ - { - "format": "first_last", - "confidence": "HIGH" - }, - { - "format": "first", - "confidence": "MEDIUM" - } - ] - }"""; + { + "email": "john.doe@example.com", + "domain": "example.com", + "company_name": "X company", + "format": "first.last", + "confidence": "HIGH", + "did_you_mean": "", + "failure_reason": "", + "other_domain_formats": [ + { + "format": "first_last", + "confidence": "HIGH" + }, + { + "format": "first", + "confidence": "MEDIUM" + } + ] + }"""; ZBFindDomainResponse expectedResponse = gson.fromJson(responseJson, ZBFindDomainResponse.class); String domain = "example.com"; From f955a827e7cd0decff425cd327cec42912d87938 Mon Sep 17 00:00:00 2001 From: Cristina Botu Date: Wed, 5 Nov 2025 20:27:27 +0200 Subject: [PATCH 7/8] Changes to the Controller --- .../1.3.0/zerobouncesdk-1.3.0.jar | Bin 0 -> 65600 bytes .../1.3.0/zerobouncesdk-1.3.0.pom | 9 +++++ .../zerobouncesdk/maven-metadata-local.xml | 3 +- .../Controller.java | 33 ++++++++++++++++++ .../zerobouncejavasdksetupmaster/sample.fxml | 4 +++ zero-bounce-sdk/pom.xml | 2 +- .../com/zerobounce/ZBFindDomainResponse.java | 3 ++ .../com/zerobounce/ZBFindEmailResponse.java | 3 ++ 8 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 local-libs/com/zerobounce/java/zerobouncesdk/1.3.0/zerobouncesdk-1.3.0.jar create mode 100644 local-libs/com/zerobounce/java/zerobouncesdk/1.3.0/zerobouncesdk-1.3.0.pom diff --git a/local-libs/com/zerobounce/java/zerobouncesdk/1.3.0/zerobouncesdk-1.3.0.jar b/local-libs/com/zerobounce/java/zerobouncesdk/1.3.0/zerobouncesdk-1.3.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..5b4dceb94d93f580c712af879f33b14af252545b GIT binary patch literal 65600 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�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 z + + 4.0.0 + com.zerobounce.java + zerobouncesdk + 1.3.0 + POM was created from install:install-file + diff --git a/local-libs/com/zerobounce/java/zerobouncesdk/maven-metadata-local.xml b/local-libs/com/zerobounce/java/zerobouncesdk/maven-metadata-local.xml index 7c59908..9ce9852 100644 --- a/local-libs/com/zerobounce/java/zerobouncesdk/maven-metadata-local.xml +++ b/local-libs/com/zerobounce/java/zerobouncesdk/maven-metadata-local.xml @@ -3,7 +3,7 @@ com.zerobounce.java zerobouncesdk - 1.2.1 + 1.3.0 1.1.1 1.1.3 @@ -12,6 +12,7 @@ 1.1.7 1.2.0 1.2.1 + 1.3.0 20250721134252 diff --git a/src/main/java/com/zerobounceexample/zerobouncejavasdksetupmaster/Controller.java b/src/main/java/com/zerobounceexample/zerobouncejavasdksetupmaster/Controller.java index 85c98bf..8efc78e 100644 --- a/src/main/java/com/zerobounceexample/zerobouncejavasdksetupmaster/Controller.java +++ b/src/main/java/com/zerobounceexample/zerobouncejavasdksetupmaster/Controller.java @@ -26,6 +26,8 @@ public class Controller { public Button validateBatchButton; public Button guessFormatButton; public Button pickFileButton; + public Button findEmailButton; + public Button findDomainButton; public void initialize() { @@ -51,6 +53,10 @@ public void initialize() { deleteFileButton.setOnAction(event -> deleteFile("")); activityDataButton.setOnAction(event -> getActivityData("")); + + findEmailButton.setOnAction(event -> findEmail("", "")); + + findDomainButton.setOnAction(event -> findDomain("")); } /** @@ -83,6 +89,33 @@ private void validateBatch() { ); } + /** + * Calls the *find email* method of the [ZeroBounceSDK]. + */ + private void findEmail(String firstName, String domain) { + ZeroBounceSDK.getInstance().findEmail( + firstName, + domain, + null, + null, + null, + response -> System.out.println("Controller::guessFormat response=" + response.toString()), + errorMessage -> System.out.println("Controller::guessFormat error=" + errorMessage) + ); + } + + /** + * Calls the *find email* method of the [ZeroBounceSDK]. + */ + private void findDomain(String domain) { + ZeroBounceSDK.getInstance().findDomain( + domain, + null, + response -> System.out.println("Controller::guessFormat response=" + response.toString()), + errorMessage -> System.out.println("Controller::guessFormat error=" + errorMessage) + ); + } + /** * Calls the *guess format* method of the [ZeroBounceSDK]. */ diff --git a/src/main/resources/com/zerobounceexample/zerobouncejavasdksetupmaster/sample.fxml b/src/main/resources/com/zerobounceexample/zerobouncejavasdksetupmaster/sample.fxml index 6438c91..4cecf81 100644 --- a/src/main/resources/com/zerobounceexample/zerobouncejavasdksetupmaster/sample.fxml +++ b/src/main/resources/com/zerobounceexample/zerobouncejavasdksetupmaster/sample.fxml @@ -30,6 +30,10 @@ GridPane.rowIndex="5"/>