android - 如何借助JavaMail API完成邮件的发送?

 zhengping4476 发布于 2022-11-06 16:01

我想在Android上实现一个可以用mail发送应用程序的功能。如果使用:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

实现上述命令,就会启动Android内置的应用程序。所以,我想要设置一个按钮,这样,点击按钮直接就可以发送邮件,而不需要再次启动程序,具体该怎么做呢?

原文:Sending Email in Android using JavaMail API without using the default/built-in app

1 个回答
  • 答:Vinayak.B
    借助已获得Gmail权限的JavaMail API,然后在Android中便可发送邮件,
    具体需要构建的project样例如下:
    MailSenderActivity.java

    YOUR PACKAGE;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MailSenderActivity extends Activity {
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            final Button send = (Button) this.findViewById(R.id.send);
            send.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View v) {
                    // TODO Auto-generated method stub
    
                    try {   
                        GMailSender sender = new GMailSender("username@gmail.com", "password");
                        sender.sendMail("This is Subject",   
                                "This is Body",   
                                "user@gmail.com",   
                                "user@yahoo.com");   
                    } catch (Exception e) {   
                        Log.e("SendMail", e.getMessage(), e);   
                    } 
    
                }
            });
    
        }
    }
    

    GmailSender.java

    YOUR PACKAGE;
    
    import javax.activation.DataHandler;   
    import javax.activation.DataSource;   
    import javax.mail.Message;   
    import javax.mail.PasswordAuthentication;   
    import javax.mail.Session;   
    import javax.mail.Transport;   
    import javax.mail.internet.InternetAddress;   
    import javax.mail.internet.MimeMessage;   
    import java.io.ByteArrayInputStream;   
    import java.io.IOException;   
    import java.io.InputStream;   
    import java.io.OutputStream;   
    import java.security.Security;   
    import java.util.Properties;   
    
    public class GMailSender extends javax.mail.Authenticator {   
        private String mailhost = "smtp.gmail.com";   
        private String user;   
        private String password;   
        private Session session;   
    
        static {   
            Security.addProvider(new com.provider.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);   
        }   
    
        protected PasswordAuthentication getPasswordAuthentication() {   
            return new PasswordAuthentication(user, password);   
        }   
    
        public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {   
            try{
            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);   
            if (recipients.indexOf(',') > 0)   
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
            else 
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
            Transport.send(message);   
            }catch(Exception e){
    
            }
        }   
    
        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");   
            }   
        }   
    }
    

    JSSE Provider

    /*
     *  Licensed to the Apache Software Foundation (ASF) under one or more
     *  contributor license agreements.  See the NOTICE file distributed with
     *  this work for additional information regarding copyright ownership.
     *  The ASF licenses this file to You under the Apache License, Version 2.0
     *  (the "License"); you may not use this file except in compliance with
     *  the License.  You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     *  Unless required by applicable law or agreed to in writing, software
     *  distributed under the License is distributed on an "AS IS" BASIS,
     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *  See the License for the specific language governing permissions and
     *  limitations under the License.
     */
    
    /**
     * @author Alexander Y. Kleymenov
     * @version $Revision$
     */
    
    
    import java.security.AccessController;
    import java.security.Provider;
    
    public final class JSSEProvider extends Provider {
    
        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;
                }
            });
        }
    }
    

    然后在Android project中添加下述3个jars,

    mail.jar
    activation.jar
    additionnal.jar

    按照上述方法搭建project,然后检查收件人是否无误,一切搞定!

    答:ManuV
    我的方法是,将下述代码添加到你的manifest中,

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

    答:ashok reddy
    多谢你的分享,这些代码都非常实用,此外,为了进一步完善邮件的发送功能,我想通过如下代码添加相关附件:

    private Multipart _multipart; 
    _multipart = new MimeMultipart(); 
    
    public void addAttachment(String filename,String subject) throws Exception { 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(filename); 
        messageBodyPart.setDataHandler(new DataHandler(source)); 
        messageBodyPart.setFileName(filename); 
        _multipart.addBodyPart(messageBodyPart);
    
        BodyPart messageBodyPart2 = new MimeBodyPart(); 
        messageBodyPart2.setText(subject); 
    
        _multipart.addBodyPart(messageBodyPart2); 
    } 
    
    message.setContent(_multipart);
    
    2022-11-12 01:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有