Hi I am developing an android app which will send mail on click of a button. Code worked at first but due to some reason its not working now. Could anyone please help me wit
Put in your manifest file,
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
check if you have internet connection,
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
and finnaly use this code to send email
final String username = "username@gmail.com";
final String password = "password";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from-email@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("to-email@gmail.com"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler,"
+ "\n\n No spam to my email, please!");
MimeBodyPart messageBodyPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
messageBodyPart = new MimeBodyPart();
String file = "path of file to be attached";
String fileName = "attachmentName"
DataSource source = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
I don't think you have to bombard your android source code with SMTP logic.
Here is what you can do instead :
Create a web service in php using PHP MAILER
Use retrofit to call the webservice.
Email sent succesfully!
Php mailer is really easy to use and send your emails.Here are some examples:
Tutorial 1
Tutorial 2
repositories {
jcenter()
maven {
url "https://maven.java.net/content/groups/public/"
}
}
dependencies {
compile 'com.sun.mail:android-mail:1.5.5'
compile 'com.sun.mail:android-activation:1.5.5'
}
android {
packagingOptions {
pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file
}
}
Add this async task to send mail
public class sendemail extends AsyncTask<String, Integer, Integer> {
ProgressDialog progressDialog;
private StringBuilder all_email;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(GetuserActivity.this);
progressDialog.setMessage("Uploading, please wait...");
progressDialog.show();
if (selecteduser_arr != null) {
all_email = new StringBuilder();
for (int i = 0; i < selecteduser_arr.size(); i++) {
if (i == 0) {
all_email.append(selecteduser_arr.get(i));
} else {
String temp = "," + selecteduser_arr.get(i);
all_email.append(temp);
}
}
}
}
@Override
protected Integer doInBackground(String... strings) {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("enterhereyouremail", "enterherepassword");
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("enterhereyouremail"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("sendermail@gmail.com,sendermail2@gmail.com"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler," +
"\n\n No spam to my email, please!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
return 1;
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
progressDialog.dismiss();
}
}
Try to use port 465
private Session createSessionObject()
{
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.starttls.enable", "true");
properties.setProperty("mail.smtp.host", "smtp.gmail.com");
properties.setProperty("mail.smtp.port", "465");
return Session.getInstance(properties, new javax.mail.Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(username, password);
}
});
}
Since you say it worked previously, your app should already be having internet permission and other necessary permissions.
Here's the code in Kotlin.
Make sure to enable less secure app access in Gmail. To use secure access you will need to use OAUTH 2.
read more at: OAuth 2.0 Mechanism
val username = "username"
val password = "email@gmail.com"
try {
val props = Properties()
props["mail.smtp.auth"] = "true"
props["mail.smtp.starttls.enable"] = "true"
props["mail.smtp.host"] = "smtp.gmail.com"
props["mail.smtp.port"] = "587"
val session = Session.getInstance(props, object : Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication? {
return PasswordAuthentication(username, password)
}
})
val message = MimeMessage(session)
message.setFrom(username)
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("email@gmail.com"))
message.subject = "Automated Violation Detection Email";
message.setText(
"Your Text"
)
Thread {
Transport.send(message)
}.start()
} catch (e: Exception) {
println("Error: $e")
showToastLong("Oops! Something Went Wrong! Please Try Again")
}