Created
May 3, 2023 08:48
-
-
Save kishandonga/232d32cb764643adb35784398fdcb737 to your computer and use it in GitHub Desktop.
To Send Email Using Intent
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.app.Activity; | |
import android.content.Context; | |
import android.content.Intent; | |
import android.net.Uri; | |
import android.util.Patterns; | |
import androidx.annotation.NonNull; | |
import androidx.annotation.Nullable; | |
import java.io.File; | |
import java.util.Collection; | |
import java.util.LinkedHashSet; | |
import java.util.Set; | |
public final class IntentEmail { | |
private final Context context; | |
private final Set<String> to = new LinkedHashSet<>(); | |
private final Set<String> cc = new LinkedHashSet<>(); | |
private final Set<String> bcc = new LinkedHashSet<>(); | |
private String subject; | |
private String body; | |
private File attachment; | |
private String intentChooser; | |
private IntentEmail(@NonNull Context context) { | |
this.context = checkNotNull(context); | |
} | |
public static IntentEmail from(@NonNull Context context) { | |
return new IntentEmail(context); | |
} | |
private static <T> T checkNotNull(T object) { | |
if (object == null) { | |
throw new IllegalArgumentException("Argument must not be null"); | |
} | |
return object; | |
} | |
static String encodeRecipient(String recipient) { | |
int index = recipient.lastIndexOf('@'); | |
String localPart = recipient.substring(0, index); | |
String host = recipient.substring(index + 1); | |
return Uri.encode(localPart) + "@" + Uri.encode(host); | |
} | |
static String fixLineBreaks(String text) { | |
return text.replaceAll("\r\n", "\n").replace('\r', '\n').replaceAll("\n", "\r\n"); | |
} | |
public IntentEmail setIntentChooser(@Nullable String intentChooser) { | |
this.intentChooser = intentChooser; | |
return this; | |
} | |
public IntentEmail attachment(@Nullable File attachment) { | |
this.attachment = attachment; | |
return this; | |
} | |
public IntentEmail to(@NonNull String to) { | |
checkEmail(to); | |
this.to.add(to); | |
return this; | |
} | |
public IntentEmail to(@NonNull Collection<String> to) { | |
checkNotNull(to); | |
for (String email : to) { | |
checkEmail(email); | |
} | |
this.to.addAll(to); | |
return this; | |
} | |
public IntentEmail cc(@NonNull String cc) { | |
checkEmail(cc); | |
this.cc.add(cc); | |
return this; | |
} | |
public IntentEmail cc(@NonNull Collection<String> cc) { | |
checkNotNull(cc); | |
for (String email : cc) { | |
checkEmail(email); | |
} | |
this.cc.addAll(cc); | |
return this; | |
} | |
public IntentEmail bcc(@NonNull String bcc) { | |
checkEmail(bcc); | |
this.bcc.add(bcc); | |
return this; | |
} | |
public IntentEmail bcc(@NonNull Collection<String> bcc) { | |
checkNotNull(bcc); | |
for (String email : bcc) { | |
checkEmail(email); | |
} | |
this.bcc.addAll(bcc); | |
return this; | |
} | |
public IntentEmail subject(@NonNull String subject) { | |
checkNotNull(subject); | |
checkNoLineBreaks(subject); | |
this.subject = subject; | |
return this; | |
} | |
public IntentEmail body(@NonNull String body) { | |
checkNotNull(body); | |
this.body = fixLineBreaks(body); | |
return this; | |
} | |
public void startActivity() { | |
Intent intent = build(); | |
if (!(context instanceof Activity)) { | |
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |
} | |
if(intentChooser != null){ | |
context.startActivity(Intent.createChooser(intent, "Send Email")); | |
}else { | |
context.startActivity(intent); | |
} | |
} | |
public Intent build() { | |
Uri mailtoUri = constructMailtoUri(); | |
Intent intent = new Intent(Intent.ACTION_SENDTO, mailtoUri); | |
if(attachment != null){ | |
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(attachment)); | |
} | |
return intent; | |
} | |
private Uri constructMailtoUri() { | |
StringBuilder mailto = new StringBuilder(1024); | |
mailto.append("mailto:"); | |
addRecipients(mailto, to); | |
boolean hasQueryParameters; | |
hasQueryParameters = addRecipientQueryParameters(mailto, "cc", cc, false); | |
hasQueryParameters = addRecipientQueryParameters(mailto, "bcc", bcc, hasQueryParameters); | |
hasQueryParameters = addQueryParameter(mailto, "subject", subject, hasQueryParameters); | |
addQueryParameter(mailto, "body", body, hasQueryParameters); | |
return Uri.parse(mailto.toString()); | |
} | |
private boolean addQueryParameter(StringBuilder mailto, String field, String value, boolean hasQueryParameters) { | |
if (value == null) { | |
return hasQueryParameters; | |
} | |
mailto.append(hasQueryParameters ? '&' : '?').append(field).append('=').append(Uri.encode(value)); | |
return true; | |
} | |
private boolean addRecipientQueryParameters(StringBuilder mailto, String field, Set<String> recipients, boolean hasQueryParameters) { | |
if (recipients.isEmpty()) { | |
return hasQueryParameters; | |
} | |
mailto.append(hasQueryParameters ? '&' : '?').append(field).append('='); | |
addRecipients(mailto, recipients); | |
return true; | |
} | |
private void addRecipients(StringBuilder mailto, Set<String> recipients) { | |
if (recipients.isEmpty()) { | |
return; | |
} | |
for (String recipient : recipients) { | |
mailto.append(encodeRecipient(recipient)); | |
mailto.append(','); | |
} | |
mailto.setLength(mailto.length() - 1); | |
} | |
private void checkEmail(String email) { | |
checkNotNull(email); | |
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) { | |
throw new IllegalArgumentException("Argument is not a valid email address (according to " + | |
"Patterns.EMAIL_ADDRESS)"); | |
} | |
} | |
private void checkNoLineBreaks(String text) { | |
boolean containsCarriageReturn = text.indexOf('\r') != -1; | |
boolean containsLineFeed = text.indexOf('\n') != -1; | |
if (containsCarriageReturn || containsLineFeed) { | |
throw new IllegalArgumentException("Argument must not contain line breaks"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage: