发送邮件对用户透明

时间:2015-04-13 09:32:47

标签: android email

我有一项服务,其中一些数据定期发送给联系人。在开始此服务之前,用户必须在mainActivity中设置联系人的电话号码和电子邮件,然后选择SMS和eMail之间的通信模式。

服务启动后,用户可以关闭应用程序,该服务将在后台运行。

从服务发送短信并非麻烦,但发送电子邮件需要显示电子邮件客户端选择器的提示,并且此操作必须对用户透明。

这是我配置电子邮件意图的方式。

Intent mailIntent = new Intent(Intent.ACTION_SEND);
mailIntent.setData(Uri.parse("mailto:"));
mailIntent.setType("message/rfc822");
mailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {email});
mailIntent.putExtra(Intent.EXTRA_SUBJECT, R.string.email_subject);
mailIntent.putExtra(Intent.EXTRA_TEXT, location_link);

可以在启动服务之前选择电子邮件客户端,然后将其传递给意图吗?通过这种方式,选择器不会被展示出来。

1 个答案:

答案 0 :(得分:1)

这可以通过编写自己的Mail Sender类

来实现
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.jaradditionnal.jar&amp; mail.jar个文件