Table of Content
            
                
  
            
        
        
        
        偶然看到一个讨论, 需求很简单, 单纯的 SMTP 邮件发送。
这样的话我想 Python 应该是一个不错的选择, 那么首先我们需要写一个 Python 程序, 我们将它保存为 mail.py:
import os
import smtplib
import json
from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.Utils import COMMASPACE, formatdate
def send_mail(account, pwd, recipients, subject, body, attachments=[]):
  assert type(recipients) == list
  assert type(attachments) == list
  mult = MIMEMultipart()
  mult['From'] = account
  mult['To'] = COMMASPACE.join(recipients)
  mult['Date'] = formatdate(localtime=True)
  mult['Subject'] = subject
  mult.attach(MIMEText(body))
  for f in attachments:
    part = MIMEBase('application', "octet-stream")
    part.set_payload( open(f,"rb").read() )
    Encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
    mult.attach(part)
  # 这里是 QQ 邮箱, 如果你需要用其他邮箱发送, 修改这里
  smtp = smtplib.SMTP("smtp.qq.com", 587)
  smtp.ehlo()
  smtp.starttls()
  smtp.ehlo()
  smtp.login(account, pwd)
  smtp.sendmail(account, recipients, mult.as_string())
  smtp.close()
send_mail(*COCOA_MESSAGE)
其中发信服务器我使用了 smtp.qq.com:587。QQ 邮箱的 SMTP 服务需要在其设置中开启, 你可能还需要生成一个授权码。
接着需要在 Xcode 中导入 Python.framework, 新建一个类:
+ (NSInteger)sendMessageFrom:(NSString *)account
                    password:(NSString *)password
                     subject:(NSString *)subject
                        body:(NSString *)body
                  recipients:(NSArray *)recipients
                 attachments:(NSArray *)attachments {
    NSArray *jsonData = @[account, password, recipients, subject, body, attachments];
    NSURL *codePath = [[NSURL URLWithString:[[NSBundle mainBundle] resourcePath]] URLByAppendingPathComponent:@"mail.py"];
    NSString *pythonCode = [NSString stringWithContentsOfFile:[codePath absoluteString] encoding:NSUTF8StringEncoding error:nil];
    pythonCode = [pythonCode stringByReplacingOccurrencesOfString:@"COCOA_MESSAGE" withString:[jsonData JSONRepresentation]];
    Py_Initialize();
    NSInteger failure = PyRun_SimpleString([pythonCode UTF8String]);
    Py_Finalize();
    return failure;
}
其中接受者和附件均为列表, 其他内容为字符串即可。附件为空时传入空列表。
现在我们来测试一下吧:
NSArray <NSString *>* attachments = @[@"/Users/Meniny/Desktop/LICENSE", @"/Users/Meniny/Desktop/LICENSE"];
NSInteger failure = [PythonMail sendMessageFrom:@"8382453@qq.com"
                                       password:@"usaudjewmhfrg"
                                        subject:"Send Mail via Python in Cocoa"
                                           body:"Testing Mail Body"
                                     recipients:@"meniny@qq.com"
                                    attachments:attachments];
if (!failure) {
    [NSUserNotification notificationMessage:@"Success" informative:@"Main was send successfully" image:nil soundName:nil delegate:nil];
} else {
    [NSUserNotification notificationMessage:@"Failure" informative:@"Failed to send E-mail" image:nil soundName:nil delegate:nil];
}
{% assign sending = 'https://ooo.0o0.ooo/2017/04/27/5901677df1131.jpg' %}
 李二狗 — @Meniny
                李二狗 — @Meniny
             
            
             
            
             
            
             
                 
                