Отправка электронной почты в Android с использованием JavaMail API без использования встроенного приложения по умолчанию

Старая запись, но в случае, если кто-то вроде меня наткнулся на нее:

Для ContextMenuStrip выше не работало для меня, но это привело к обнаружению того, что произошло.

void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    ContextMenuStrip menu = sender as ContextMenuStrip;
    Control sourceControl = menu.SourceControl;
    MessageBox.Show(sourceControl.Name);
}

Это дало мне имя ожидаемого контроля. Вы можете ввести подтверждение и т. Д. С операторами if, я просто отправляю сообщения, чтобы добраться до точки.

631
задан Taryn 22 March 2017 в 16:24
поделиться

7 ответов

[

]Отправка электронной почты на Android с использованием JavaMail API с помощью Gmail аутентификации.[

] [

]Шаги по созданию образца проекта:[

] [

][]MailSenderActivity.java:[][

] [
public class MailSenderActivity extends Activity {

    @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) {
                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:[][

] [
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");   
        }   
    }   
}  
] [

][]JSSEProvider.java:[][

] [
/*
 *  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;
            }
        });
    }
}
] [

]ADD 3 банки, расположенные по следующей ссылке на ваш Android-проект [

] [] [

][]Щелкните здесь - Как добавить внешние банки[][

] [

]И не забудьте добавить эту строку в ваш манифест:[

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

][]Просто щелкните по ссылке ниже, чтобы изменить доступ к аккаунту для менее безопасных приложений[] []https://www.google.com/settings/security/lesssecureapps[][

] [

]Запустите проект и проверьте аккаунт получателя почты на наличие почты. Будем здоровы![

] [

]P.S. И не забывайте, что вы не можете выполнять сетевые операции из любой активности в android. Поэтому рекомендуется использовать []AsyncTask[] или []IntentService[], чтобы избежать исключений сети на главном потоке.[

] [

]Jar файлы: []https://code.google.com/archive/p/javamail-android/[][

]
747
ответ дан 22 November 2019 в 21:51
поделиться

Без вмешательства пользователя вы можете отправить следующее:

  1. Отправить электронное письмо от клиента apk. Здесь mail.jar, Activation.jar требуется для отправки электронной почты Java. Если эти банки добавить, это может увеличить размер APK.

  2. В качестве альтернативы, вы можете использовать веб-сервис на стороне сервера, который будет использовать те же mail.jar и Activation.jar для отправки электронной почты. Вы можете позвонить в веб-сервис через asynctask и отправить электронное письмо. Обратитесь по той же ссылке.

(Но вам нужно будет знать учетные данные почтовой учетной записи)

3
ответ дан Nishanthi Grashia 22 March 2017 в 16:24
поделиться

Я нашел более короткую альтернативу для тех, кто нуждается в помощи. Код:

package com.example.mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailTLS {

    public static void main(String[] args) {

        final String username = "username@gmail.com";
        final String password = "password";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password");
            }
          });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from-email@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to-email@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

Источник: Отправка электронной почты через API JavaMail

Надеюсь, это поможет! Удачи!

6
ответ дан Shreshth Kharbanda 22 March 2017 в 16:24
поделиться

SMTP

Использование SMTP - это один из способов, а другие уже указали способы, как это сделать. Просто отметьте, что при этом вы полностью обойдете встроенное почтовое приложение и вам придется указать адрес SMTP-сервера, имя пользователя и пароль для этого сервера, либо статически в вашем коде, либо запросить его у пользователя. .

HTTP

Другой способ - использовать простой серверный скрипт, такой как php, который принимает некоторые параметры URL и использует их для отправки почты. Таким образом, вам нужно всего лишь сделать HTTP-запрос с устройства (это легко сделать с помощью встроенных библиотек) и не нужно хранить данные для входа в SMTP на устройстве. Это еще одно косвенное указание по сравнению с прямым использованием SMTP, но поскольку сделать запрос HTTP и отправлять почту из PHP очень легко, он может быть даже проще, чем прямой путь.

Почтовое приложение

Если письмо будет отправлено с учетной записи пользователя по умолчанию, которую он уже зарегистрировал в телефоне, вам придется использовать другой подход. Если у вас достаточно времени и опыта, вы можете проверить исходный код приложения электронной почты Android, чтобы узнать, предлагает ли оно какую-либо точку входа для отправки почты без взаимодействия с пользователем (я не знаю, но, возможно, есть такая).

Может быть, вы даже найдете способ запросить данные учетной записи пользователя (чтобы вы могли использовать их для SMTP), хотя я очень сомневаюсь, что это возможно, потому что это будет представлять огромную угрозу безопасности, а Android построен довольно надежно.

23
ответ дан Lena Schimmel 22 March 2017 в 16:24
поделиться

Спасибо за вашу ценную информацию. Код работает нормально. Я могу добавить вложение, добавив следующий код.

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);
69
ответ дан Bo Persson 22 March 2017 в 16:24
поделиться

Вы можете использовать JavaMail API для обработки вашего электронного письма задачи. JavaMail API доступен в пакете Javaee, а его банка доступна для загрузки. К сожалению, его нельзя использовать непосредственно в приложении Android, поскольку он использует компоненты AWT, которые полностью несовместимы в Android.

Вы можете найти порт Android для JavaMail в следующем расположении: http://code.google.com/p/javamail-android/

Добавьте банки в свое приложение и используйте метод SMTP

39
ответ дан 22 November 2019 в 21:51
поделиться

Не удалось подключиться к хосту SMTP: smtp.gmail.com, порт: 465

Добавьте эту строку в свой манифест:

<uses-permission android:name="android.permission.INTERNET" />
54
ответ дан 22 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: