如何在 Android 后台发送电子邮件? [复制]

Posted

技术标签:

【中文标题】如何在 Android 后台发送电子邮件? [复制]【英文标题】:How to send email in background in Android? [duplicate] 【发布时间】:2013-11-25 16:40:01 【问题描述】:

对于我的应用程序,我已检索到我的消息 inbox/sent。现在我想在我的电子邮件地址上发送检索到的数据。怎么可能?是否需要任何身份验证?我也尝试过下载认证文件(authentication.jar,mail.jar)但不能成功。

long currentTime = System.currentTimeMillis();
    long pastThreeHour = currentTime - (AlarmManager.INTERVAL_HOUR * 3);
    String[] selectionArgs =  "" + pastThreeHour, "" + currentTime ;

    Cursor cursor = contentResolver.query(uri, null, selection, selectionArgs, "date DESC");

    if (cursor != null && cursor.getCount() > 0) 
        while (cursor.moveToNext()) 

            String number = cursor.getString(cursor.getColumnIndex("address")); // check for null
            String date = cursor.getString(cursor.getColumnIndex("date")); // convert to date its long
            String message_text = cursor.getString(cursor.getColumnIndex("body"));
            String type = cursor.getString(cursor.getColumnIndex("type")); // check type and get names

            // send email from here
            sendSMSEmail(number, date, message_text, type);
        
    
    cursor.close();

【问题讨论】:

【参考方案1】:

是的,可以使用以下代码在后台发送电子邮件,发送电子邮件

public class GMailSender extends javax.mail.Authenticator 
   
    private String mailhost = "smtp.gmail.com";   
    private String user;   
    private String password;   
    private Session session;   
    private Multipart _multipart;

    static 
       
        Security.addProvider(new 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);
        _multipart = new MimeMultipart();
       

    protected PasswordAuthentication getPasswordAuthentication() 
       
        return new PasswordAuthentication(user, password);   
       

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception 
       
        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);   
        message.setContent(_multipart);
        if (recipients.indexOf(',') > 0)   
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
        else  
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
        Transport.send(message);   

       

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

        _multipart.addBodyPart(messageBodyPart);
    

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

public final class JSSEProvider extends Provider 

    private static final long serialVersionUID = 1L;

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

您将需要 activation.jar、additionnal.jar 和 mail.jar 文件

【讨论】:

你能指出我应该将数据放在我必须通过邮件发送的代码中吗? @BarunKumar ,哪些数据? ....我必须通过邮件发送的数据。 您是指文件还是电子邮件详细信息? 实际上我正在检索另一个类中的一些数据并想通过电子邮件发送该数据。我不明白如何在这个 GMailSender 类中传递我检索到的数据。这些数据是字符串格式跨度> 【参考方案2】:

有一个用于在后台发送电子邮件的库,它的工作效率很高。 你可以从这里获取图书馆Background Mail Library

现在在你的eclipse中导入这个库,然后去项目属性,把这个库添加到你的项目中。 完成所有这些过程后,只需将这些代码放入您的项目中,它就会在后台发送电子邮件。

BackgroundMail bm = new BackgroundMail(context);
bm.setGmailUserName("sendername@gmail.com");
bm.setGmailPassword("sender_email_password");
bm.setMailTo("receiver@gmail.com");
bm.setFormSubject("Subject");
bm.setFormBody("Body");
bm.send();

拥有此权限

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

更新 1:更新库名称

【讨论】:

它给出了“javax.mail.AuthenticationFailedException”。我还启用了允许访问不太安全的应用程序....任何解决方案? @Chetu 您是否输入了有效的电子邮件 ID 和密码以及收件人 ID,您的邮件凭据可能有问题 链接失效,请更新链接:github.com/nlubello/BackgroundMailLibrary @S.R 谢谢你的建议。我已经更新了 在尝试发送邮件之前,您可能需要为您的发件人邮件地址“允许安全性较低的应用程序”。欲了解更多信息:docs.mailshake.com/article/…

以上是关于如何在 Android 后台发送电子邮件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用中发送电子邮件? [复制]

如何在 Android 中发送电子邮件? [复制]

android发送邮件

android发送邮件

如何立即在 C# 中发送邮件或至少在后台执行它[关闭]

在Android中以编程方式发送电子邮件