我想使用用户已设置的任何默认邮件提供商在我的应用中发送电子邮件。必须可以发送电子邮件而无需任何用户交互。如果我可以避免显示任何UI,那将是最好的解决方案。不可接受的一件事是硬编码或请求用户输入他们的电子邮件凭证。用户必须已使用凭据设置其帐户,例如Gmail。我的所有应用程序都使用已设置的现有电子邮件提供商。
我在这里找到的大部分帖子都使用了Intent,但据我所知,这将显示电子邮件用户界面,并要求用户按发送按钮。
答案 0 :(得分:8)
经过多次挖掘后,我认为有一个解决方案。 Google现在已经添加了对使用OAuth 2.0进行Gmail身份验证的支持,这样就无需访问用户的用户名和密码。由于我的应用需要用户拥有Gmail帐户,因此这可能是解决方案。当然,这不适用于任何其他不支持OAuth的电子邮件提供商,但由于Google担心保护用户名/密码,这种方法似乎是正确的。需要研究如何在我的应用程序中使用OAuth,但理论上应该是可能的。用户授予对Google服务的权限后,该应用会收到一个令牌,该令牌用于该权限保留的有效期。尚未解决的问题是Gmail是否支持使用OAuth发送电子邮件:
Google Brings OAuth 2.0 Support To Gmail And Google Talk To Make Third-Party Apps More Secure
Google's sample code for Gmail support and OAuth2
Android app demonstrating how to send e-mail using OAuth
YouTube video showing how a mobile app uses 2 step verification in an app
答案 1 :(得分:0)
试试这段代码......
public class SendAttachment{
public static void main(String [] args){
//to address
String to="abc@abc.com";//change accordingly
//from address
final String user="efg@efg.com";//change accordingly
final String password="password";//change accordingly
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
//1) get the session object
Properties properties = System.getProperties();
properties.put("mail.smtp.port", "465");
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(properties,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user,password);
}
});
//2) compose message
try{
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
message.setSubject("Hii");
//3) create MimeBodyPart object and set your message content
BodyPart messageBodyPart1 = new MimeBodyPart();
messageBodyPart1.setText("How is This");
//4) create new MimeBodyPart object and set DataHandler object to this object
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
//Location of file to be attached
String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.zip";//change accordingly
DataSource source = new FileDataSource(filename);
messageBodyPart2.setDataHandler(new DataHandler(source));
messageBodyPart2.setFileName("Hello");
//5) create Multipart object and add MimeBodyPart objects to this object
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart1);
multipart.addBodyPart(messageBodyPart2);
//6) set the multiplart object to the message object
message.setContent(multipart );
//7) send message
Transport.send(message);
System.out.println("MESSAGE SENT....");
}catch (MessagingException ex) {ex.printStackTrace();}
}
}