2011-06-29 40 views
5

là nó có thể rằng tôi gửi thư điện tử trong nền sử dụng dịch vụ .. như phục vụ tôi sử dụng Ý định với ACTION_SENDTO với dữ liệu Uri mailto: RECIPIENT_EMAIL và nó được gửi trong nền mà không bất kỳ sự can thiệp của người dùng .. hoặc thông qua ứng dụng email mặc định mà không nhắc người dùng ...Gửi Email trong dịch vụ (mà không nhắc người dùng)

+0

bạn muốn gửi email theo chương trình? –

+0

có nhưng sử dụng email được định cấu hình của người dùng không phải bất kỳ email nào khác –

+1

kiểm tra các giải pháp này http://stackoverflow.com/questions/4345032/how-to-send-a-simple-email-programatically-exists-a-simple-way- to-do-it và http://stackoverflow.com/questions/5456688/how-to-send-email-from-an-android-application –

Trả lời

4

Giải pháp tốt nhất là sử dụng tài khoản Gmail để gửi email.

Nói chung:

  1. tải mail.jar và activation.jar cho android https://code.google.com/p/javamail-android/
  2. Connect để GMail để có được mã thông báo OAuth
  3. Gửi email

đây là các mã

import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.mail.Message; 
import javax.mail.Session; 
import javax.mail.URLName; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.mail.util.ByteArrayDataSource; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.accounts.AccountManagerCallback; 
import android.accounts.AccountManagerFuture; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.util.Log; 

import com.sun.mail.smtp.SMTPTransport; 
import com.sun.mail.util.BASE64EncoderStream; 

public class GMailSender { 
    private Session session; 
    private String token; 


    public String getToken() { 
     return token; 
    } 

    public GMailSender(Activity ctx) { 
     super(); 
     initToken(ctx); 
    } 

    public void initToken(Activity ctx) { 

     AccountManager am = AccountManager.get(ctx); 

     Account[] accounts = am.getAccountsByType("com.google"); 
     for (Account account : accounts) { 
      Log.d("getToken", "account="+account); 
     } 

     Account me = accounts[0]; //You need to get a google account on the device, it changes if you have more than one 


     am.getAuthToken(me, "oauth2:https://mail.google.com/", null, ctx, new AccountManagerCallback<Bundle>(){ 
      @Override 
      public void run(AccountManagerFuture<Bundle> result){ 
       try{ 
        Bundle bundle = result.getResult(); 
        token = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
        Log.d("initToken callback", "token="+token);  

       } catch (Exception e){ 
        Log.d("test", e.getMessage()); 
       } 
      } 
     }, null); 

     Log.d("getToken", "token="+token); 
    } 



    public SMTPTransport connectToSmtp(String host, int port, String userEmail, 
      String oauthToken, boolean debug) throws Exception { 

     Properties props = new Properties(); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.starttls.required", "true"); 
     props.put("mail.smtp.sasl.enable", "false"); 

     session = Session.getInstance(props); 
     session.setDebug(debug); 

     final URLName unusedUrlName = null; 
     SMTPTransport transport = new SMTPTransport(session, unusedUrlName); 
     // If the password is non-null, SMTP tries to do AUTH LOGIN. 
     final String emptyPassword = null; 

     /* enable if you use this code on an Activity (just for test) or use the AsyncTask 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     */ 

     transport.connect(host, port, userEmail, emptyPassword); 

     byte[] response = String.format("user=%s\1auth=Bearer %s\1\1", 
       userEmail, oauthToken).getBytes(); 
     response = BASE64EncoderStream.encode(response); 

     transport.issueCommand("AUTH XOAUTH2 " + new String(response), 235); 

     return transport; 
    } 

    public synchronized void sendMail(String subject, String body, String user, 
      String oauthToken, String recipients) { 
     try { 

      SMTPTransport smtpTransport = connectToSmtp("smtp.gmail.com", 587, 
        user, oauthToken, true); 

      MimeMessage message = new MimeMessage(session); 
      DataHandler handler = new DataHandler(new ByteArrayDataSource(
        body.getBytes(), "text/plain")); 
      message.setSender(new InternetAddress(user)); 
      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)); 
      smtpTransport.sendMessage(message, message.getAllRecipients()); 

     } catch (Exception e) { 
      Log.d("test", e.getMessage(), e); 
     } 
    } 

} 

mã này ban đầu được đăng ở đây Javamail api in android using XOauth.

Xin lưu ý để nhận mã thông báo OAuth, bạn cần một Hoạt động và bạn phải yêu cầu người dùng sử dụng tài khoản nào. Mã thông báo sẽ được truy xuất trong giai đoạn OnCreate và được lưu trong tùy chọn. Xem thêm How to get the Android device's primary e-mail address

Hoặc bạn có thể sử dụng mail.jar nhưng bạn phải yêu cầu người dùng cho username và password.

+1

Bạn cũng có thể nhận mã thông báo oauth từ một dịch vụ, sử dụng AccountManagerFuture công khai getAuthToken (tài khoản tài khoản, chuỗi authTokenType, tùy chọn gói, boolean notifyAuthFailure, AccountManagerCallback gọi lại, xử lý xử lý) http://developer.android.com/reference/android/accounts/AccountManager.html – alex

2

Sau đó, bạn cần thực hiện theo chương trình. Dưới đây là hướng dẫn cho rằng http://nilvec.com/sending-email-without-user-interaction-in-android/

+0

Tôi cũng không muốn sử dụng bất kỳ thư điện tử hoặc thư viện java nào khác .. Sử dụng email được cấu hình người dùng để gửi. .. –

+1

@ waheed-khan Tôi không nghĩ rằng bạn có thể sử dụng ứng dụng email tích hợp để gửi email mà không cần nhắc người dùng. Nhưng bạn có thể truy cập vào email người dùng và sau đó sử dụng nó với một email java lib để gửi thư. Xem [Accountmanger] (http://developer.android.com/reference/android/accounts/AccountManager.html) để xem bạn có thể truy cập thông tin tài khoản để tìm địa chỉ email bạn muốn không. Ví dụ được tìm thấy ở đây: http://stackoverflow.com/questions/2112965/how-to-get-the-android-devices-primary-e-mail-address – likebobby

2

Gửi e-mail trong Android bằng cách sử dụng API JavaMail sử dụng xác thực Gmail

Các bước để tạo một dự án mẫu:

MailSenderActivity.java

YOUR PACKAGE; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 

public class MailSenderActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final Button send = (Button) this.findViewById(R.id.send); 
     send.setOnClickListener(new View.OnClickListener() { 

      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("SendMail", e.getMessage(), e); 
       } 

      } 
     }); 

    } 
} 

GMailSender.java

YOUR PACKAGE; 

import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.mail.Message; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.Security; 
import java.util.Properties; 

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 com.provider.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"); 
     } 
    } 
} 

J Nhà cung cấp SSE

JSSEProvider.java

/* 
* Licensed to the Apache Software Foundation (ASF) under one or more 
* contributor license agreements. See the NOTICE file distributed with 
* this work for additional information regarding copyright ownership. 
* The ASF licenses this file to You under the Apache License, Version 2.0 
* (the "License"); you may not use this file except in compliance with 
* the License. You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

/** 
* @author Alexander Y. Kleymenov 
* @version $Revision$ 
*/ 


import java.security.AccessController; 
import java.security.Provider; 

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; 
      } 
     }); 
    } 
} 

ADD 3 lọ tìm thấy trong các liên kết sau đây để dự án Android của bạn

Click here - How to add External Jars

Và Đừng quên thêm dòng này trong biểu hiện của bạn:

<uses-permission android:name="android.permission.INTERNET" /> 

Khởi động dự án và kiểm tra tài khoản email người nhận của bạn cho mail. Chúc mừng !!

Hy vọng điều này sẽ giúp

P.S. Và đừng quên rằng bạn không thể thực hiện hoạt động mạng từ bất kỳ Hoạt động nào trong Android. Do đó, bạn nên sử dụng AsyncTask hoặc IntentService để tránh mạng trên ngoại lệ chủ đề chính.

Tệp Jar: https://code.google.com/p/javamail-android/

+0

HOẠT ĐỘNG HOÀN THÀNH! Với IntentService –

Các vấn đề liên quan