13

私は、写真を撮って自分が選んだメールに電子メールで自動的に送信できるアプリを作っています。今まで私は写真を撮ってSDカードに保管することができました。今は、フォルダ(/ sdcard/Pictures/PhotoSender /)から画像を取得し、ユーザーが要求した電子メールに自動的に送信する関数のみが必要です。これどうやってするの?Android:バックグラウンドで添付ファイル付きの電子メールを自動的に送信する

私はそのフォルダに画像を持っています。私は、電子メールを生成し、画像(.jpg)を添付ファイルとして送信する機能(バックグラウンドですべて)を必要とするだけです。電子メールが完全に送信されると、「アップロード完了」というトーストがポップアップ表示されます。一方、ユーザーは自由に写真を撮る必要があるので、アップロードリクエストはキューに入れてください。ユーザーは送信する電子メールアカウントでログインしないでください。必要に応じて、自分のアプリが「送信者」になるように電子メールアカウントを作成することができます。私を助けてください!以下は

+0

あなたが行ったことを示してください。 – BBdev

答えて

11

アンドロイド

に添付ファイル付きのメールを送信し、ここにあなたのケースの添付ファイルは、単に絵(s)はここで添付ファイル付きのメールを送信するためのユーティリティ関数ですサポートする完全なクラスである完全なパスをファイル

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

  • あなたはコードがemualtorのあなたのデバイスを想定しAsynchTaskまたは専用Thread
+0

@ user2155460 –

+2

この解決策からアンドロイドで作成されたアカウントのパスワードを取得するには正しい答えとして彼の質問に印を付けますか? –

+1

@iTech最高の答えです。ありがとうございます – NickUnuchek

2

から実行する必要があります

  • クラスパスすなわちのJavaMail APIにactiviation.jarmail.jarが必要になりますが、電子メールアプリケーションを持っています以下のコードを使用してメールを送信することができます。エミュレータまたはデバイスにインストールされている電子メールアプリケーションは、yahoomailまたはgoogleのいずれでも使用できます。あなたがバックグラウンドで同じことを実行したい場合は、サービスを使用してください。

    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

    +0

    )を使用すると発生しませんが、ダイエットされた回答を確認してください。ただし、ログインする必要があります。 Mehul Joisarによって提供されるリンクは、その目的に適しています。 – Raghunandan

    関連する問題