它可能会发送一封电子邮件从我的 Java 应用程序使用 GMail 帐户吗?我已经将我公司的邮件服务器配置与 Java 应用程序来发送电子邮件,但不是会削减它时我分发应用程序。与任何使用 Hotmail、 Yahoo 或 GMail 的答案是可以接受的。

2008-09-05 19:23:00
问题评论:

回答:

第一次下载将 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%的完整答案的方式。

@varun︰ 这就是smtp.gmail.com的传出邮件服务器上的端口。有关详细信息,请参阅配置其他邮件客户端

我唯一获取 AuthenticationFailedException 的人这里 props.put ("mail.smtp.auth","真正的");如果真是字符串。如果它是一个布尔值,它是很好。

对于 SSL gmail 连接,请使用 props.put ("mail.smtp.port","465");而不是 587

请参阅关于使用 Session.getDefaultInstance(properties) 的oracle.com/technetwork/java/faq-135477.html#getdefaultinstance本常见问题解答建议改为使用 getInstance(..)。

我不能使用 SMTP gmail,使用上述和类似的代码来访问和已获得javax.mail.AuthenticationFailedException ,必须显式启用"不太安全中的应用程序"我 gmail 的设置︰ google.com/settings/security/lesssecureapps一旦启用了"不太安全的应用程序",该代码起作用

类似于 (听起来像您只需更改您的 SMTP 服务器)︰

String host = "smtp.gmail.com";
String from = "user name";
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", "asdfgh");
props.put("mail.smtp.port", "587"); // 587 is the port number of yahoo mail
props.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));

InternetAddress[] to_address = new InternetAddress[to.length];
int i = 0;
// To get the array of addresses
while (to[i] != null) {
    to_address[i] = new InternetAddress(to[i]);
    i++;
}
System.out.println(Message.RecipientType.TO);
i = 0;
while (to_address[i] != null) {

    message.addRecipient(Message.RecipientType.TO, to_address[i]);
    i++;
}
message.setSubject("sending in a group");
message.setText("Welcome to JavaMail");
// alternately, to send HTML mail:
// message.setContent("<p>Welcome to JavaMail</p>", "text/html");
Transport transport = session.getTransport("smtp");
transport.connect("smtp.mail.yahoo.co.in", "user name", "asdfgh");
transport.sendMessage(message, message.getAllRecipients());
transport.close();

是否有可能以 html 格式发送内容?如果我试着编写一些 html 代码并发送它,但在接收端,该电子邮件的内容是仅 html 代码。

发送 html 正文而不是明文形式更改此行︰ message.setText("Welcome to JavaMail");用下面这行︰ message.setContent("<h1>Hello world</h1>", "text/html");

这一缺少 ("mail.smtp.starttls.enable","真正的")

其他人可以很好回答,但我想要我这样做的经验上添加备注。我发现,当为我 webapp 作为出站 SMTP 服务器使用 Gmail,Gmail 只允许我发送响应反垃圾邮件的响应,我必须手动单步执行到重新启用 SMTP 访问之前大约 10 或这样的消息。我已发送的电子邮件不是垃圾邮件,但当我系统中的用户注册了网站"欢迎使用"电子邮件。因此,YMMV,和我不会依赖 Gmail 生产 webapp。如果要将电子邮件发送用户的代表,如安装桌面应用程序 (其中用户输入他们的 Gmail 凭据),您可能没有问题。

此外,如果您使用的春天,这里是一个工作配置 Gmail 用于出站 SMTP:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="host" value="smtp.gmail.com"/>
    <property name="port" value="465"/>
    <property name="username" value="${mail.username}"/>
    <property name="password" value="${mail.password}"/>
    <property name="javaMailProperties">
        <value>
            mail.debug=true
            mail.smtp.auth=true
            mail.smtp.socketFactory.class=java.net.SocketFactory
            mail.smtp.socketFactory.fallback=false
        </value>
    </property>
</bean>

谢谢张森,配置设置示例和出站邮件限制有关的警告。我已经永远不会遇到此限制之前,但我相信其他人会发现这些信息非常有用。

我想知道更多有关该垃圾邮件限制...我是否必须发送多个电子邮件,应拆分这些组中?等待指定的时间量?任何人都知道 google 邮件限制的详细信息?

即使关闭的这个问题,我想要发布一个计数器的解决方案,但现在使用的简单的 Java 邮件(打开源将 JavaMail smtp 包装)︰

final Email email = new Email();

String host = "smtp.gmail.com";
Integer port = 587;
String from = "username";
String pass = "password";
String[] to = {"to@gmail.com"};

email.setFromAddress("", from);
email.setSubject("sending in a group");
for( int i=0; i < to.length; i++ ) {
    email.addRecipient("", to[i], RecipientType.TO);
}
email.setText("Welcome to JavaMail");

new Mailer(host, port, from, pass).sendMail(email);
// you could also still use your mail session instead
new Mailer(session).sendMail(email);

我收到错误代码:"消息︰ 一般性错误︰ 530 5.7.0 必须首先发出 STARTTLS 命令"-如何启用 starttls 与 vesijama?

我收到"必须发出 STARTTLS 命令第一次"错误,因为在行下方有 isStartTlsEnabled 变量作为一个布尔值,改为一个字符串︰ props.put ("mail.smtp.starttls.enable",isStartTlsEnabled);

该应答︰ 若要使用 TLS,您可以执行类似new Mailer(your login / your session, TransportStrategy.SMTP_TLS).sendMail(email);

//set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class Mail
{
    String  d_email = "iamdvr@gmail.com",
            d_password = "****",
            d_host = "smtp.gmail.com",
            d_port  = "465",
            m_to = "iamdvr@yahoo.com",
            m_subject = "Testing",
            m_text = "Hey, this is the testing email using smtp.gmail.com.";
    public static void main(String[] args)
    {
        String[] to={"XXX@yahoo.com"};
        String[] cc={"XXX@yahoo.com"};
        String[] bcc={"XXX@yahoo.com"};
        //This is for google
        Mail.sendMail("venkatesh@dfdf.com", "password", "smtp.gmail.com", 
                      "465", "true", "true", 
                      true, "javax.net.ssl.SSLSocketFactory", "false", 
                      to, cc, bcc, 
                      "hi baba don't send virus mails..", 
                      "This is my style...of reply..If u send virus mails..");
    }

    public synchronized static boolean sendMail(
        String userName, String passWord, String host, 
        String port, String starttls, String auth, 
        boolean debug, String socketFactoryClass, String fallback, 
        String[] to, String[] cc, String[] bcc, 
        String subject, String text) 
    {
        Properties props = new Properties();
        //Properties props=System.getProperties();
        props.put("mail.smtp.user", userName);
        props.put("mail.smtp.host", host);
        if(!"".equals(port))
            props.put("mail.smtp.port", port);
        if(!"".equals(starttls))
            props.put("mail.smtp.starttls.enable",starttls);
        props.put("mail.smtp.auth", auth);
        if(debug) {
            props.put("mail.smtp.debug", "true");
        } else {
            props.put("mail.smtp.debug", "false");         
        }
        if(!"".equals(port))
            props.put("mail.smtp.socketFactory.port", port);
        if(!"".equals(socketFactoryClass))
            props.put("mail.smtp.socketFactory.class",socketFactoryClass);
        if(!"".equals(fallback))
            props.put("mail.smtp.socketFactory.fallback", fallback);

        try
        {
            Session session = Session.getDefaultInstance(props, null);
            session.setDebug(debug);
            MimeMessage msg = new MimeMessage(session);
            msg.setText(text);
            msg.setSubject(subject);
            msg.setFrom(new InternetAddress("p_sambasivarao@sutyam.com"));
            for(int i=0;i<to.length;i++) {
                msg.addRecipient(Message.RecipientType.TO, 
                                 new InternetAddress(to[i]));
            }
            for(int i=0;i<cc.length;i++) {
                msg.addRecipient(Message.RecipientType.CC, 
                                 new InternetAddress(cc[i]));
            }
            for(int i=0;i<bcc.length;i++) {
                msg.addRecipient(Message.RecipientType.BCC, 
                                 new InternetAddress(bcc[i]));
            }
            msg.saveChanges();
            Transport transport = session.getTransport("smtp");
            transport.connect(host, userName, passWord);
            transport.sendMessage(msg, msg.getAllRecipients());
            transport.close();
            return true;
        }
        catch (Exception mex)
        {
            mex.printStackTrace();
            return false;
        }
    }

}

给我类似 php 代码...

请输入您的翻译

How can I send an email by Java application using GMail, Yahoo, or Hotmail?

确认取消