首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用JAVA通过gmail smtp服务器发送电子邮件

用JAVA通过gmail smtp服务器发送电子邮件
EN

Stack Overflow用户
提问于 2013-03-24 18:59:35
回答 4查看 85.5K关注 0票数 16

这段代码有什么问题?不知何故,它在Transport.send(message);行进入了一个无限循环,没有错误消息,没有异常,只是可能是无限循环(我不知道,因为我等待的时间不超过5-10分钟)

代码语言:javascript
运行
复制
final String username = "<mail_name>";
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", "465");

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("<mail_from>@gmail.com"));
    message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("<mail_to>@gmail.com"));
    message.setSubject("Test Subject");
    message.setText("Test");

    Transport.send(message);

    System.out.println("Done");

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-24 20:04:51

这里我给出了一些更改,这些更改对我来说很好:

代码语言:javascript
运行
复制
Session session = Session.getInstance(props,null);

您可以像以前一样实例化message对象。最后:

代码语言:javascript
运行
复制
Transport transport = session.getTransport("smtp");
String mfrom = "yourGmailUsernameWithout@"// example laabidiraissi 
transport.connect("smtp.gmail.com", mfrom, "thepassword");
transport.sendMessage(message, message.getAllRecipients());

编辑,请您帮我个忙,复制/粘贴并尝试此示例,并显示它显示的内容:

代码语言:javascript
运行
复制
package com.test;

import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.junit.Test;

public class EmailService {

@Test
public void test(){
    Properties props = System.getProperties();
    props.put("mail.smtp.starttls.enable", true); // added this line
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.user", "username");
    props.put("mail.smtp.password", "password");
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", true);



    Session session = Session.getInstance(props,null);
    MimeMessage message = new MimeMessage(session);

    System.out.println("Port: "+session.getProperty("mail.smtp.port"));

    // Create the email addresses involved
    try {
        InternetAddress from = new InternetAddress("username");
        message.setSubject("Yes we can");
        message.setFrom(from);
        message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail"));

        // Create a multi-part to combine the parts
        Multipart multipart = new MimeMultipart("alternative");

        // Create your text message part
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setText("some text to send");

        // Add the text part to the multipart
        multipart.addBodyPart(messageBodyPart);

        // Create the html part
        messageBodyPart = new MimeBodyPart();
        String htmlMessage = "Our html text";
        messageBodyPart.setContent(htmlMessage, "text/html");


        // Add html part to multi part
        multipart.addBodyPart(messageBodyPart);

        // Associate multi-part with message
        message.setContent(multipart);

        // Send message
        Transport transport = session.getTransport("smtp");
        transport.connect("smtp.gmail.com", "username", "password");
        System.out.println("Transport: "+transport.toString());
        transport.sendMessage(message, message.getAllRecipients());


    } catch (AddressException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
票数 20
EN

Stack Overflow用户

发布于 2013-03-25 07:40:34

好的。它比我第一次接触到的要复杂一点…总结一下我得到的:

  • 有一个非常有用的命令:session.setDebug(true);.如果设置为true,则每个重要进程都将被调试到控制台。我推荐使用它。
  • 第二台计算机只能使用安全选项,你可以用:Transport transport = session.getTransport("smtps");而不是非安全的smtp...JavaMail接口传输对象还将负责端口(分别为smtp: 587、smtps: 465)
  • 您也可以使用Transport类的静态方法发送消息,(之前保存它,非静态sendMessage方法不会保存消息),但这次您需要在创建会话时使用javax.mail.Authenticator,如下所示:

会话=Session.getInstance(属性,新的javax.mail.Authenticator() {受保护的PasswordAuthentication getPasswordAuthentication() {返回新的PasswordAuthentication(“PasswordAuthentication”,"password");}

});

1.4.2 JavaMailApi在此问题上比1.4.7版本有另一个例外...

如果不使用它,就不能使用静态方法进行身份验证。如果您使用实例方法,则可以。

  • One computer已经获得了1.4.2版本的JavaMail应用编程接口。第二台电脑有一个下载库,版本是1.4.7,我猜它也搞乱了things
  • First comp Netbeans,Second comp Intellij...+1)互联网上有很多旧的、糟糕的示例代码,这使得正确使用这个接口变得更加困难。

所以相当混乱,但有一些基本的概念应该重点关注……

票数 3
EN

Stack Overflow用户

发布于 2013-03-24 20:27:06

我可以重现你问题中描述的行为并修复它。

send方法停滞在

代码语言:javascript
运行
复制
SMTPTransport(Service).connect(String, int, String, String) line: 308   

连接不成功,因为gmail smtp主机的端口错误:465

将其更改为587

代码语言:javascript
运行
复制
props.put("mail.smtp.port", "587");

它会起作用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15597616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档