13

我正在製作一個應用程序,允許用戶拍照並通過電子郵件自動發送到他選擇的電子郵件。到目前爲止,我能夠拍照並存儲在SD卡中。現在我只需要從文件夾(/ sdcard/Pictures/PhotoSender /)獲取圖片並自動發送到用戶請求的電子郵件的功能。我怎樣才能做到這一點?Android:在後臺自動發送帶有附件的電子郵件

我在該文件夾中有圖片。我只需要一些功能來生成電子郵件,將圖片(.jpg)作爲附件發送(所有這些都在後臺)。當電子郵件完全發送時,敬酒應該彈出「上傳完成」。同時用戶應該可以自由拍攝更多照片,因此上傳請求應該放在隊列中。用戶不應該使用他的電子郵件帳戶登錄才能發送。如果需要,我可以爲我的應用程序創建一個電子郵件帳戶作爲「發件人」。請幫幫我!

+0

請說明你做了什麼。 – BBdev 2013-03-11 05:23:00

回答

11

下面是支持發送帶有附件的電子郵件中的Android

這裏是一個效用函數與附件發送郵件一個完整的類,其中你的情況的附件是簡單的圖片(或多個)文件的完整路徑

public static boolean sendEmail(String to, String from, String subject,           
           String message,String[] attachements) throws Exception {  
    Mail mail = new Mail(); 
    if (subject != null && subject.length() > 0) { 
     mail.setSubject(subject); 
    } else { 
     mail.setSubject("Subject"); 
    } 

    if (message != null && message.length() > 0) { 
     mail.setBody(message); 
    } else { 
     mail.setBody("Message"); 
    } 

    mail.setTo(new String[] {to}); 

    if (attachements != null) { 
     for (String attachement : attachements) {  
      mail.addAttachment(attachement); 
     } 
    } 
    return mail.send(); 
} 

這裏是在上述功能中使用的完整Mail

import java.io.File; 
import java.util.Date; 
import java.util.Properties; 

import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

public class Mail extends javax.mail.Authenticator { 
private String user; 
private String password; 

private String[] to; 
private String from; 

private String port; 
private String sport; 

private String host; 

private String subject; 
private String body; 

private boolean _auth; 

private boolean _debuggable; 

private Multipart multipart; 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String[] getTo() { 
    return to; 
} 

public void setTo(String[] to) { 
    this.to = to; 
} 

public String getFrom() { 
    return from; 
} 

public void setFrom(String from) { 
    this.from = from; 
} 

public String getHost() { 
    return host; 
} 

public void setHost(String host) { 
    this.host = host; 
} 

public String getSubject() { 
    return subject; 
} 

public void setSubject(String subject) { 
    this.subject = subject; 
} 

public Multipart getMultipart() { 
    return multipart; 
} 

public void setMultipart(Multipart multipart) { 
    this.multipart = multipart; 
} 

public Mail() { 
    host = "smtp.googlemail.com"; // default smtp server 
    port = "465"; // default smtp port 
    sport = "465"; // default socketfactory port 

    user = ""; // username 
    password = ""; // password 
    from = ""; // email sent from 
    subject = ""; // email subject 
    body = ""; // email body 

    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 

    multipart = new MimeMultipart(); 

    // There is something wrong with MailCap, javamail can not find a 
    // handler for the multipart/mixed part, so this bit needs to be added. 
    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); 
} 

public Mail(String user, String pass) { 
    this(); 

    this.user = user; 
    password = pass; 
} 

public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if (!user.equals("") && !password.equals("") && to.length > 0 
      && !from.equals("") && !subject.equals("") && !body.equals("")) { 
     Session session = Session.getInstance(props, this); 

     MimeMessage msg = new MimeMessage(session); 

     msg.setFrom(new InternetAddress(from)); 

     InternetAddress[] addressTo = new InternetAddress[to.length]; 
     for (int i = 0; i < to.length; i++) { 
      addressTo[i] = new InternetAddress(to[i]); 
     } 
     msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

     msg.setSubject(subject); 
     msg.setSentDate(new Date()); 

     // setup message body 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText(body); 
     multipart.addBodyPart(messageBodyPart); 

     // Put parts in message 
     msg.setContent(multipart); 

     // send email 
     Transport.send(msg); 

     return true; 
    } else { 
     return false; 
    } 
} 

public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(new File(filename).getName()); 

    multipart.addBodyPart(messageBodyPart); 
} 

@Override 
public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(user, password); 
} 

private Properties _setProperties() { 
    Properties props = new Properties(); 

    props.put("mail.smtp.host", host); 

    if (_debuggable) { 
     props.put("mail.debug", "true"); 
    } 

    if (_auth) { 
     props.put("mail.smtp.auth", "true"); 
    } 

    props.put("mail.smtp.port", port); 
    props.put("mail.smtp.socketFactory.port", sport); 
    props.put("mail.smtp.socketFactory.class", 
      "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    return props; 
} 

// the getters and setters 
public String getBody() { 
    return body; 
} 

public void setBody(String _body) { 
    this.body = _body; 
} 
} 

  • 你需要你的classpath即的JavaMail API
  • activiation.jarmail.jar的代碼應該從AsynchTask運行或專用Thread
+0

如果它是@ user2155460 – 2013-10-18 12:23:49

+2

,則將其問題標記爲正確答案如何從此解決方案獲取在android中創建的帳戶的密碼? – 2013-10-28 01:25:38

+1

@iTech這是最好的答案。非常感謝 – NickUnuchek 2014-11-15 09:35:49

2

假設你emualtor的設備具有電子郵件應用程序,下面的代碼可以用來發送郵件。您可以使用安裝在您的emualtor或設備上的任何電子郵件應用程序,無論它是yahoomail還是谷歌。如果你想在後臺運行相同的服務。

Intent i = new Intent(Intent.ACTION_SEND); 
//i.setType("text/plain"); //use this line for testing in the emulator 
i.setType("message/rfc822") ; // use from live device 
i.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");//sending email via gmail 
i.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
i.putExtra(Intent.EXTRA_SUBJECT,"subject goes here"); 
i.putExtra(Intent.EXTRA_TEXT,"body goes here"); 
startActivity(i); 
+0

但這就是問題所在。如果我使用這種方式,用戶將不得不選擇使用哪個應用程序發送電子郵件。例如,如果他使用Hotmail,他將不得不使用他的帳戶登錄。用戶應該在我的應用中點擊「發送」按鈕,而不用擔心更多的事情。電子郵件會自動創建併發送,如果我們使用這個意圖不會發生這種情況=( – user2155460 2013-03-11 05:35:15

+0

檢查節食答案,但它需要用戶登錄。如果您想通過單擊按鈕發送電子郵件,您已提供登錄身份驗證以編程方式。Mehul Joisar提供的鏈接對此有好處。 – Raghunandan 2013-03-11 05:50:25

相關問題