【问题标题】:Send Mail via Java Api for Office 365通过适用于 Office 365 的 Java Api 发送邮件
【发布时间】:2020-08-07 22:24:43
【问题描述】:

您好,我目前正在开发 java 应用程序,它将通过 Java Mail Api(1.6.2) 向多个收件人发送邮件,我已经根据 Microsoft docs 配置了 SMTP 问题是代码正在使用我的个人 hotmail 电子邮件 ID,但是公司办公室 365 帐户失败。

错误:javax.mail.AuthenticationFailedException: 535 5.7.3 身份验证不成功 [PN1PR0101CA0066.INDPRD01.PROD.OUTLOOK.COM]

POP 和 IMAP 正在工作(接收邮件),我可以在 Office 365 Web 中使用密码登录,我也尝试过更改密码。

代码:

User user = Credentials.ACC;
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.office365.com");//outlook.office365.com
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");//25
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.transport.protocol", "smtp");
//props.put("mail.smtp.ssl.enable", true);

Session session = Session.getInstance(props, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user.getUsername(), user.getPassword());
    }
});
session.setDebug(true);

try {
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(user.getUsername());

    msg.setRecipients(Message.RecipientType.TO,
            "some@mail.com");
    msg.setSubject("Testing SMTP using [" + user.getUsername() + "]");
    msg.setSentDate(new Date());
    msg.setText("Hey, this is a test from [" + user.getUsername() + "], Sending via Java Mail API");

    Transport.send(msg);
    System.out.println("Sent Ok");
} catch (MessagingException e) {
    System.out.println("Something went wrong");
    e.printStackTrace();
}

【问题讨论】:

  • 首先通过修复这些common mistakes 来简化您的代码。您是否使用与 Web UI 相同的用户名?可以配置 Thunderbird 使用相同的用户名和密码登录吗?
  • 是的,我使用与网络相同的用户名,而在 Thunderbird 中,它提供了 SSL/TLS 错误

标签: java outlook smtp office365 jakarta-mail


【解决方案1】:
public class EWS {

    private static ExchangeService service;
    private static Integer NUMBER_EMAILS_FETCH = 5; // only latest 5 emails/appointments are fetched.

    static {
        try {
            service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
            service.setUrl(new URI("https://outlook.office365.com/EWS/exchange.asmx"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Initialize the Exchange Credentials.
     */
    public EWS() throws Exception {
         ExchangeCredentials credentials = new WebCredentials("User Name", "Password");
        service.setCredentials(credentials);
    }

     /**
     * Reading one email at a time. Using Item ID of the email. Creating a
     * message data map as a return value.
     */
    public Map readEmailItem(ItemId itemId) {
        Map messageData = new HashMap();
        try {
            Item itm = Item.bind(service, itemId, PropertySet.FirstClassProperties);
            EmailMessage emailMessage = EmailMessage.bind(service, itm.getId());
            messageData.put("emailItemId", emailMessage.getId().toString());
            messageData.put("subject", emailMessage.getSubject());
            messageData.put("fromAddress", emailMessage.getFrom().getAddress());
            messageData.put("senderName", emailMessage.getSender().getName());
            Date dateTimeCreated = emailMessage.getDateTimeCreated();
            messageData.put("SendDate", dateTimeCreated.toString());
            Date dateTimeRecieved = emailMessage.getDateTimeReceived();
            messageData.put("RecievedDate", dateTimeRecieved.toString());
            messageData.put("Size", emailMessage.getSize() + "");
            messageData.put("emailBody", emailMessage.getBody().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return messageData;
    }
    /**
     * Number of email we want to read is defined as NUMBER_EMAILS_FETCH,
     */
    public List<Map> readEmails() {
        List<Map> msgDataList = new ArrayList<>();
        try {
            service.setTraceEnabled(true);
            System.out.println("|---------------------> service = {}" + service);
            Folder folder = Folder.bind(service, WellKnownFolderName.Inbox);
            FindItemsResults<Item> results = service.findItems(folder.getId(), new ItemView(NUMBER_EMAILS_FETCH));
            int i = 1;
            for (Item item : results) {
                Map messageData = readEmailItem(item.getId());
                System.out.println("|---------------------> service = {}" + (i++) + ":");
                System.out.println("|---------------------> service = {}" + messageData.get("subject").toString());
                System.out.println("|---------------------> service = {}" + messageData.get("senderName").toString());
                msgDataList.add(messageData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return msgDataList;
    }
    public static void main(String[] args) throws Exception {
        EWS msees = new EWS();
        List<Map> emails = msees.readEmails();
        System.out.println("|---------------------> service = {}" + emails.size());
    }
}

【讨论】:

  • 最好在答案周围添加一些细节。
【解决方案2】:

在以下位置禁用 STMP 的现代身份验证:

https://admin.microsoft.com/Adminportal/Home?source=applauncher#/Settings/Services/:/Settings/L1/ModernAuthentication

等待几分钟以测试进行这些更改。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2019-12-22
    • 1970-01-01
    • 2021-12-09
    • 2015-06-10
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多