Reputation: 105
I want to send email automatically (without user interface). When i execute the application i have no error but when i check my inbox i find no email
MainActivity:
public void onClick(View v) {
// TODO Auto-generated method stub
try {
GMailSender sender = new GMailSender("[email protected]","password");
sender.sendMail("This is Subject", "This is Body", "[email protected]",
"[email protected]");
} catch (Exception e) {
Log.e("send", "error");
}
}
GMailSender.java:
public class GMailSender extends javax.mail.Authenticator {
private String mailhost = "smtp.gmail.com";
private String user;
private String password;
private Session session;
static {
Security.addProvider(new JSSEProvider());
}
public GMailSender(String user, String password) {
this.user = user;
this.password = password;
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
session = Session.getDefaultInstance(props, this);
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {
try{
MimeMessage message = new MimeMessage(session);
DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
message.setSender(new InternetAddress(sender));
message.setSubject(subject);
message.setDataHandler(handler);
if (recipients.indexOf(',') > 0)
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
else
message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
Transport.send(message);
}catch(Exception e){
}
}
public class ByteArrayDataSource implements DataSource {
private byte[] data;
private String type;
public ByteArrayDataSource(byte[] data, String type) {
super();
this.data = data;
this.type = type;
}
public ByteArrayDataSource(byte[] data) {
super();
this.data = data;
}
public void setType(String type) {
this.type = type;
}
public String getContentType() {
if (type == null)
return "application/octet-stream";
else
return type;
}
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(data);
}
public String getName() {
return "ByteArrayDataSource";
}
public OutputStream getOutputStream() throws IOException {
throw new IOException("Not Supported");
}
}
}
JSSEProvider.java:
public final class JSSEProvider extends Provider {
public JSSEProvider() {
super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
public Void run() {
put("SSLContext.TLS",
"org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
put("Alg.Alias.SSLContext.TLSv1", "TLS");
put("KeyManagerFactory.X509",
"org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
put("TrustManagerFactory.X509",
"org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
return null;
}
});
}
}
jar files : https://code.google.com/p/javamail-android/downloads/list
Manifest permission : <uses-permission android:name="android.permission.INTERNET" />
Upvotes: 3
Views: 5364
Reputation: 31
if u put a log message in the catch block of the sendEmail() you will get to know what the issue is, based on that you can make changes to the code
Also the problem I faced was that I calling the method to send the mail in main thread, you can create a separate thread to call the mail operation and it will work like a charm.
Upvotes: 0
Reputation: 105
hey your code is perfect because i have used this code so you need to add one thread policy for NETWORK ERROR EXCEPTION add below two lines in your onCreate() method
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
Upvotes: 1
Reputation: 105
The problem was that the wifi network of the campus where I am blocks the sending of emails. when I used the 3G it has worked.
Upvotes: 0
Reputation: 420
replace Transport.send(message); with below code should work
Transport transport = session.getTransport("smtp");
transport.connect("smtp.gmail.com", 587, _user, _pass);
transport.sendMessage(msg, msg.getAllRecipients());
Upvotes: 1