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)
Trả lời
Giải pháp tốt nhất là sử dụng tài khoản Gmail để gửi email.
Nói chung:
- tải mail.jar và activation.jar cho android https://code.google.com/p/javamail-android/
- Connect để GMail để có được mã thông báo OAuth
- 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.
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
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/
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. .. –
@ 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
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.
HOẠT ĐỘNG HOÀN THÀNH! Với IntentService –
- 1. Gửi email kích hoạt tới người dùng
- 2. Nhắc mật khẩu tên người dùng trong khi cài đặt dịch vụ windows trong C#
- 3. Thiết lập - tạo tài khoản người dùng có xác nhận mà không cần gửi email?
- 4. mantis đăng ký người dùng mới mà không cần email
- 5. Dịch vụ Web Exchange: Tìm email được gửi đến người nhận
- 6. Mã C# cho dịch vụ sms và email thông báo
- 7. Dịch vụ xác thực người dùng RESTful
- 8. Gửi email kích hoạt khi người dùng mới đăng ký
- 9. Chỉ định người dùng khi gửi email bằng lệnh thư
- 10. Jira gửi email từ địa chỉ người dùng
- 11. Có thể nhắc người dùng nhập liệu trong bất kỳ tác vụ grunt nào không?
- 12. Gửi email từ biểu mẫu html mà không cần php
- 13. Bắt đầu phiên người dùng mới từ dịch vụ
- 14. Không thể gửi email SMTP từ dịch vụ windows trên Win7
- 15. Dịch vụ Mailbox/Email Hosting với API
- 16. Nhận đối tượng thông tin đăng nhập của người dùng hiện tại trong Powershell mà không cần nhắc
- 17. Địa chỉ email người gửi động Devise
- 18. Email GitLab không gửi?
- 19. Tôi có nên sử dụng tiêu đề Trả lời khi gửi email dưới dạng dịch vụ cho người khác không?
- 20. Dịch vụ thông báo qua email
- 21. Mạo danh người dùng google với tài khoản dịch vụ
- 22. Gửi email trong asp.net với tên cụ thể thay vì email người gửi
- 23. VBScript để gửi email mà không cần chạy Outlook
- 24. Làm thế nào để cài đặt ứng dụng ClickOnce mà không cần nhắc người dùng?
- 25. Làm cách nào để truy xuất tên người dùng mà dịch vụ Windows đang chạy?
- 26. Thực tiễn tốt nhất: Gửi email thay mặt cho người dùng
- 27. VBA workbooks.Đóng ra mà không được nhắc nhở nếu người dùng muốn lưu?
- 28. android đọc người dùng nhập vào một dịch vụ
- 29. Xác thực người dùng trên dịch vụ Jersey REST
- 30. Email Parsing đám mây Dịch vụ
bạn muốn gửi email theo chương trình? –
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 –
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 –