代码之家  ›  专栏  ›  技术社区  ›  Tung Duong

如何通过javax.mail和smtp从android发送电子邮件

  •  1
  • Tung Duong  · 技术社区  · 7 年前

    我正在使一个应用程序具有通过SMTP协议从应用程序发送电子邮件的功能。 我想让它在后台从应用程序发送电子邮件,而不是使用意图发送其他邮件应用程序。 我在谷歌上搜索有一些建议 javax.mail .

    我有带信息的SMTP服务器:主机、端口、用户名、密码。

    如何使用javax.mail通过包含HTML的SMTP将电子邮件发送给收件人/收件人,电子邮件也附加了文件。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   shimatai    7 年前

    如果你想用 javax.mail 发送电子邮件。您可以使用以下助手类发送电子邮件。不管它是由后台服务发送的,还是由异步任务发送的。看看下面这个类中的配置部分。

    package com.company.mail.util;
    
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.mail.Message;
    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;
    
    import org.apache.commons.lang.ArrayUtils;
    import org.apache.commons.lang.StringUtils;
    
    public class Mail {
        public static final String EMAIL_LIST_SEPARATOR = ",";
    
        public boolean sendMail(String[] toEmails, String subject, String msg, boolean isHTML, String charSet, String filename, byte[] attachment) {
        if (toEmails == null || (toEmails != null && toEmails.length == 0))  return false;
    
        String name = "My Company Name";
        String username = "no-reply@company.com"; 
        String password = "<My Password>"; 
        String host = "smtp.company.com";
        Integer port = 465;
        String from = "no-reply@company.com";
    
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.socketFactory.port", port.toString());
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", port.toString());
    
        final String fUsername = username;
        final String fPassword = password;
        Session mailSession = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(fUsername, fPassword);
            }
        });
        //mailSession.setDebug(true);
    
        String recipients = ArrayUtils.toString(toEmails, "");
        Message message = new MimeMessage(mailSession);
        try {
            message.setFrom(new InternetAddress(from, name));
            message.setReplyTo(new InternetAddress[] { new InternetAddress(from, name) });
            message.setSubject(subject);
            message.setContent(msg, isHTML ? "text/html" : "text/plain");
    
            if (toEmails != null) {
                for (String recipient : toEmails) {
                    if (recipient != null && !"".equals(recipient)) {
                        message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
                    }
                }
    
                if (attachment != null) {
                    MimeBodyPart messagePart = new MimeBodyPart();
                    if (isHTML)
                        messagePart.setContent(msg, "text/html");
                    else
                        messagePart.setText(msg);
    
                    MimeBodyPart attachmentPart = new MimeBodyPart();
                    attachmentPart.setDataHandler(new DataHandler(attachment, "application/octet-stream"));
                    attachmentPart.setFileName(filename);
    
                    Multipart multipart = new MimeMultipart();
                    multipart.addBodyPart(messagePart);
                    multipart.addBodyPart(attachmentPart);
    
                    message.setContent(multipart);
                }
    
                Transport.send(message);
                Log.i(" [Mail] Recipient " + name + " <" + username + "> sent e-mail with subject " + subject + " to recipient(s): " + recipients);
    
                return true;
            }
        } catch (Exception e) {
            Log.e(" [Mail] Error sending " + toEmails.length  + " e-mail(s) with subject '" + subject + "' to recipient(s) (" + recipients + "): " + e.getMessage());
        }
    
        return false;
        }
    }
    

    您可以发送电子邮件调用该方法 mail.sendMail(...) 例如:

    Mail mail = new Mail();
    mail.sendMail(new String[] { "someone@somewhere.com", "john.doe@mycompany.com" }, "Subject of my e-mail", "This is a message in <b>HTML</b> with <i>italics</i>.", true, "UTF-8", null, null);
    

    此类还支持将附件发送到邮件,因此您将文件名和字节数组作为最后两个参数传递。

    希望这个Java类能帮助你。