Python中如何通过win32选择指定邮件账户发送邮件

通过 win32 可以发送邮件,但是好像不可以制定邮件账户,找了一圈发现可以通过SentOnBehalfOfName来发送邮件:

def send_email():
    obj = client.Dispatch('Outlook.Application')
    new_mail = obj.CreateItem(0)
    new_mail.SentOnBehalfOfName= '[email protected]'
    new_mail.Subject = 'test'
    new_mail.display()

但发觉发送的时候不能发送,发送会失败,错误提醒如下: 您不能代表其他发件人发送邮件,除非您有权这样做。请确认您是否代表正确的发件人发送邮件,或请求所需的权限。如果问题仍然存在,请与支持人员联系。 不知道大家有没有更完美的解决方案


Python中如何通过win32选择指定邮件账户发送邮件

3 回复
import win32com.client

def send_email_via_specific_account(account_name, recipient, subject, body):
    """
    通过指定Outlook账户发送邮件
    
    参数:
        account_name: Outlook中显示的账户名称(如"user@company.com")
        recipient: 收件人邮箱地址
        subject: 邮件主题
        body: 邮件正文
    """
    try:
        # 创建Outlook应用实例
        outlook = win32com.client.Dispatch("Outlook.Application")
        
        # 创建新邮件
        mail = outlook.CreateItem(0)  # 0表示olMailItem
        
        # 设置邮件基本信息
        mail.To = recipient
        mail.Subject = subject
        mail.Body = body
        
        # 获取所有账户并选择指定账户
        accounts = outlook.Session.Accounts
        target_account = None
        
        for account in accounts:
            if account.DisplayName == account_name:
                target_account = account
                break
        
        if target_account:
            # 使用指定账户发送
            mail.SendUsingAccount = target_account
            mail.Send()
            print(f"邮件已通过账户 '{account_name}' 发送成功")
        else:
            print(f"未找到账户: {account_name}")
            print(f"可用账户: {[acc.DisplayName for acc in accounts]}")
            
    except Exception as e:
        print(f"发送邮件时出错: {str(e)}")

# 使用示例
if __name__ == "__main__":
    # 替换为你的实际账户名(在Outlook中显示的完整邮箱地址)
    my_account = "your.email@example.com"
    
    send_email_via_specific_account(
        account_name=my_account,
        recipient="recipient@example.com",
        subject="测试邮件",
        body="这是一封通过指定账户发送的测试邮件。"
    )

核心要点:

  1. 使用win32com.client.Dispatch("Outlook.Application")连接Outlook
  2. 通过outlook.Session.Accounts获取所有已配置账户
  3. 遍历账户列表匹配DisplayName找到目标账户
  4. 设置邮件的SendUsingAccount属性指定发送账户

注意:账户名称必须是Outlook中显示的完整邮箱地址,运行前确保Outlook已登录且账户配置正确。

一句话建议:确保账户名称与Outlook中显示的完全一致。


准确来说这不是 Win32 的功能而是 Outlook 的功能。

当然不能直接改名发邮件,要服务器允许才可以吧?不然就很容易冒充大公司了呀。

回到顶部