是否可以使用GMail帐户从我的Java应用程序发送邮箱?我已经用Java应用程序配置了我公司的邮件服务器来发送邮箱,但当我发布应用程序时,这并不能阻止它.任何使用Hotmail、雅虎或GMail的答案都是可以接受的.

推荐答案

首先下载JavaMail API并确保相关的JAR文件在您的类路径中.

下面是使用Gmail的完整工作示例.

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

    private static String USER_NAME = "*****";  // GMail user name (just the part before "@gmail.com")
    private static String PASSWORD = "********"; // GMail password
    private static String RECIPIENT = "lizard.bill@myschool.edu";

    public static void main(String[] args) {
        String from = USER_NAME;
        String pass = PASSWORD;
        String[] to = { RECIPIENT }; // list of recipient email addresses
        String subject = "Java send mail example";
        String body = "Welcome to JavaMail!";

        sendFromGMail(from, pass, to, subject, body);
    }

    private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {
        Properties props = System.getProperties();
        String host = "smtp.gmail.com";
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password", pass);
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props);
        MimeMessage message = new MimeMessage(session);

        try {
            message.setFrom(new InternetAddress(from));
            InternetAddress[] toAddress = new InternetAddress[to.length];

            // To get the array of addresses
            for( int i = 0; i < to.length; i++ ) {
                toAddress[i] = new InternetAddress(to[i]);
            }

            for( int i = 0; i < toAddress.length; i++) {
                message.addRecipient(Message.RecipientType.TO, toAddress[i]);
            }

            message.setSubject(subject);
            message.setText(body);
            Transport transport = session.getTransport("smtp");
            transport.connect(host, from, pass);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
        catch (AddressException ae) {
            ae.printStackTrace();
        }
        catch (MessagingException me) {
            me.printStackTrace();
        }
    }
}

当然,您希望在catch个块中执行更多操作,而不是像我在上面的示例代码中所做的那样打印堆栈跟踪.(删除catch个块可以查看JavaMail API中的哪些方法调用抛出异常,这样您就可以更好地了解如何正确处理它们.)


感谢@jodonnel人和其他所有回答的人.我要赏金给他,因为他的回答让我走了大约95%的路,得到了一个完整的答案.

Java相关问答推荐

为什么从 Java 代码中提取 SQL Server 序列时会跳两个?

Jpa阅读器Spring Batch

如何将具有相同键但不同值的多个 map 合并到一个 map 中

调用方法以try 并重新运行代码块

任务':app:compileDebugJavaWithJavac'失败

是否有 C++ 中首选的构建器模式的替代方案?

如何通过在 Java for Android 中以编程方式添加的 id 来获取组件

Do...while 在输入验证中不起作用

如何将二维数组收集到 Map> 中?

有没有更好的方法使用枚举来做到这一点?

如何为 JDK 17 编写 Github 工作流

Jolt 变换 Json 数组保留其余字段

为什么 RecyclerView 在其余 Kotlin Android 之前加载

如何通过 SnowSQL 或 Java 函数将十六进制“F933F177”转换为十进制 -114.036361?

如何用填充零计算整数

使用溢出和循环在 C 中查找最大值

查找有向图中的所有循环,包括后边

空手道:使用 JUnit5 的 run 者课程

JMS setRollbackOnly - 不一致的行为

错误需要找不到类型为“XXX”的 bean