是否可以使用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相关问答推荐

填写文本字段后锁定PDF

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

获取字符串中带空格的数字和Java中的字符

这是什么Java构造`(InputStream Is)->;()->;{}`

相同的Java SerializedLambda为implMethodKind返回不同的结果

从Spring5迁移到Spring6:无法在雅加达包中找到类

Java流传输一个列表并创建单个对象

无法在Java中处理PayPal支付响应

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

搜索列表返回多个频道

舰队运行配置Maven版本

Java类型推断:为什么要编译它?

Java 17与Java 8双重表示法

在单例类上获取Java锁,了解原因

Java返回生成器的实现

java.exe如何执行java源代码?

在外部类和内部类之间,当调用外部类内部或外部的主方法时,它们的静态初始化程序的运行顺序不同

睡眠在 Spring Boot 中

Mapstruct 找不到产品映射器的实现